UDP socket
这种信息传输方式相当于传真,信息打包,在接受端准备纸。
特点:
1) 基于UDP无连接协议
2) 不保证消息的可靠传输
3) 它们由Java技术中的DatagramSocket和DatagramPacket类支持
DatagramSocket(邮递员):对应数据报的Socket概念,不需要创建两个socket,不可使用输入输出流。
DatagramPacket(信件):数据包,是UDP下进行传输数据的单位,数据存放在字节数组中,其中包括了目标地址和端口以及传送的信息(所以不用建立点对点的连接)。
DatagramPacket的分类:
用于接收:
DatagramPacket(byte[] buf, int length)
DatagramPacket(byte[] buf, int offset,int length)
用于发送:
DatagramPacket(byte[] buf, int length, InetAddress address,int port )
DatagramPacket(byte[] buf, int offset, int length, InetAddress address,int port)
注:InetAddress类网址用于封装IP地址
没有构造方法,通过
InetAddress.getByAddress(byte[] addr):InetAddress
InetAddress.getByName(String host):InetAddress
UDP Server步骤
1、创建“信箱”:创建一个DatagramSocket(port)
2、创建“收信封”:创建一个DatagramPacket(buffer,len) buffer数组 len长度
3、接收数据:receive(DatagramPacket)
4、获取发信者的地址、端口
5、创建“发信封”:创建一个DatagramPacket(buffer,length,clientAddress,clientPort)
6、发送数据:send
UDP Client步骤
1、创建“信箱”:创建一个DatagramSocket(port) port可以跟Server的不一样
2、创建“发信封”:创建一个DatagramPacket(buffer,len,Serveraddr,serverport)
3、发送数据:send
4、创建“收信封”:创建一个DatagramPacket(buffer,len)
5、接收数据:receive
server:
DatagramSocket ds=null;
DatagramPacket packetIn;
DatagramPacket packetOut;
byte[] bufferIn=new byte[128];
try {
//1、创建信箱
ds=new DatagramSocket(8080);
while(true){
//2、创建收信封
packetIn=new DatagramPacket(bufferIn, bufferIn.length);
//3、收信
ds.receive(packetIn);
//4、对收到的数据做处理
String str=new String(bufferIn);
str=str.toUpperCase();
//5、创建发信封
packetOut=new DatagramPacket(str.getBytes(),str.getBytes().length,packetIn.getAddress(),packetIn.getPort());
//6、发信
ds.send(packetOut);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if(ds!=null)ds.close();
}
client:
byte[] buffer;
byte[] bufferIn=new byte[128];
DatagramSocket ds=null;
DatagramPacket packetOut;
DatagramPacket packetIn;
try {
//1、创建信箱
ds=new DatagramSocket(9090);
//获取要发送的数据
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String str=br.readLine();
buffer=str.getBytes();
//2、创建发信封
packetOut=new DatagramPacket(buffer,buffer.length,InetAddress.getByName("127.0.0.1"),8080);
//3、发信
ds.send(packetOut);
//4、创建收信封
packetIn=new DatagramPacket(bufferIn,buffer.length);
//5、接收数据
ds.receive(packetIn);
System.out.println(new String(bufferIn,0,buffer.length));
} catch (Exception e) {
e.printStackTrace();
} finally{
if(ds!=null)ds.close();
}