server
服务端需实现三步:
1.读取请求并解析
2.根据请求计算响应
3.把响应写回给客户端
import java.io.IOException;
import java.net.*;
public class UdpEchoServer {
private DatagramSocket socket = null;
public UdpEchoServer(int port) throws SocketException {
socket = new DatagramSocket(port);
}
public void start() throws IOException {
System.out.println("服务器启动");
while(true){
//1.读取请求并解析
DatagramPacket requestPacket = new DatagramPacket(new byte[4096],4096);//缓冲区
socket.receive(requestPacket);//一旦客户端有请求,将请求写入requestPacket的缓冲区里
String request = new String(requestPacket.getData(),0,requestPacket.getLength()).trim();
//2.根据请求计算响应
String response = process(request);
//3.把响应写回给客户端,响应数据是response,需要包装成一个Packet对象
DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),response.getBytes().length,
requestPacket.getSocketAddress());
socket.send(responsePacket);
}
}
public String process(String request){
//此处是最简单的回显服务器,process方法只需原样返回传入的数据
return request;
}
}
client
客户端主要流程分四步
1.从用户这里读取输入的数据
2.构造请求发给服务器
3.从服务器读取响应
4.把响应写回给客户端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Scanner;
public class UdpEchoClient {
private DatagramSocket socket = null;
private String serverIp;
private int serverPort;
//需要在启动客户端时来指定连接哪个服务器
public UdpEchoClient( String serverIp, int serverPort) throws SocketException {
this.socket = socket;
this.serverIp = serverIp;
socket = new DatagramSocket();
}
public void start() throws IOException {
Scanner scanner = new Scanner(System.in);
while(true){
// 1.读取用户输入
System.out.print("->");
String request = scanner.nextLine();
if(request.equals("exit")){
break;
}
//2.构造请求发送给服务器
DatagramPacket requestPacket = new DatagramPacket(request.getBytes(),
request.getBytes().length, InetAddress.getByName(serverIp),serverPort);
socket.send(requestPacket);
//3.从服务器读取响应
DatagramPacket responsePacket = new DatagramPacket(new byte[4096],4096);
socket.receive(requestPacket);
String response = new String(responsePacket.getData(),0,responsePacket.getLength());
//4.显示响应数据
System.out.println(response);
}
}
}