UDP协议:

基于TCP协议可以建立稳定连接的点对点的通信。这种通信方式实时、快速、安全性高,但是很占用系统的资源。

在网络传输方式上,还有另一种基于UDP协议的通信方式,称为数据报通信方式。在这种方式中,每个数据发送单元被统一封装成数据报包的方式,发送方将数据报包发送到网络中,数据报包在网络中去寻找它的目的地。

UDP通讯的实现:

▪ DatagramSocket:用于发送或接收数据报包

当服务器要向客户端发送数据时,需要在服务器端产生一个DatagramSocket对象,在客户端产生一个DatagramSocket对象。服务器端的DatagramSocket将DatagramPacket发送到网络上,然后被客户端的DatagramSocket接收。

DatagramSocket有两种常用的构造函数。一种是无需任何参数的,常用于客户端;另一种需要指定端口,常用于服务器端。如下所示:

DatagramSocket() :构造数据报套接字并将其绑定到本地主机上任何可用的端口。

DatagramSocket(int port) :创建数据报套接字并将其绑定到本地主机上的指定端口。

常用方法:

1.send(DatagramPacket p) :从此套接字发送数据报包。

2.receive(DatagramPacket p) :从此套接字接收数据报包。

3.close() :关闭此数据报套接字。

▪ DatagramPacket:数据容器(封包)的作用

此类表示数据报包。 数据报包用来实现封包的功能。

常用方法:

1.DatagramPacket(byte[] buf, int length) :构造数据报包,用来接收长度为 length 的数据包。

2.DatagramPacket(byte[] buf, setOff,InerSocketAdress) :构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。

3.getAddress() :获取发送或接收方计算机的IP地址,此数据报将要发往该机器或者是从该机器接收到的。

4.getData() :获取发送或接收的数据。

5.getLength() :获取接收数据的大小。

UDP单向通讯:

客户端:

import java.io.*;
import java.net.*;
import java.nio.charset.StandardCharsets;
/*发送端1、使用DatagramSocket 指定端口,创建发送端2、准备数据 一定转成字节数组3、将数据封装程 DatagramPacket包裹,需指定目的地(IP+端口)4、发送包裹 send(DatagramPacket p)5、释放资源*/
public class UdpClient {public static void main(String[] args) throws Exception {System.out.println("发送方启动中......");//1、使用DatagramSocket 指定端口,创建发送端DatagramSocket client = new DatagramSocket(8888);//2、准备数据 一定转成字节数组BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));String str = "0";while(!str.equals("")){str = reader.readLine();//3、将数据封装程 DatagramPacket包裹,需指定目的地(IP+端口)byte[] data = str.getBytes(StandardCharsets.UTF_8);DatagramPacket packet = new DatagramPacket(data,0,data.length,new InetSocketAddress("localhost",9999));//4、发送包裹 send(DatagramPacket p)client.send(packet);}//5、释放资源client.close();}
}

服务端:

import java.net.*;
/*接收端1、使用DatagramSocket 指定端口,创建接收端2、准备容器,封装成DatagramPacket包裹3、阻塞式接收包裹 receive(DatagramPacket p)4、分析数据:byte[] getData();int getLength()。5、释放资源*/
public class UdpServer {public static void main(String[] args) throws Exception{System.out.println("接收方启动中......");//1、使用DatagramSocket 指定端口,创建接受端DatagramSocket server = new DatagramSocket(9999);//2、准备容器,封装成DatagramPacket包裹byte[] container = new byte[1024*60];DatagramPacket packet = new DatagramPacket(container,0,container.length);//3、阻塞式接收包裹 receive(DatagramPacket p)server.receive(packet);//4、分析数据byte[] data = packet.getData();// container也行int len = packet.getLength();// len为数据实际大小,data.length=container.lengthString str = new String(data,0,len);while(!str.equals("")){System.out.println(str);server.receive(packet);data = packet.getData();len = packet.getLength();str = new String(data,0,len);}//5、释放资源server.close();}
}

