统计
  • 建站日期:2021-03-10
  • 文章总数:518 篇
  • 评论总数:151 条
  • 分类总数:32 个
  • 最后更新:4月20日
文章 未分类

通过 Socket 实现 UDP 编程 入门

梦幻书涯
首页 未分类 正文

上一篇文章介绍了基于 TCP 协议的 Socket 通信,本文介绍基于 UDP 协议的 Socket 通信,还是一个用户登录的例子。

 

UDP协议(用户数据报协议)是无连接、不可靠、无序的。

UDP协议以数据报作为数据传输载体。

 

进行数据传输时,首先要将要传输的数据定义成数据报(Datagram),在数据报中指明所要达到的 Socket(主机地址和端口),然后再将数据报发送出去。

相关操作类:

DatagramPacket:表示数据报包

DatagramSocket:进行端到端通信的类

 

DatagramPacket 构造器和成员方法

1、Datagram 构造方法


通过Socket实现UDP编程入门
-梦幻书涯 - 莫問前路遙遠- 與君風雪
-第1
张图片

 

2、DatagramPacket 成员方法


通过Socket实现UDP编程入门
-梦幻书涯 - 莫問前路遙遠- 與君風雪
-第2
张图片

 

DatagramSocket 构造器和成员方法

1、DatagramSocket 构造器


通过Socket实现UDP编程入门
-梦幻书涯 - 莫問前路遙遠- 與君風雪
-第3
张图片

 

2、DatagramSocket 成员方法


通过Socket实现UDP编程入门
-梦幻书涯 - 莫問前路遙遠- 與君風雪
-第4
张图片


通过Socket实现UDP编程入门
-梦幻书涯 - 莫問前路遙遠- 與君風雪
-第5
张图片

 

 

一个服务端和支持多个客户端的对话demo

1、Server.java

  1. package com.liuyanzhao.udp;
  2. import java.io.IOException;
  3. import java.net.DatagramPacket;
  4. import java.net.DatagramSocket;
  5. import java.net.InetAddress;
  6. /**
  7.  * @author 言曌
  8.  * @date 2017/12/4 下午9:38
  9.  */
  10. public class Server {
  11.     public static void main(String[] args) throws IOException {
  12.         DatagramSocket socket = new DatagramSocket(8888);
  13.         byte[] data = new byte[1024];
  14.         DatagramPacket packet;
  15.         packet = new DatagramPacket(data, data.length);
  16.         System.out.println("服务器已启动");
  17.         while (true){
  18.             socket.receive(packet);//在接收到数据包之前一直阻塞
  19.             ServerThread thread = new ServerThread(socket, packet);
  20.             thread.run();
  21.         }
  22.     }
  23. }

 

2、ServerThread.java

  1. package com.liuyanzhao.udp;
  2. import java.io.IOException;
  3. import java.net.DatagramPacket;
  4. import java.net.DatagramSocket;
  5. import java.net.InetAddress;
  6. /**
  7.  * @author 言曌
  8.  * @date 2017/12/4 下午10:24
  9.  */
  10. public class ServerThread implements Runnable {
  11.     private DatagramSocket socket;
  12.     private DatagramPacket packet;
  13.     public ServerThread(DatagramSocket socket, DatagramPacket packet) {
  14.         this.socket = socket;
  15.         this.packet = packet;
  16.     }
  17.     @Override
  18.     public void run() {
  19.         byte[] data = packet.getData();
  20.         String info = new String (data, 0, packet.getLength());
  21.         System.out.println("我是服务器,客户端说:" + info);
  22.         InetAddress address = packet.getAddress();
  23.         int port = packet.getPort();
  24.         byte[] data2 = "欢迎您!".getBytes();
  25.         DatagramPacket reply = new DatagramPacket(data2, data2.length, address, port);
  26.         try {
  27.             socket.send(reply);
  28.         } catch (IOException e) {
  29.             e.printStackTrace();
  30.         }
  31.     }
  32. }

 

3、Client.java

  1. package com.liuyanzhao.udp;
  2. import java.io.IOException;
  3. import java.net.DatagramPacket;
  4. import java.net.DatagramSocket;
  5. import java.net.InetAddress;
  6. /**
  7.  * 客户端
  8.  * @author 言曌
  9.  * @date 2017/12/4 下午9:44
  10.  */
  11. public class Client {
  12.     public static void main(String args[]) throws IOException {
  13.         //1、定义服务器的地址、端口号、数据
  14.         InetAddress address = InetAddress.getByName("localhost");
  15.         int port = 8888;
  16.         byte[] data = "用户名:admin;密码:123456".getBytes();
  17.         //2、创建数据报
  18.         DatagramPacket packet = new DatagramPacket(data,data.length,address,port);
  19.         //3、创建DatagramSocket对象
  20.         DatagramSocket socket = new DatagramSocket();
  21.         //4、向服务器端发送数据
  22.         socket.send(packet);
  23.         /**
  24.          * 接受服务器端的响应的数据
  25.          */
  26.         //1、创建数据报,用于接受服务器响应的数据
  27.         byte[] data2 = new byte[1024];
  28.         DatagramPacket packet2 = new DatagramPacket(data2,data2.length);
  29.         //2、接受服务器响应的数据
  30.         socket.receive(packet2);
  31.         //3、读取服务器端响应的数据
  32.         String reply = new String(data2,0,packet2.getLength());
  33.         System.out.println("我是客户端,服务器说:"+reply);
  34.         //4、关闭资源
  35.         socket.close();
  36.     }
  37. }

 

运行效果

1、先运行 Server 类


通过Socket实现UDP编程入门
-梦幻书涯 - 莫問前路遙遠- 與君風雪
-第6
张图片

 

2、再运行 Client 类

服务器端界面


通过Socket实现UDP编程入门
-梦幻书涯 - 莫問前路遙遠- 與君風雪
-第7
张图片

 

客户端界面


通过Socket实现UDP编程入门
-梦幻书涯 - 莫問前路遙遠- 與君風雪
-第8
张图片

 

3、再启动一个 Client 类

服务器端界面


通过Socket实现UDP编程入门
-梦幻书涯 - 莫問前路遙遠- 與君風雪
-第9
张图片

 

 

本文参考慕课网

版权说明
文章采用: 《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权。
版权声明:未标注转载均为本站原创,转载时请以链接形式注明文章出处。如有侵权、不妥之处,请联系站长删除。敬请谅解!

这篇文章最后更新于2019-6-8,已超过 1 年没有更新,如果文章内容或图片资源失效,请留言反馈,我们会及时处理,谢谢!
java swing实现一个简单的计算器
« 上一篇
java中ImageIcon路径问题
下一篇 »

发表评论

HI ! 请登录
注册会员,享受下载全站资源特权。
Array

日历

热门文章