Udp服务端
public class UDPServer {
private static Logger log = Logger.getLogger(UDPServer.class);
public static void main(String[] args){
try {
InetAddress byName = InetAddress.getByName("192.168.0.30");
DatagramSocket socket = new DatagramSocket(5000,byName);
byte[] bytes = new byte[1024];
log.info("开始接收数据流");
while (true){
DatagramPacket request = new DatagramPacket(bytes,bytes.length);
socket.receive(request);
String s = new String(request.getData(), 0, request.getLength(), "utf-8");
log.info("接收的数据:"+s);
byte[] res = "I get it".getBytes();
DatagramPacket response = new DatagramPacket(res,res.length,request.getAddress(),request.getPort());
//socket.send(response);
Thread.sleep(2000);
}
}catch (Exception e){
e.printStackTrace();
}
}
}
Udp客户端
public class UDPClient {
private static Logger log = Logger.getLogger(UDPClient.class);
public static void main(String[] args) throws Exception{
byte[] buf = new byte[32];
InetAddress byName = InetAddress.getByName("192.168.0.30");
DatagramSocket socket = new DatagramSocket(5001,byName);
File file = new File("C://db//iotest//sonProcess.log");
FileInputStream in = new FileInputStream(file);
DatagramPacket request = null;
DatagramPacket respone = null;
int length = 0;
while((length=in.read(buf))!=-1){
request = new DatagramPacket(buf,length,byName,5000);
socket.send(request);
respone = new DatagramPacket(buf,buf.length);
//socket.receive(respone);
// String s = new String(respone.getData(), 0, respone.getLength(), "utf-8");
//log.info("服务端回复:"+s);
}
}
}
DatagramPacket
英文意思为数据包裹,这个包裹也是有大小的,这个量是由传入的byte数组的大小决定,而且最大是接收的数据填满字节数组的最大长度。客户端与服务端就是相互传数据包裹进行交互的,这里需要注意的是发送包裹是带数据的字节,大小,目的地(InetAddress),端口。接收包裹:传入字节数组,最大值即可,DatagramSocket会在接收的时候补充其他数据。注意:发送包裹与接收包裹最好的匹配是两个的buf(字节数组的大小)相同,或者,接收包裹要小于发送包裹,因为,一个发送包裹对应一个接收包裹,若接收包裹小于发送包裹就会造成字节丢失。
DatagramSocket
其实在udp中没有像tcp中分socket与socketServer吧客户端与服务端分清。不管哪个端,都是DatagramSocket负责接收和发送数据。