网络编程——UDP编程

2023-05-16

一、网络编程基础

        计算机网络是指两台或更多的计算机组成的网络,在同一个网络中,任意两台计算机都可以直接通信,因为所有计算机都需要遵循同一种网络协议。因此,为了把计算机网络接入互联网,就必须使用TCP/IP协议。

1.常用协议

IP协议只负责发数据包,不保证顺序和正确性,而TCP协议负责控制数据包传输,它在传输数据之前需要先建立连接,建立连接后才能传输数据,传输完后还需要断开连接。

UDP协议(User Datagram Protocol)是一种数据报文协议,它是无连接协议不保证可靠传输。因为UDP协议在通信前不需要建立连接,因此它的传输效率比TCP高,而且UDP协议比TCP协议要简单得多。选择UDP协议时,传输的数据通常是能容忍丢失的,例如,一些语音视频通信的应用会选择UDP协议。

2.什么是Socket?

         Socket是一个抽象概念,一个应用程序通过一个Socket来建立一个远程连接,而Socket内部通过TCP/IP协议把数据传输到网络。可以把Socket简单理解为IP地址加端口号。端口号总是由操作系统分配,它是一个0~65535之间的数字,其中,小于1024的端口属于特权端口,需要管理员权限,大于1024的端口可以由任意用户的应用程序打开。

       因此,当Socket连接成功地在服务器端和客户端之间建立后:对服务器端来说,它的Socket是指定的IP地址和指定的端口号;对客户端来说,它的Socket是它所在计算机的IP地址和一个由操作系统分配的随机端口号。

UDP端口和TCP端口虽然都使用0~65535,但他们是两套独立的端口,即一个应用程序用TCP占用了端口1234,不影响另一个应用程序用UDP占用端口1234 

二、服务器端 

要使用Socket编程,我们首先要编写服务器端程序。Java标准库提供了ServerSocket来实现对指定IP和指定端口的监听。ServerSocket的典型实现代码如下:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.util.HashMap;
import java.util.Map;

