java小东西合集

java UDP通信

NOVEMBER 16, 2017
UDP是一种面向无连接的协议,因此,在通信时发送端和接收端不用建立连接

InetAddress类

网络通信少不了ip地址,jdk提供的InetAddress类,他封装了ip地址,提供了ip地址相关的方法

常用方法 方法作用
InetAddress getByName(String host) 参数host表示指定的主机,该方法用于在给定主机名的情况下确定主机的ip地址
InetAddress getLocalHost() 创建一个表示本地主机的InetAddress对象
String getHostName() 得到ip地址的主机名,如果是本机则是计算机名,不是本机则是主机名,如果没有域名则是ip地址
boolean isReachable(int timeout) 判断指定时间是否能到达
String getHostAddress() 得到字符串格式的原始ip地址

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.net.InetAddress;
public class Example01 {
public static void main(String[] args) throws Exception {
InetAddress localAddress = InetAddress.getLocalHost();
InetAddress remoteAddress = InetAddress.getByName("xwmdream.cn");
System.out.println("本机的IP地址:" + localAddress.getHostAddress());
System.out.println("itcast的IP地址:" + remoteAddress.getHostAddress());
System.out.println("3秒是否可达:" + remoteAddress.isReachable(3000));
System.out.println("xwmdream.cn的主机名为:" + remoteAddress.getHostName());
}
}
/*本机的IP地址:192.168.0.101
xwmdream.cn的IP地址:123.206.30.139
3秒是否可达:true
xwmdream.cn的主机名为:xwmdream.cn*/

UDP通信

UDP通信过程就像是物流公司再发货一样,快递点发送和接受的时候都要用包裹来装载物品,UDP也是一样的,发送和接受数据时候也需要”集装箱”进行打包.为此,jdk提供了两个类:DatagramPacket(包裹),DatagramSocket(快递点)

DatagramPacket类

构造方法 方法含义
DatagramPacket(byte[] buf,int length) 指定了封装数据的字节数组和数据的大小,没有指定ip地址和端口号.所以只能用于接受数据,不能用于发送数据
DatagramPacket(byte[] buf,int length,InetAddress addr,int port) 不仅制订了字节数组和数据大小,还制定了数据包的目标ip地址和端口号,可以用于发送,见最后补充
DatagramPacket(byte[] buf,int offset,int length) 这个构造方法和第一个构造方法类似,同样用于接收端,只不过多加了一个offset参数,用于置顶接收到数据放在buf缓冲数组是从offset开始的
DatagramPacket(byte[] buf,int offset,int length,InetAddress addr,int port) 和第二个类似,offset参数和第三个类似

补充,UDP发送数据就像快递发送包裹一样,发送的时候要注明收货人的地址电话,就像第2,4个构造方法一样,有InetAddress参数,是接收者的ip地址信息,所以第2,4构造方法用于发送端,第1,3用于接收端

方法声明 方法含义
InetAddress getAddress() 用于返回接收端或者发送端的ip地址,如果是发送端的对象,就返回接收端的ip地址,反之就返回发送端的ip地址
int getPort() 返回发送端或者接收端的端口号
byte[] getData() 返回用于发送或者要接收的数据
int getLength() 返回将要发送或者接收的数据的长度

DatagramSocket类

要想发送出去数据光有”包裹”是不够的,DatagramSocket类相当于”快递点”

构造方法 方法含义
DatagramSocket() 创建一个发送端对象,系统会自动指定一个没有被使用的端口进行监听
DatagramSocket(int port) 创建一个对象,可以用于发送或者接受,port参数是监听的端口
DatagramSocket(int port,InetAddress addr) 不仅指定了端口号,还指定了ip地址,用于多块网卡的情况
基本方法 方法含义
void receive(DatagramPacket p) 能够把接收到的方法填充到DatagramPacket 数据包中,在接受到数据之前一直处于阻塞状态,接收到数据包才回返回
void send(DatagramPacket p) 用于发送DatagramPacket数据包,发送的数据包含将要发送的数据,数据的长度,接收者的ip地址和端口号
void close() 关闭当前Socket,释放资源

接收端程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
import java.net.*;
public class Serve {
public static void main(String[] args) throws Exception {
byte[] b=new byte[1024];//创建一个长度1024的字节数组,用于接收数据
DatagramPacket dp=new DatagramPacket(b,1024);//创建一个DatagramPacket对象,用于接受数据
DatagramSocket ds = new DatagramSocket(6666);//创建一个DatagramSocket对象,并且监听6666端口
System.out.println("等待接受数据");
ds.receive(dp);//DatagramSocket对象的receive方法等待接受数据,如果没收到则处于阻塞状态
String str=new String(dp.getData(),0,dp.getLength())+"来自"+dp.getAddress().getHostAddress()+"的"+dp.getPort()+"端口";//打印接收到的数据
System.out.println(str);//打印接收到的数据
ds.close();//释放资源
}
}

发送端程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
import java.net.*;
import java.util.Scanner;
public class Socker {
public static void main(String[] args) throws Exception {
String ans="你好世界";//要发送的数据
//创建一个datagramPacket的对象,也就是一个"包裹",包含发送数据的字节数组,发送数据的长度,发送目标的ip地址,和发送目标的端口号,6666端口号是接收端坚挺的 端口号
DatagramPacket dp=new DatagramPacket(ans.getBytes(),ans.getBytes().length,InetAddress.getByName("localhost"),6666);

DatagramSocket ds = new DatagramSocket(7777);//创建DatagramSocket监听7777端口
ds.send(dp);//DatagramSocket将"包裹"发送出去
ds.close();//释放资源
}
}

接收端运行结果:
等待接受数据
你好世界来自127.0.0.1的7777端口

java实现复制内容到剪贴板

OCTOBER 11, 2017
转自 http://blog.csdn.net/yangymy/article/details/71172589

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
public class ClipBoardUtil {
public static void main(String[] args) {
setSysClipboardText("复制的内容");
}
/**
* 将字符串复制到剪切板。
*/
public static void setSysClipboardText(String writeMe) {
Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
Transferable tText = new StringSelection(writeMe);
clip.setContents(tText, null);
}
}

java 实现拖动文件到窗口功能

OCTOBER 11, 2017
转自:java 实现拖动文件到窗口功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package ads;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.datatransfer.DataFlavor;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetAdapter;
import java.awt.dnd.DropTargetDropEvent;
import java.io.File;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Tuo extends JFrame{
JPanel jp1;
public Tuo()
{

jp1 =new JPanel();
jp1.setBackground(Color.yellow);
getContentPane().add(jp1,BorderLayout.CENTER);
setSize(500,200);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocation(400,200);
setTitle("tuozhuai");
drag();
}
public static void main(String[] args) {
new Tuo().setVisible(true);

}
public void drag()
{
new DropTarget(jp1,DnDConstants.ACTION_COPY_OR_MOVE,new DropTargetAdapter()
{
@Override
public void drop(DropTargetDropEvent dtde)
{
try{
if(dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
{
dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
List<File>list=(List<File>)(dtde.getTransferable().getTransferData(DataFlavor.javaFileListFlavor));
String temp="";
for(File file:list)
{
temp+=file.getAbsolutePath()+";\n";
JOptionPane.showMessageDialog(null, temp);
dtde.dropComplete(true);
}
}
else
{
dtde.rejectDrop();
}
}catch(Exception e){e.printStackTrace();}
}
});
}
}

实现效果:

图片丢失
图片丢失