当前位置: 首页 > news >正文

UDP-如何实现客户端与服务器端的通信(一对一、一对多、多对一、多对多之间的通信)

        Java中提供了DatagramSocket来实现这个功能

1.服务器端的程序
  • 创建Socket,监听6666端口
  • 读取来自客户端的“数据包”,创建数据包(通过DatagramPacket实现数据包的创建)
  • 接收数据包
  • 从数据包中,读取数据(通过recieve()接收数据send()发送给数据)

代码如下:

package com.ztt.udp.Demo01;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;public class UdpServer {public static void main(String[] args) {//创建Socket,监听6666端口try (DatagramSocket serverSocket = new DatagramSocket(6666)) {//读取来自客户端的数据包//创建数据包byte[] buff=new byte[1024];DatagramPacket packet=new DatagramPacket(buff,buff.length);//接收数据包serverSocket.receive(packet);System.out.println("读取完毕!");//从数据包中,读取数据byte[] data=packet.getData();String strFormClient=new String(data);System.out.println("来自客户端的信息:"+strFormClient);if("天王盖地虎".equals(strFormClient)) {packet.setData("宝塔镇河妖".getBytes());}else {packet.setData("哈哈哈哈哈哈哈".getBytes());}//反馈信息给客户端(发送数据包至客户端)serverSocket.send(packet);} catch (SocketException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}
2.客户端的程序 
  • 创建socket
  • 连接指定主机的端口(客户端使用clientSocket.connect()指定远程地址和端口)
  • 创建数据包
  • 发送数据包(通过recieve()接收数据send()发送给数据)

代码如下:

package com.ztt.udp.Demo01;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;public class UdpClient {public static void main(String[] args) {//创建sockettry (DatagramSocket clientSocket = new DatagramSocket()) {//连接指定主机的端口clientSocket.connect(InetAddress.getByName("192.168.199.112"),6666);//创建数据包DatagramPacket packet=new DatagramPacket(new byte[1024],1024);packet.setData("甜甜是甜甜".getBytes());//将数据放入数据包//发送数据包clientSocket.send(packet);//等待接受反馈信息(等待接收来自服务端的数据包)clientSocket.receive(packet);byte[] data=packet.getData();String strFormClient=new String(data);System.out.println("来自服务端的信息:"+strFormClient);} catch (SocketException e) {e.printStackTrace();} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}

总结:

  1. 使用UDP协议通信时,服务器和客户端双方无需建立连接;
  2. 服务器端用DatagramSocket(port)监听端口;
  3. 客户端使用DatagramSocket.connect()指定远程地址和端口;
  4. 双方通过receive()和send()读写数据;
  5. DatagramSocket没有IO流接口,数据被直接写入byte[]缓冲区;

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C语言丢失精度 如何实现高精度计算
  • ThreadLocal源码分析
  • Spring-Boot基础--yaml
  • Qcom平台通过Hexagon IDE 测试程序性能指导
  • Puppeteer动态代理实战:提升数据抓取效率
  • Qt: 窗口停靠框架
  • PostgreSQL创建表和自增序列
  • [数据分析]脑图像处理工具
  • Qt 实战(6)事件 | 6.3、自定义事件
  • 自定义注解 + Redis 实现业务的幂等性
  • juicefs部署实践
  • 任意空间平面点云旋转投影至水平面—罗德里格旋转公式
  • 【简洁明了】调节大模型的prompt的方法【带案例】
  • 一款IM即时通讯聊天系统源码,包含app和后台源码
  • 【Hive SQL 每日一题】找出各个商品销售额的中位数
  • $translatePartialLoader加载失败及解决方式
  • Asm.js的简单介绍
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • java第三方包学习之lombok
  • Redis在Web项目中的应用与实践
  • Sequelize 中文文档 v4 - Getting started - 入门
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • vue2.0项目引入element-ui
  • 大快搜索数据爬虫技术实例安装教学篇
  • 浮动相关
  • 区块链分支循环
  • 小程序 setData 学问多
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • #define与typedef区别
  • #git 撤消对文件的更改
  • (03)光刻——半导体电路的绘制
  • (04)odoo视图操作
  • (3)医疗图像处理:MRI磁共振成像-快速采集--(杨正汉)
  • (39)STM32——FLASH闪存
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (强烈推荐)移动端音视频从零到上手(下)
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (十五)使用Nexus创建Maven私服
  • (一)VirtualBox安装增强功能
  • (转)h264中avc和flv数据的解析
  • (转)负载均衡,回话保持,cookie
  • *1 计算机基础和操作系统基础及几大协议
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .Net Web项目创建比较不错的参考文章
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .NET连接MongoDB数据库实例教程
  • @font-face 用字体画图标
  • [ C++ ] 类和对象( 下 )
  • [10] CUDA程序性能的提升 与 流
  • [Android]使用Git将项目提交到GitHub