public class WorkDisctServer {
	public static void main(String[] args) {
		
		Map<String, String> wordMap = new HashMap<String, String>(){
			{
				put("one", "壹");
				put("two", "贰");
				put("three", "叁");
				put("four", "肆");
				put("five", "伍");
				put("six", "陆");
				put("serven", "柒");
			}
		};
	
		try (DatagramSocket serverSocket = new DatagramSocket(7788)) {
			while(true) {
				// 准备"空"数据包
				byte[] buff = new byte[1024];// 原始的字节数组
				DatagramPacket packet = new DatagramPacket(buff, buff.length);
				
				// 读取(客户端发送的英文单词)
				// 接收数据包
				serverSocket.receive(packet);
				
				// 获取数据包中的"数据"(字节数组) 
				// 获取数据包中的“读取位置”(int类型)
				// 获取数据包中的“长度”
				String word = new String(
						packet.getData(),
						packet.getOffset(),
						packet.getLength());
				System.out.println("【服务器】:获取来自客服端的单词"+word);
				
				String chinese = wordMap.get(word);
				if(chinese == null) {
					chinese = "未知结果";
				}
				
				//发送(向客户端发送中文释义)
				byte[] resultbuff = chinese.getBytes();
				packet.setData(resultbuff);
				serverSocket.send(packet);
			
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	
	}

}

三、客户端

和服务器端相比,客户端使用UDP时,只需要直接向服务器端发送UDP包,然后接收返回的UDP包: 

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
import java.util.Scanner;

public class WorkDictClient {
	public static void main(String[] args) {

		Scanner input = new Scanner(System.in);

		while (true) {
			String word = input.nextLine();
			if (word.equals("end")) {
				break;
			}

			// 创建基于UDP协议的DatagramSocket对象
			try (DatagramSocket clientSocket = new DatagramSocket()) {
				// timeout超时
				clientSocket.setSoTimeout(2000);

				// 连接服务器(服务器IP和端口)
				clientSocket.connect(new InetSocketAddress("192.168.254.178", 7788));

				// 发送(向服务发送一个英文单词)
				// String word = "one";
				byte[] wordbuff = word.getBytes();// 获取英文单词字符串的字节数组

				// 封装成DatagramPacket对象(数据包)
				DatagramPacket packet = new DatagramPacket(wordbuff, wordbuff.length);

				// 发送数据包
				clientSocket.send(packet);

				// 读取
				byte[] resultbuff = new byte[1024];
				DatagramPacket resultPacket = new DatagramPacket(resultbuff, resultbuff.length);
				clientSocket.receive(resultPacket);

				String result = new String(resultPacket.getData(), resultPacket.getOffset(), resultPacket.getLength());
				System.out.println("来自服务器的中文释义" + result);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

区别

1.客户端创建DatagramSocket实例时并不需要指定端口,而是由操作系统自动指定一个当前未使用的端口。紧接着,调用setSoTimeout(1000)设定超时1秒,意思是后续接收UDP包时,等待时间最多不会超过1秒,否则在没有收到UDP包时,客户端会无限等待下去。这一点和服务器端不一样,服务器端可以无限等待,因为它本来就被设计成长时间运行。

2.如果客户端希望向两个不同的服务器发送UDP包,那么它必须创建两个DatagramSocket实例。后续的收发数据和服务器端是一致的。通常来说,客户端必须先发UDP包,因为客户端不发UDP包,服务器端就根本不知道客户端的地址和端口号。

易混淆知识点:

1.注意到客户端的DatagramSocket还调用了一个connect()方法“连接”到指定的服务器端。不是说UDP是无连接的协议吗?为啥这里需要connect()?

       这个connect()方法不是真连接,它是为了在客户端的DatagramSocket实例中保存服务器端的IP和端口号,确保这个DatagramSocket实例只能往指定的地址和端口发送UDP包,不能往其他地址和端口发送。这么做不是UDP的限制,而是Java内置了安全检查。

2.如果客户端认为通信结束,就可以调用disconnect()断开连接。

       disconnect()也不是真正地断开连接,它只是清除了客户端DatagramSocket实例记录的远程服务器地址和端口号.这样,DatagramSocket实例就可以连接另一个服务器端。

四、实现结果:


知识小结:

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

网络编程——UDP编程 的相关文章

  • C++第八次上机实验总结(多态)

    一 实验目的 xff1a 掌握C 43 43 语言多态性的基本概念 xff1b 掌握运算符重载函数的声明和定义方式 xff1b 二 试验任务 xff1a 1 编写一个程序 xff0c 实现两个负数相加 xff08 分别用类外定义运算符重载函
  • 机器学习实战之k-近邻算法(6)---手写数字识别系统(0-9识别)

    from numpy import import operator from os import listdir 创建数据集 def createDataSet group 61 array 1 0 1 1 1 0 1 0 0 0 0 0
  • termux—手机远程连接服务器教程

    文章目录 下载安装换源安装ssh软件连接服务器参考 下载安装 官网 可以从google play store下载安装 xff0c 也可从github上下载安装最新版本 app图标 安装完成后 xff0c 一些基础操作可以参考Termux 高
  • VScode主题色更换

    最新版VScode主题色更换 宝 xff0c 你是否有觉得它默认的黑色有点太晃眼 xff0c 想要拥有一个绿色或者浅色调的主题色呢 xff1f 当你想更换的时候你上网搜了很多 xff0c 发现版本不一样就是很迷惑呢 xff1f 让薇语帮你解
  • ROS学习笔记(1)ROS安装(推荐使用鱼香ROS安装工具,少走很多弯路)

    ROS安装 后记 xff1a 提前说一下 xff0c 按照网上的大部分ROS安装教程你会在下面的第四步遇到问题 xff0c 然后在网上找各种解决办法 xff0c 运气好的话你会很快解决 xff0c 但是也可能卡住半天没解决 xff08 比如
  • ubuntu18.04运行LiLi-OM

    一 上github下代码 https github com KIT ISAS lili om 1 1安装gtsam4 0 链接 xff1a GTSAM GTSAM is a BSD licensed C 43 43 library that
  • 软件KEIL串口应用-- printf调试

    KEIL5 里面实现printf的功能 xff0c 需要修改一个函数 重写 xff1a fputc 包含头文件 在当前 c文件中包含这两个头文件 重写函数 首先从原理图判断单片机芯片与上位机 xff08 电脑 xff09 通信是通过那个串口
  • 构造函数后加:符号

    分为三种情况 class animal public animal cout gt gt 34 animal 34 class fish public animal public fish animal cout gt gt 34 fish
  • 在gitee上新建仓库,将本地项目上传到新建的gitee仓库中

    1 首先登录gitee xff0c 点击右上角 43 号 xff0c 选择新建仓库 2 输入仓库名称及仓库简介 xff0c 选择是否开源 xff0c 下方的三个可不选 3 点击添加后 xff0c 页面如图所示 注 xff1a 此时gitee
  • L8Linux应用开发综合实战-在线词典项目(day1、2、3)

    目录 一 在线词典项目介绍及框架搭建 一 有道词典流程分析及本项目在线词典介绍 1 有道词典功能分析 2 项目流程 二 在线词典项目演示 三 流程示意图分析 1 客户端 2 服务器 四 客户端代码框架搭建 五 服务器端代码框架搭建 模板结构
  • matlab灰度图转化及二值化

    matlab灰度图转化及二值化 matlab提供图像处理功能 xff0c 我们可将彩色图像灰度化 xff0c 并对其进行二值化处理 xff0c 其简要代码如下 xff1a i span class token operator 61 spa
  • Docker - 编译安装nginx镜像

    目录 知识点1 xff1a 制作镜像的常用指令 RUN和CMD ENTRYPOINT的区别 首先需要一个安装nginx的脚本 制作Dockerfile 开始制作镜像 查看镜像是否制作成功 启动一个容器来测试镜像 编译安装ngixn镜像升级版
  • 阿克曼结构移动机器人的gazebo仿真(五)

    阿克曼结构移动机器人的gazebo仿真 xff08 五 xff09 第四章 用xacro优化URDF并配置gazebo仿真插件 0 前言 上节用简易模型写了一个小车的URDF代码 xff0c 这一节将用xacro对其进行优化 xff0c 这
  • 百度2014校园招聘笔试题武汉站三道算法设计题

    百度2014校园招聘笔试题武汉站三道算法设计题 1 给定任意一个整整数 求比这个数大且最小的不重复数 就是相邻两位不同 xff0c 例如1231 如1101就是重复数 解 xff1a 思路 xff1a 每次将给定的值加上1 xff0c 然后
  • gazebo版本升级以及环境太暗的解决方法

    gazebo升级 使用下列代码可将gazebo升级为该版本的最新版 xff0c 适用于gazebo7与gazebo9 添加源 sudo sh c 39 echo 34 deb http packages osrfoundation org
  • (3分钟了解)SLAM后端优化的四大金刚!g2o ceres gtsam SE-Sync

    后端优化常用的库有g2o ceres gtsam 和 se sync 这篇博客首先介绍se sync xff0c 然后比较四种库之间的差异 编辑切换为居中 添加图片注释 xff0c 不超过 140 字 xff08 可选 xff09 编辑切换
  • 基于Adams联合MATLAB的联合仿真设置

    因为最近在做一个四足机器人的仿真在网上找了一些资料基本上都不是说得很明白 下面是我参考了一些资料自己做的一个项目和对一些细节做的总结 xff0c 希望对大家有所帮助和解惑 本次联合仿真用到的软件主要是这三个Solidworks2018 Ad
  • MSC_ LICENSE. FILE = D:ladamsMAGNTUDElicense .dat

    ADAMS一段时间不使用后重新打开出现 解决办法 xff1a 1 找到原下载解压后的文件目录 2 点击MSC Calc 20161130 exe按照提示重新生成license dat文件 3 复制新的license dat文件到之前安装AD
  • 两块STM32F1之间互相通信(串口)

    首先准备两块STM32F103的板子 xff0c 以我这个为例 xff0c 我准备了一块STM32F103和CH32F103最小系统板子 xff0c 其他杜邦线 下载器及接线方法以及通信原理不再多说 这里我用的是STM32F103最小系统发
  • STM32单片机与蓝牙模块HC-05通信数据帧处理

    本章将会详细讲述蓝牙模块 xff08 HC 05 xff09 和STM32单片机之间的通信收发的数据如何处理 xff0c 在测试开始前首先在手机上下载好一个蓝牙调试APP xff0c 此APP可以是手机端和PC端口的 xff0c 以我常用的

随机推荐

  • N32G031固件库开发(三)基本TIM6定时器中断

    基本定时器 TIM6 基本定时器简介 基本定时器 TIM6 包含一个 16 位自动装载计数器 基本定时器主要特性 16位自动重载向上计数计数器 16位可编程预分频器 xff08 分频系数可配置为 1到 65536之间的任意值 xff09 产
  • N32G031固件库开发(四)通用定时器TIM3----PWM输出

    4 通用定时器 xff08 TIM3 xff09 通用定时器 xff08 TIM3 xff09 主要用于以下场合 xff1a 对输入信号进行计数 测量输入信号的脉冲宽度和产生输出波形等 4 1 TIM3 主要特性 16 位自动装载计数器 x
  • N32G031固件库开发(五)高级定时器TIM1----PWM输出

    高级控制定时器 xff08 TIM1 和 和 TIM8 xff09 5 1 TIM1 和 和 TIM8 简介 高级控制定时器 xff08 TIM1 和 TIM8 xff09 主要用于以下场合 xff1a 对输入信号进行计数 测量输入信号的脉
  • Java并发之semaphore(信号量)

    文章目录 1 官方解读2 通俗易懂的例子解析3 代码解析4 Semaphore的应用5 类结构和相关方法 1 类结构 2 acquire 方法 3 release 方法 6 总结 1 官方解读 semaphore信号量就是并发工具类 Sem
  • 程序员面试题精选100题(46)-对称子字符串的最大长度

    程序员面试题精选100题 46 xff0d 对称子字符串的最大长度 题目 xff1a 输入一个字符串 xff0c 输出该字符串中对称的子字符串的最大长度 比如输入字符串 google xff0c 由于该字符串里最长的对称子字符串是 goog
  • Ubuntu12.04执行apt-get update时报错的问题解决

    报错内容示例 W Failed to fetch http us old releases ubuntu com ubuntu dists precise updates Release gpg Something wicked happe
  • arduino烧写报错:can‘t open device “\\.\COM1“

    我的解决办法是拔掉usb xff0c 让它关机 xff0c 停止运行一会 xff0c 它便可恢复 记得之前也有一次 xff0c 那次解决好像是通过修改它的端口号 xff0c 例如我将它com8修改为com1 两个方法都可以尝试下 xff0c
  • UDP服务器/客户端Linux下C代码实现以及广播、组播

    目录 UDP广播流程 组播流程 UDP UDP xff08 User Datagram Protocol xff09 用户数据报协议 xff0c 是不可靠的无连接的协议 在数据发送前 xff0c 因为不需要进行连接 xff0c 所以可以进行
  • CMakeLists.txt常用语法

    CMakeLists txt常用语法 cmake minimum requiredprojectadd executableinclude directoriesadd libraryalias library xff08 别名库 xff0
  • git 合并分支

    假如我们现在在dev分支上 xff0c 刚开发完项目 xff0c 执行了下列命令 xff1a git add git commit m 39 提交的备注信息 39 git push u origin dev 想将dev分支合并到master
  • 月薪35k的简历是怎么包装的 ,让面试官心动的标准简历(附模板分享)

    有过面试的都知道 xff0c 不管怎样 xff0c 面试多多少少都和简历有这很重要的 毕竟面试官要通过简历了解面试者的基本信息 过往经历 xff0c 来判断面试者和岗位的匹配度 面试者期望通过简历把自己较好的一面体现给面试官 xff0c 所
  • 对无人机高度环的思考和第一次炸机体验

    前两天学长布置了一个任务 xff0c 大体就是在无人机起飞一段时间后再次改变飞行高度 一开始我觉得挺简单 xff0c 随便改改就行了 xff0c 所以今天才开始写 xff0c 然后 炸机了 先说说第一次炸机的体验 就是看到无人机炸机的疯狂往
  • 21年电赛无人机G题思路

    21年电赛结束了 xff0c 我们选择的题目是无人机G题 通过题目也能感受到今年的难度 xff0c 在这里旨在为大家提供一个G题的解题思路和方案 读完题目 xff0c 可以发现主要有两个难题需要解决 1 飞行路径问题 xff08 如何确保飞
  • 面试必问之Promise

    常见 Promise 面试题 1 了解 Promise 吗 xff1f 2 Promise 解决的痛点是什么 xff1f 3 Promise 解决的痛点还有其他方法可以解决吗 xff1f 如果有 xff0c 请列举 4 Promise 如何
  • js中的防抖和节流的原理

    在进行窗口的resize scroll xff0c 输入框内容校验等操作时 xff0c 如果事件处理函数调用的频率无限制 xff0c 会加重浏览器的负担 xff0c 导致用户体验非常糟糕 此时我们可以采用debounce xff08 防抖
  • 汽车CAN总线介绍

    CAN Controller Area Network 控制器局域网络 xff0c CAN网络在早期的整车应用中以BCM 车身控制器 为控制中心 xff0c 主要是车身零部件 雨刮 大灯 车窗 xff0c 智能硬件较少 xff0c 所以早期
  • /usr/bin/ssh-copy-id: ERROR

    搭建hadoop的时候不小心配错域名 导致配置免密码登陆的时候密码一直输入错误 重新修改域名后在配置就一直报错 解决办法 在 ssh目录下修改known hosts文件中配置错的域名 直接删除 重新执行命令 ssh copy id slav
  • 完整安装PX4/PX4-Autopilot,无需科学上网。

    安装自https github com PX4 PX4 Autopilot 的px4功能包 xff0c 因为需要科学上网似乎会失败 xff0c 这里采用其他方法来安装 截止到2022年9月 https hub fastgit xyz这个镜像
  • linux 安装docker报错解决

    出现问题说明 xff1a 当已经确定好了docker安装好了 xff08 用dockers version确认版本的情况下 xff09 一般可以正常运行 xff0c 但是用命令查看systemctl status docker运行状态时 x
  • 网络编程——UDP编程

    一 网络编程基础 计算机网络是指两台或更多的计算机组成的网络 xff0c 在同一个网络中 xff0c 任意两台计算机都可以直接通信 xff0c 因为所有计算机都需要遵循同一种网络协议 因此 xff0c 为了把计算机网络接入互联网 xff0c