一、简单的UDP服务器
循环接收数据报文并返回给客户端
package main;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
/**
* @ClassName UDPEchoServer
* @Description TODO
* @Author Cays
* @Date 2019/3/15 14:49
* @Version 1.0
**/
public class UDPEchoServer {
private static final int ECHOMAX=255;//maximm size of echo datafram
public static void main(String[] args) throws IOException {
//UDP只接受一个参数即服务器端口号
int servPort=8888;
//UDP服务器必须显式指定本地端口号
DatagramSocket socket=new DatagramSocket(servPort);
DatagramPacket packet=new DatagramPacket(new byte[ECHOMAX],ECHOMAX);
while (true){
//receive方法阻塞等待,直到接收到客户端的报文或者超时
//由于没有连接,每个数据报文都可能发送自不同的客户端
socket.receive(packet);
//udp服务器从客户端知道客户端的地址和端口号
System.out.println("Handling client at "+packet.getAddress()
.getHostAddress()+" on port "+packet.getPort());
//发送回馈信息
socket.send(packet);
//重置数据报的内部长度
packet.setLength(ECHOMAX);
}
}
}
二、简单的UDP应用程序
- 向服务器发送数据报文;2. 接收服务器返回的报文5次;3. 输出
package main;
import java.io.IOException;
import java.io.InterruptedIOException;
import java.net.*;
/**
* @ClassName UDPEchoClient
* @Description TODO
* @Author Cays
* @Date 2019/3/15 12:16
* @Version 1.0
**/
public class UDPEchoClientTimeout {
private static final int TIMEOUT=3000;//resend timeout(milliseconds)
private static final int MAXTRIES=5;//Maximm retransmissions
public static void main(String[] args) throws IOException {
//Server Address
InetAddress serverAddress=InetAddress.getByName("127.0.0.1");
//Convert the argument string to bytes using the default encoding
byte []bytesToSend="asasasdad".getBytes();
int servPort=8888;
//创建UDP套接字,未指定端口和ip,自动获取
DatagramSocket socket=new DatagramSocket();
//设置超时时间
socket.setSoTimeout(TIMEOUT);
//创建发送的数据报文,数据、目的地址、端口号
DatagramPacket sendPacket=new DatagramPacket(bytesToSend,bytesToSend.length,
serverAddress,servPort);
//创建接受的数据报文,
DatagramPacket receivePacket=new DatagramPacket(new byte[bytesToSend.length],
bytesToSend.length);
int tries=0;//packet may be lost, so we have to keep trying
boolean receivedResponse=false;
do {
//发送报文
socket.send(sendPacket);
try{
//receive阻塞等待,直到收到报文或者超时
socket.receive(receivePacket);
if (!receivePacket.getAddress().equals(serverAddress)){
throw new IOException("Received packet from an unknown source");
}
receivedResponse=true;
}catch (InterruptedIOException e){
//超时计数器加一,尝试重新发送
tries+=1;
System.out.println("Time out, "+(MAXTRIES-tries)+" more tries...");
}
}while ((!receivedResponse)&&(tries<MAXTRIES));
if (receivedResponse){
System.out.println("Received:"+new String(receivePacket.getData()));
}else {
System.out.println("No response -- giving up.");
}
socket.close();
}
}
三、结果