 注:通过字节数组流ByteArrayInputStream、ByteArrayOutputStream与数据流DataInputStream、DataOutputStream联合使用可以传递基本数据类型。

UDP双向通讯:

客户端线程:

import java.io.*;
import java.net.*;
import java.nio.charset.StandardCharsets;public class TalkSend implements Runnable {private DatagramSocket client;private String toIP;private int toPort;public TalkSend(int port,String toIP,int toPort) throws Exception {client = new DatagramSocket(port);this.toIP = toIP;this.toPort = toPort;}@Overridepublic void run() {//1、使用DatagramSocket指定端口client为发送端//2、准备数据 一定转成字节数组BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));String str = "null";while(!str.equals("")){try {str = reader.readLine();} catch (IOException e) {e.printStackTrace();}//3、将数据封装程 DatagramPacket包裹,需指定目的地(IP+端口)byte[] data = str.getBytes(StandardCharsets.UTF_8);DatagramPacket packet = new DatagramPacket(data,0,data.length,new InetSocketAddress(toIP,toPort));//4、发送包裹 send(DatagramPacket p)try {client.send(packet);} catch (IOException e) {e.printStackTrace();}}//5、释放资源client.close();}
}

服务端线程:

import java.io.IOException;
import java.net.*;public class TalkReceive implements Runnable {private DatagramSocket server;public TalkReceive(int port) throws SocketException {server = new DatagramSocket(port);}@Overridepublic void run() {//1、使用DatagramSocket指定端口server为接受端//2、准备容器,封装成DatagramPacket包裹byte[] container = new byte[1024*60];DatagramPacket packet = new DatagramPacket(container,0,container.length);//3、阻塞式接收包裹 receive(DatagramPacket p)try {server.receive(packet);} catch (IOException e) {e.printStackTrace();}//4、分析数据byte[] data = packet.getData();// container也行int len = packet.getLength();// len为数据实际大小,data.length=container.lengthString str = new String(data,0,len);while(!str.equals("")){System.out.println(Thread.currentThread().getName()+":"+str);try {server.receive(packet);} catch (IOException e) {e.printStackTrace();}data = packet.getData();len = packet.getLength();str = new String(data,0,len);}//5、释放资源server.close();}
}

双向通讯的多线程实现:

public class Talker1 {public static void main(String[] args) throws Exception {new Thread(new TalkSend(8888,"localhost",9999),"Tom").start();new Thread(new TalkReceive(5555),"Jerry").start();}
}
public class Talker2 {public static void main(String[] args) throws Exception {new Thread(new TalkReceive(9999),"Tom").start();new Thread(new TalkSend(6666,"localhost",5555),"Jerry").start();}
}

执行结果:

Java UDP通讯的简单实现相关推荐

  1. 铂西学习日记---UDP通讯协议简单示例

    1.UDP协议概述 UDP是User Datagram Protocol的简称,是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此 ...

  2. UDP 通讯协议 局域网通信发送消息 简单实现

    发送端 import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; imp ...

  3. Java udp的使用和编写简单聊天小程序

    1. 入门 1.1. 发送端 import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetA ...

  4. 【计算机网络作业】Java UDP聊天 和 Socket编写一个简单的Web服务器

    1-1 假设Tom和Jerry利用Java UDP进行聊天,请为他们编写程序.具体如下: (1).Tom和Jerry聊天的双方都应该具有发送端和接收端: (2).利用DatagramSocket与Da ...

  5. 使用java网络编程模拟简单网络即时通信

    使用java网络编程模拟简单网络即时通信 通信流程图: 解析: 1.在上图中我们可以看出对于任何一个客户端,都由两部分构成,发送端和接收端(分别由两个线程来维系) 2.客户端在每一次请求链接时都会轮询 ...

  6. Java UDP 编程简介.

    一.UDP 协议简介 UPD协议 是常见的 网络传输协议之一, 当然另1个是TCP协议. UPD协议 是一种不靠的协议. 是因为发送方不会关心接受方的状态, 直接向接收方发送数据包, 也就是说这个数据 ...

  7. LWIP裸机环境下实现TCP与UDP通讯

    前面移植了LWIP,并且简单的实用了DHCP的功能,今天来使用一下实际的数据通讯的功能 首先是实现TCP客户端,我先上代码 #ifndef __TCP_CLIENT_H_ #define __TCP_ ...

  8. linux系统udp通信程序,Linux UDP socket编程(UDP通讯模型) | C/C++程序员之家

    Linux UDP socket编程(UDP通讯模型): UDPClient + UDPService. Linux下大多数网络程序都是基于TCP的,很少基于UDP,简单的通讯模型如下,开发时候备用! ...

  9. socket之UDP通讯

    该文章简单的讲解linux中socket UDP通讯 UDP(user datagram protocol)的中文叫用户数据报协议,属于传输层.UDP是面向非连接的协议,它不与对方建立连接,而是直接把 ...

最新文章

  1. 为你的水晶报表装载本地图片
  2. java连接redis无法连接,报异常RedisConnectionException
  3. 《C和指针》读书笔记第三章数据
  4. jmeter测试java_使用JMeter测试Java项目
  5. 10月数据库排行:Microsoft SQL Server分数增加最多
  6. 软件工程模块开发卷宗_数据科学家应该了解的软件工程实践
  7. 统计词语出现次数python_Python实战教程:如何统计序列中元素的出现频度
  8. Spring依赖注入的两种方式(根据实例详解)
  9. 检查Python列表项是否在另一个字符串中包含一个字符串
  10. html 目录生成器,Tocify:动态节点目录菜单生成器_html/css_WEB-ITnose
  11. STM32F103--移植FreeRTOS完整教程
  12. debian nvidia 安装_Debian安装Nvidia显卡驱动
  13. iPad开发强制横屏
  14. css加号图标_excel单元格加号展开折叠
  15. Get “https://github.com/electron-userland/electron-builder-binaries/releases/download/appimage-12.0.
  16. Windows锁机病毒
  17. 程序员转行后能做什么?
  18. MR(混合现实)无绿幕拍摄
  19. 优化Oracle数据库查询10个方法
  20. 统计英文名著中单词出现频率

热门文章

  1. vbs计算机代码,vbs运行一个程序的代码
  2. 通达信自动提示启明星、黄昏星K线组合形态(含指标公式源码)
  3. STM32CubeIDE下载安装
  4. 车厢调度(4种方法)
  5. 【SQL开发实战技巧】系列(七):从有重复数据前提下如何比较出两个表中的差异数据及对应条数聊起
  6. MapboxMap 之设置 Style
  7. Android 输入法 控制 切换
  8. VS系列编译器安装破解版VA_X.dll插件
  9. 软件测试的测试用例怎么写?(含思维导图)
  10. [4G+5G专题-142]: RF- JESD接口简介