基于UDP实现简单的客户端服务端的消息传递


前面的TCP是有可靠的,有序的。现在看看UDP,UDP是不可靠的,无序的。


现在看看实现:
这里我也用两个类模拟了客户端与服务端,

现在直接看下代码:


UDPServer.java:


 
 
  1. package com.socket.udp;
  2. import java.io.IOException;
  3. import java.net.DatagramPacket;
  4. import java.net.DatagramSocket;
  5. import java.net.InetAddress;
  6. import java.net.SocketException;
  7. /**
  8. * UDP 服务端
  9. *
  10. * @author lolli
  11. *
  12. */
  13. public class UDPServer {
  14. public static void main(String[] args) {
  15. try {
  16. // 创建服务器端的DatagramSocket,并指定端口
  17. DatagramSocket datagramSocket = new DatagramSocket( 8888);
  18. System.out.println( "***** 启动服务器,等待客户端的连接请求 ******");
  19. byte[] data = new byte[ 2048];
  20. // 创建数据报,用户接受客户端请求的数据
  21. DatagramPacket datagramPacket = new DatagramPacket(data, data.length);
  22. // 接收客户端请求的数据(在接收到数据之前一直处于阻塞状态)
  23. datagramSocket.receive(datagramPacket);
  24. // 获取请求的数据,并转成String打印出来
  25. String clientData = new String(data, 0, datagramPacket.getLength());
  26. System.out.println( "我是服务端,客户端请求的数据为:" + clientData);
  27. // *** 给客户端进行相应 ***
  28. // 定义客户端的地址
  29. InetAddress inetAddress = datagramPacket.getAddress();
  30. int port = datagramPacket.getPort();
  31. byte[] backData = "我接受到了客户端的数据,你好!".getBytes();
  32. // 创建数据包,给客户端响应数据
  33. DatagramPacket backDatagramPacket = new DatagramPacket(backData, backData.length, inetAddress, port);
  34. // 给客户端发送数据
  35. datagramSocket.send(backDatagramPacket);
  36. } catch (SocketException e) {
  37. // TODO Auto-generated catch block
  38. e.printStackTrace();
  39. } catch (IOException e) {
  40. // TODO Auto-generated catch block
  41. e.printStackTrace();
  42. }
  43. }
  44. }

再看看客户端:

UDPClient.java:


 
 
  1. package com.socket.udp;
  2. import java.io.IOException;
  3. import java.net.DatagramPacket;
  4. import java.net.DatagramSocket;
  5. import java.net.InetAddress;
  6. import java.net.SocketException;
  7. import java.net.UnknownHostException;
  8. /**
  9. * UDP 客户端
  10. * @author lolli
  11. *
  12. */
  13. public class UDPClient {
  14. public static void main(String[] args) {
  15. try {
  16. // 定义服务器地址
  17. InetAddress inetAddress = InetAddress.getByName( "localhost");
  18. byte[] data = "我是客户端,hello".getBytes();
  19. // 创建数据报,准备数据
  20. DatagramPacket datagramPacket = new DatagramPacket(data, data.length, inetAddress, 8888);
  21. // 创建一个DatagramSocket
  22. DatagramSocket datagramSocket = new DatagramSocket();
  23. // 发送请求
  24. datagramSocket.send(datagramPacket);
  25. // *** 接收服务端响应回来的数据 ***
  26. byte[] resData = new byte[ 2048];
  27. // 创建数据报,用户接受客户端请求的数据
  28. DatagramPacket resDatagramPacket = new DatagramPacket(resData, resData.length);
  29. // 接收客户端请求的数据(在接收到数据之前一直处于阻塞状态)
  30. datagramSocket.receive(resDatagramPacket);
  31. // 获取请求的数据,并转成String打印出来
  32. String serverData = new String(resData, 0, resDatagramPacket.getLength());
  33. System.out.println( "我是客户端,服务端响应的数据为:" + serverData);
  34. datagramSocket.close();
  35. } catch (UnknownHostException e) {
  36. // TODO Auto-generated catch block
  37. e.printStackTrace();
  38. } catch (SocketException e) {
  39. // TODO Auto-generated catch block
  40. e.printStackTrace();
  41. } catch (IOException e) {
  42. // TODO Auto-generated catch block
  43. e.printStackTrace();
  44. }
  45. }
  46. }


然后再运行看看结果。

同样的,我们也要先启动客户端,在启动客户端

服务端控制台:


客户端控制台:






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值