UDP协议简介
UDP是一种无连接的通信协议,提供不可靠的信息传输服务,该协议工作于计算机网络中的传输层。
由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息。
UDP协议的主要作用是将网络数据流量压缩成数据包形式。
.UDP提供了无连接通信,且不对传送数据包进行可靠性保证,适合于一次传输少量数据,UDP传输的可靠性由应用层负责。
UDP通信流程
由于udp是无连接的通信,所以通信过程中不需要像TCP协议中的监听(listen),接待(accept)。
下面是一个基于java语言实现的UDP通信模型
package com.server;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/*
* * Udp多线程回射服务器
*/
class UdpServerThread extends Thread{
private DatagramSocket socket;
//private byte[] infoBytes;
String info = null;
private int port;
InetAddress ip;
public UdpServerThread(DatagramPacket packet, DatagramSocket socket, byte[] infoBytes) {
this.socket = socket;
this.info = new String(infoBytes, 0, packet.getLength());
this.port = packet.getPort();
this.ip = packet.getAddress();
}
@Override
public void run() {
super.run();
//打印消息
System.out.println("客户端-"+ ip + " port=" + port + "说:"+info);
//回射
byte[] echobuf = ("server:"+info).getBytes();
DatagramPacket packet2 = new DatagramPacket(echobuf, echobuf.length, ip, port);
try {
socket.send(packet2);
}catch (IOException e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
public class Server2{
private static final int PORT = 9960;
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket(PORT);
byte[] infoBytes = new byte[1024];
System.out.println("Server is running...");
while(true) {
DatagramPacket packet = new DatagramPacket(infoBytes, infoBytes.length);
socket.receive(packet); //接收数据包 //阻塞函数
//接收到一个包就就开启一个线程
UdpServerThread thread = new UdpServerThread(packet, socket, infoBytes);
thread.start();
}
}
}
package com.client;
//package com.client;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/*
* Udp客户端
*/
public class Client2 {
//enum PORT{one,two,three}
private final static int PORT = 9960; //通信端口要与服务器端一致
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
//创建套接字
DatagramSocket client = new DatagramSocket();
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
InetAddress ip = InetAddress.getByName("127.0.0.1"); //使用本机ip地址
//创建数据包
//DatagramPacket(byte[] buf, int length, InetAddress address, int port)
//client.connect(ip,PORT);
String buf = null;
while((buf = in.readLine()) !=null) {
//创建数据包
byte[] sendbuf = buf.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendbuf, sendbuf.length,ip,PORT);
client.send(sendPacket); //阻塞函数
//接收服务器端发来的消息
byte[] recvbuf = new byte[256];
DatagramPacket recvPacket = new DatagramPacket(recvbuf, recvbuf.length);
client.receive(recvPacket);
byte[] buf2 = recvPacket.getData();
int len = recvPacket.getLength();
String result = new String(buf2, 0, len);
System.out.println("发送了:" + result);
if("exit".equals(buf))
break;
}
client.close(); //关闭套接字
in.close();
}
}
打开服务器,同时运行2个客户端程序并发送数据
运行结果:
Server is running...
客户端-/192.168.4.109 port=64517说:111
客户端-/192.168.4.109 port=64518说:222
客户端-/192.168.4.109 port=64517说:333
客户端-/192.168.4.109 port=64518说:444
客户端-/192.168.4.109 port=64517说:444
客户端-/192.168.4.109 port=64518说:555
客户端-/192.168.4.109 port=64517说:exit
客户端-/192.168.4.109 port=64518说:exit