第二步:阻塞等待客户端的请求命令,首先要创建一个DatagramPacketde容器来接收客户端发送的命令,当没有收到客户端发送的指令的时候,使用receive方法,,会自动地进行阻塞等待,DatagramPacketde的参数需要传入byte[]和它的长度
DatagramPacket datagramPacket = new DatagramPacket(new byte[4096],4096);
datagramSocket.receive(datagramPacket);
第三步:接收客户端发送的具体指令,因为信息之间的传递是二进制,所以接收到客户端发送的消息也是二进制的,而调用new String()里面的getData()方法能够将二进制转换成字符串,也就是能看懂的文字
//接收客户端发送的命令
String requestContext = new String(requestDatagramPacket.getData());
第四步:对客户端信息的加工和处理,那么这里就直接接收到什么命令就直接返回了,这里就直接写一个方法
//客户端信息的加工和处理
private String process(String requestContext) {
return requestContext;
}
第五步:将接收到的信息返回给客户端,也就是将信息发送给客户端,那么就需要依赖DatagramPacket,而发送消息就需要目标地址的IP和端口号,所以DatagramPacket里面的参数就需要
发送信息的内容+内容长度+客户端IP+客户端的端口号
参数解释:
发送信息的内容:因为我们上面接收到的消息和加工处理过的信息已经转换成了字符串,而发送的信息需要以二进制内容发送,所以要调用getBytes()方法
内容长度:也就是你要发送内容的多少,一定要使用字节的长度,不能使用字符的长度也就是requestContext.getBytes().length而不是requestContext.length()
客户端IP:因为上面我们通过requestDatagramPacket接收到客户端的信息,那么此时我们就可以使用requestDatagramPacket.getAddress()来拿到客户端的IP
客户端端口号:和上面客户端IP一样的获取方法
//将信息返回给客户端
DatagramPacket responseDatagramPacket = new DatagramPacket(
requestContext.getBytes(),
requestContext.getBytes().length,
requestDatagramPacket.getAddress(),//客户端的IP
requestDatagramPacket.getPort());//客户端的端口号
//最后调用sent()方法,将信息发送给客户端
datagramSocket.send(requestDatagramPacket);
UDPServer(服务器端的全代码)
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
/**
- UDP的服务器端,使用对象 DatagramSocket / DatagramPacket
*/
public class UDPServer {
private DatagramSocket datagramSocket = null;
public UDPServer(int port) throws SocketException {
datagramSocket = new DatagramSocket(port);
}
public void start() throws IOException {
System.out.println(“服务器正常启动了~”);
//写一个while循环,表示一直读取客户端发送的消息
while (true){
//阻塞等待客户端的请求
DatagramPacket requestDatagramPacket = new DatagramPacket(new byte[4096],4096);
datagramSocket.receive(requestDatagramPacket);
//接收客户端发送的命令
String requestContext = new String(requestDatagramPacket.getData());
//客户端信息的加工和处理
String responseContext = process(requestContext);
//将信息返回给客户端
DatagramPacket responseDatagramPacket = new DatagramPacket(
requestContext.getBytes(),
requestContext.getBytes().length,
requestDatagramPacket.getAddress(),
requestDatagramPacket.getPort());
//最后调用sent方法,将信息发送给客户端
datagramSocket.send(requestDatagramPacket);
//结果打印
System.out.printf(“客户端IP: %s,客户端端口:%d,客户端的内容:%s,服务器响应的内容:%s\n”,
requestDatagramPacket.getAddress(),
requestDatagramPacket.getPort(),
requestContext, responseContext);
}
}
//客户端信息的加工和处理
private String process(String requestContext) {
return requestContext;
}
public static void main(String[] args) throws IOException {
UDPServer udpServer = new UDPServer(9090);
udpServer.start();
}
}
执行结果
客户端UDPClient
客户端实现步骤:
-
初始化DatagramSocket
-
进入主循环执行相应流程
-
2.1 先构建命令
-
2.2 给服务器端发送命令
-
2.3 阻塞等待服务器端相应
-
2.4 打印服务器端返回的信息
第一步初始化DatagramSocket,但是这里和服务器端不一样,服务器端一直在等待命令。而客户端是给服务器端发送命令,所以需要传参目标地址的IP和端口号
//初始化DatagramSocket,客户端构建
private DatagramSocket datagramSocket = null;
public UDPClient() throws SocketException {
datagramSocket = new DatagramSocket();
}
第二步:构建客户端的请求命令
//构建客户端的请求命令
System.out.println(“->”);
String requestContext = scanner.nextLine();
第三步:给服务器端发送命令,同时也需要依赖DatagramPacket,并且要传入参数,内容+长度+目标IP(也就是服务器端的IP)+目标端口号(服务器端的端口号),最后一定要调用send方法
//给服务器端发送命令
DatagramPacket resquestDatagramPacket = new DatagramPacket(
requestContext.getBytes(),
requestContext.getBytes().length,
InetAddress.getByName(serverIp),serverPort);
datagramSocket.send(resquestDatagramPacket);
第四步:阻塞等待服务器端相应,同样和服务器端接收客户端时的信息一样,也要依赖DatagramPacke
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
面试准备+复习分享:
为了应付面试也刷了很多的面试题与资料,现在就分享给有需要的读者朋友,资料我只截取出来一部分哦
189158235)]
[外链图片转存中…(img-xnxH2QrN-1711189158235)]
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-GhAIIH0U-1711189158236)]
面试准备+复习分享:
为了应付面试也刷了很多的面试题与资料,现在就分享给有需要的读者朋友,资料我只截取出来一部分哦
[外链图片转存中…(img-KRktfCEp-1711189158236)]