Java网络编程学习笔记,从网络编程三要素到TCP/UDP协议

什么是网络编程

什么是网络编程,相比于编写程序在本机上运行,网络编程是指编写两台不同的计算机的程序,基于网络协议,通过网络进行数据通信。

常见的网络程序软件架构有:BS(Broser浏览器/Server服务器)架构、CS(Client客户端/Server服务器)架构

  1. BS架构:优势是用户不用下载客户端,使用浏览器即可快速获取服务,运营者可随时更新程序。劣势是所有程序和资源需要通过网络传输,产品精美和细腻程度不及CS架构的产品。
  2. CS架构:优略势与BS架构相反。优势是用户提前下载好程序的所有资源,产品的精美和细腻程序可以做到非常高,而且可以更好的利用本地计算机算力,比如3A游戏都是CS架构。劣势是需要用户下载客户端程序,程序更新时比较麻烦,需要客户端更新软件。

网络编程三要素

要实现网络编程,必须实现网络通信需要确定通信对象(IP)、对象中的具体程序(端口)、通信规则(协议)。

第一步,首先要在网络中,找到对方的计算机设备。计算机网络中,IP是网络设备的唯一地址。
第二步,在对方的计算机设备中,找到要通信的软件,因为计算机中可能运行很多程序。比如微信服务端要发送数据到用户手机,需要找到用户手机中的微信客户端,而用户手机中可能有微信、QQ、淘宝等很多应用程序。计算机网络中,端口号是区分程序进程的编号。
第三步,需要确定通信方式,即网络协议。计算机网络协议有TCP、UDP、HTTP等协议。

所以,网络编程的三要素就是:IP、端口号、网络协议

IP

IP是网络通信中,设备的地址,具有唯一性。

IP有IPV4和IPV6两种。

IPV4

IPV4是指IP互联网通信协议第四版,IPV4用4个字节共32位,用4组(每组1个字节)来表示,比如:11000000 10101000 00000001 00000001。IPV4采用点分十进制,即使用符号点.来分组,采用十进制表示。因此,上述IPV4地址表示为:192.168.1.1

IPV4共32位,因此可以区分的地址有2的32次方共计4,294,967,296,而全球有数十亿人,每个人又有数台可上网的设备。因此,IPV4的地址是不够用的,实际上,IPV4早在2019年就已经用完了。

IPV4已经用完了,而IPV6并没有大规模普及,那IPV4是如何解决当前设备IP地址不够的问题?答案是使用局域网。IPV4规定192.168.0.0~192.168.255.255这些为局域网IP(还有其他私有IP段,不展开),一个区域内(比如一个网吧)的所有设备,使用一个公网IP,而所有区域内的网络设备,使用局域网IP。局域网内的所有设备上网,都使用公网IP对外传输和接收数据,然后通过NAT(网络地址转换)技术,将局域网各设备的数据包,再分发给各自设备。

公网IP+局域网IP的技术,造成了我们目前使用设备的IPV4地址都是192.168.X.X的原因。

局域网IP地址,一般是路由器通过DHCP技术随机分配给网络设备的,一段时间后局域网IP地址会改版。除此之外,我们的设备在不同的上网环境,路由器分配的局域网地址一般都是不同的,比如在教师里连WIFI,笔记本电脑被分配的局域网地址可能是192.168.10.245,而回到寝室,连有线网,笔记本电脑被分配的局域网地址变成了192.168.1.3。因此,本机程序之间进行通信,不能使用局域网IP地址,而是使用一个被称为本机IP或者回环地址的特殊IP:127.0.0.1。网络设备在识别到回环地址作为目标地址,不会将数据传输到路由器或者网关,而是直接传给本机。

IPV6

为解决IP枯竭问题,IPV6横空出世。IPV6采用16个字节128位,共8组(每组两个字节)来表示,比如:11111101 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001。IPV6采用冒分十六进制,即使用符号冒号:来分组,采用十六进制来表示。因此,上述IPV6地址表示为:fd00:0000:0000:0000:0000:0000:0000:0001。由于IPV6地址很长,因此固定可以省略每一最前面的一连串0,因此上述IPV6地址可简写为:fd00:0:0:0:0:0:0:1。并且,规定可以进一步将中间的0省略,即压缩表示为:fd00::1

IPV6共128位,因此可以区分的地址为2的128次方个,可以为地球上每一粒沙子都分配一个唯一的IP地址。因此,IPV6一定是足够人们使用。目前,IPV6正在逐步推广,全面取代IPV4仍需时间,目前很多环境是双栈(IPV4+IPV6)运行。

端口

端口是计算机中应用程序向外发送数据/接收数据的“口”,每个应用程序都有一个端口号。

端口号是用两个字节来表示的,也就是一共有0~65535,一共65536个端口号。

应用程序启动时,操作系统会为应用程序分配一个端口号,应用程序就用这个端口号向网络收发数据。

协议

网络协议是指网络通信、数据传输的标准或规范。计算机网络中有OSI七层模型和TCP/IP模型,其中TCP/IP模型将网络划分为应用层、传输层、网络层和物理链路层,TCP/IP模型是行业默认的标准。

TCP/IP模型中不同层有不同的网络协议,比如HTTP、FTP等就是应用层的协议,而TCP、UDP是传输层的协议,IP是网络层的协议。

UDP 程序通信

UDP协议特点是无连接,发送后不管,所以速度快。

创建UDP发送数据的程序步骤:

  1. 创建一个发送数据的通信端点,需包括网络编程三要素:IP、端口和协议。发送时的IP是本机IP,无法自定义(更准确的是:在创建DatagramSocket时,可以用带IP对象的构造函数绑定到指定的本地IP地址和端口,但是一般不用IP对象作为构造函数参数,默认为本机IP)。端口号可指定发送端口号,但是由于端口号不能与别的程序占用的端口号,因此一般使用系统给的端口号。协议则体现到类上,UDP使用DatagramSocket。
  2. 封装数据包。就像封装发送出去的快递包需要包含收货地址和收货人。UDP数据包需要包含发送的数据本身(字节数组)、目标地址(IP),目标端口号。其中,IP需要使用IP类InetAddress创建对象。UDP数据包为DatagramPacket类,需要用字节数组数据本身、IP对象和端口号封装。
  3. 发送数据。DatagramSocket对象调用方法发送数据包。
  4. 释放资源。DatagramSocket对象存在时占用了系统资源,因为系统开辟了端口号让程序独占使用,因此需要调用close()方法释放资源。
// 发送端publicclassSendMessage{publicstaticvoidmain(String[]args)throwsIOException{// 1. 创建一个发送UDP的通信对象DatagramSocketsocket=newDatagramSocket();// 2. 封装数据包// 目的地址和端口Stringip="127.0.0.1";// 发送到本机,用回环地址InetAddressdestinationIP=InetAddress.getByName(ip);// 目的地址intdestinationPort=10086;// 待发送的数据Stringdata="hello, world";// 待发送的数据:hello, worldbyte[]dataBytes=data.getBytes();// 转换为字节数组DatagramPacketpacket=newDatagramPacket(dataBytes,dataBytes.length,destinationIP,destinationPort);// 数据包对象// 3. 发送数据包socket.send(packet);// 4. 释放资源socket.close();}}

UDP接收数据的程序步骤:

  1. 同发送数据相似,需要创建一个接收数据的通信端点,也是包括网络编程三要素:IP、端口和协议。接收时的IP是本机号。端口号需要注意,要使用与发送数据中的发送数据包的目标端口号,不对应则接收不到数据。协议也是体现到类上,UDP为DatagramSocket。
  2. 接收数据。发送数据的是DatagramPacket对象,接收数据也需要用一个DatagramPacket对象进行接收,可以想象为收快递时,需要用一个快递盒子去接收。与发送时需要数据包DatagramPacket对象需要包含数据本身(字节数组)、目标地址(IP),目标端口号等内容时不同,接收数据的数据包,只需要定义数据包的大小即可(字节数组和接收数据的长度)。
  3. 解析数据。接收的是DatagramPacket对象,调用相应的方法,可以获取数据包的数据本身、来源地址(IP)、来源端口号。
  4. 关闭资源。与发送数据相同,需要调用close()方法释放资源。
// 接收端publicclassReceiveMessage{publicstaticvoidmain(String[]args)throwsIOException{// 1. 创建一个接收UDP的通信对象DatagramSocketsocket=newDatagramSocket(10086);// 指定接收端口为10086// 2. 接收数据byte[]buffer=newbyte[1024];// 创建一个1024字节的字节数组作为数据缓冲区,用于临时存储从网络接收到的数据DatagramPacketpacket=newDatagramPacket(buffer,buffer.length);// 创建一个数据包对象,最大接收数据长度为数组长度socket.receive(packet);// 3. 解析数据byte[]data=packet.getData();// 获取数据包中的数据StringreceivedData=newString(data,0,packet.getLength());// 将数据转换为字符串InetAddresssourceAddress=packet.getAddress();// 获取发送方的IP地址StringsourceAddressStr=sourceAddress.getHostAddress();// 解析为IP地址字符串intsourcePort=packet.getPort();// 获取发送方的端口号// 打印出接收到的数据和发送方的IP地址及端口号System.out.println("收到来自IP为"+sourceAddressStr+",端口号为"+sourcePort+"的数据:"+receivedData);// 4. 释放资源socket.close();}}
收到来自IP为127.0.0.1,端口号为65290的数据:hello, world 进程已结束,退出代码为0

TCP 程序通信

TCP协议是建立连接的协议,也就是在发送数据之前,需要先建立连接,连接建立失败则会异常,不可发送数据。TCP协议与UDP协议不同,TCP发送数据无需封装成数据包,还是通过数据流发送数据,因此发送和接收数据如同IO流。

TCP协议需要通过三次握手建立连接:

  1. 第一次握手:客户端往服务端发送信息,请求建立连接
  2. 第二次握手:服务端发送信息,表明统一建立连接。此时,服务端已就绪,等待客户端确认就绪
  3. 第三次握手:客户端往服务端发送消息,表明自己已就绪,准备发送数据。服务端收到消息,确认客户端就绪,等待收取消息。

创建TCP发送消息的程序步骤为:

  1. 创建一个客户端的通信端点,与UDP的DatagramSocket不需要接收端IP和端口号作为参数不同(因为接收端IP和端口号被封装到了数据包DatagramPacket内),客户端Socket对象在创建时就需要接收端IP和端口号,因为在发送数据之前,就要与服务端建立连接(创建对象时就建立连接)。客户端Socket对象创建与DatagramSocket相似点在于,可以不指定本机的IP和端口号,使用系统给的端口号和本机IP。
  2. 从Socket中获取发送数据的输出流(原始字节流出留),通过输出流发送数据。Socket输出流是IO流,因此也可以使用字节流、字符流、转换流、缓冲流等原始流和处理流。
  3. 释放资源。创建Socket占用系统资源,因为系统分配了端口号,需要调用close()方法释放资源。此外,IO流也需要关闭。需要注意,释放资源有一定顺序,客户端发送完数据立马进行关闭,存在两种可能:1. 数据还在缓冲区未被完全发送;2. 服务端未完全接收数据。因此,使用flush()让缓冲区的数据立即发送。
// 客户端publicclassClient{publicstaticvoidmain(String[]args)throwsIOException{// 1. 创建一个Socket对象Socketsocket=newSocket("127.0.0.1",52522);// 指定接收端的IP和端口// 2. 通过Socket对象获取输出流OutputStreamos=socket.getOutputStream();BufferedOutputStreambos=newBufferedOutputStream(os);// 使用缓冲流(仅做演示,非必须)OutputStreamWriterosw=newOutputStreamWriter(bos);// 使用OutputStreamWriter将字节流转换为字符流osw.write("Hello, Server!");// 写入数据osw.flush();// 刷新缓冲区,确保数据发送// 3. 释放资源(按正确顺序)osw.close();// 释放字符流资源bos.close();// 释放缓冲流资源socket.close();// 释放Socket资源,自动关闭底层的字节输入流和字节输出流}}

创建TCP接收消息的程序步骤为:

  1. 创建一个接收数据的通信端点。与UDP不同,TCP的服务端采用与客户端不同的类ServerSocket。端口号与UDP协议相似,要使用客户端Socket目标端口号相同的端口号,不对应则接收不到数据。
  2. 等待与客户端建立连接。调用accept()方法,一直监听端口,等待客户端进行三次握手建立连接。建立连接之前,线程是阻塞的状态。链接建立后,返回一个客户端Socket对象。
  3. TCP建立连接后,通过IO流传输数据。发送端是Output,接收端是Input。因此,从Socket对象中获得IO基本的字节输入流。
  4. 解析数据。字节输入流可以通过字符流、转换流、缓冲流等处理流,处理解析数据。
  5. 释放资源。释放IO流和Socket资源。
// 服务器端publicclassServer{publicstaticvoidmain(String[]args)throwsIOException{// 1. 创建一个ServerSocket对象ServerSocketserverSocket=newServerSocket(52522);// 2. 等待与客户端建立连接Socketsocket=serverSocket.accept();// 链接建立后,返回一个Socket对象// 3. 获得字节输入流对象InputStreamis=socket.getInputStream();// 4. 将字节输入流转换为字符输入流,读取数据并打印成字符串InputStreamReaderisr=newInputStreamReader(is);intlen=0;char[]chs=newchar[1024];if((len=isr.read(chs))!=-1){System.out.println(newString(chs,0,len));}// 一般情况下,服务器端会循环接收多个客户端的请求// 无需手动关闭Socket// 5. 释放资源isr.close();// 关闭字符输入流// is.close(); // 无需手动关闭字节输入流socket.close();// 关闭Socket,会自动关闭底层的字节输入流和字节输出流}}

TCP协议建立连接需要三次握手,关闭连接需要四次挥手。

  1. 第一次挥手:客户端发起信息,请求关闭连接。
  2. 第二次挥手:服务端收到信息,但是收到客户端发送关闭连接请求时,服务端还没有完全收全所有之前发送的数据。但是,服务端需要让客户端知道它收到了关闭连接的请求。因此,服务端会给客户端发送确认收到关闭请求的信息。
  3. 第三次挥手:当服务端接收完所有数据后,会再次给客户端发送一条信息,表明自己已经安全收到所有传输的数据。发送确认关闭连接的信息给客户端,表明服务器已就绪,准备关闭。
  4. 第四次挥手:当客户端收到服务端发送的关闭确认请求后,发送一个自己已确认关闭连接的请求,发送后,客户端关闭连接。而服务器收到信息后,也关闭连接。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1198499.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NewBie-image-Exp0.1部署卡顿?Flash-Attention启用教程提速50%

NewBie-image-Exp0.1部署卡顿?Flash-Attention启用教程提速50% 你是不是也遇到了这种情况:明明已经用上了预配置镜像,结果跑NewBie-image-Exp0.1生成动漫图时还是卡得不行?等一张图生成要好几分钟,显存占用高不说&…

基于“身份证精准识别+炫彩活体检测+权威数据比对”三位一体的人脸核身技术,筑牢数字经济的身份安全防线

金融业的数字化转型正步入深水区,远程开户作为服务线上化的关键入口,其安全与合规性已成为行业发展的生命线。中科逸视基于“身份证精准识别炫彩活体检测权威数据比对”三位一体的人脸核身技术,为金融机构构建了既符合监管刚性要求、又兼顾用…

如何测试Speech Seaco Paraformer性能?处理速度评测教程

如何测试Speech Seaco Paraformer性能?处理速度评测教程 1. 引言:为什么需要评测语音识别模型的性能? 你有没有遇到过这种情况:录了一段重要的会议内容,结果转文字时错得离谱,关键人名、专业术语全被识别…

通义实验室推荐:Cute_Animal_For_Kids_Qwen_Image最佳运行环境配置

通义实验室推荐:Cute_Animal_For_Kids_Qwen_Image最佳运行环境配置 你是不是也遇到过这样的情况:想给孩子准备一张萌萌的卡通小猫图做绘本封面,却在一堆AI绘图工具里反复试错,不是画风太成人化,就是细节太复杂、线条太…

绝对路径设置技巧,避免BSHM输入报错

绝对路径设置技巧,避免BSHM输入报错 在使用 BSHM 人像抠图模型进行图像处理时,一个看似简单却极易被忽视的细节——输入路径的写法,往往成为导致推理失败的“隐形杀手”。许多用户在调用 inference_bshm.py 脚本时遇到“文件未找到”或“路径…

信任驱动:客服AI系统与智能AI客服重构电商服务价值

信任驱动:客服AI系统与智能AI客服重构电商服务价值一、行业核心矛盾:效率饱和下的信任缺失困局电商存量竞争中,客服已成为用户留存关键,但服务模式陷入“效率达标、信任不足”的矛盾。电商客服年流失率30%-40%,新人培训…

Sambert性能优化:让语音合成速度提升50%

Sambert性能优化:让语音合成速度提升50% 1. 引言:为什么我们需要更快的中文语音合成? 你有没有遇到过这种情况:在开发一个智能客服系统时,用户输入一句话,等了三四秒才听到回复?或者在生成有声…

Qwen3-0.6B省钱部署方案:按需计费GPU+开源镜像组合优化教程

Qwen3-0.6B省钱部署方案:按需计费GPU开源镜像组合优化教程 1. 为什么选择Qwen3-0.6B做轻量级部署? 在大模型越来越“卷”的今天,动辄几十亿、上百亿参数的模型虽然能力强大,但对普通开发者和中小企业来说,部署成本高…

手机拍文档模糊怎么办?OCR镜像低阈值检测来帮忙

手机拍文档模糊怎么办?OCR镜像低阈值检测来帮忙 在日常办公、学习或生活中,我们经常需要通过手机拍摄文档、合同、发票等纸质材料,并将其转换为可编辑的电子文本。然而,现实往往不尽如人意:光线不均、手抖对焦不准、纸…

Qwen1.5-0.5B训练后微调?原生框架扩展指南

Qwen1.5-0.5B训练后微调?原生框架扩展指南 1. 🧠 Qwen All-in-One: 单模型多任务智能引擎 基于 Qwen1.5-0.5B 的轻量级、全能型 AI 服务 Single Model, Multi-Task Inference powered by LLM Prompt Engineering 你有没有遇到过这样的问题:想…

升级版操作体验:Open-AutoGLM最新功能实测反馈

升级版操作体验:Open-AutoGLM最新功能实测反馈 1. 引言:当AI真正“上手”你的手机 你有没有想过,有一天只需要说一句“帮我订张明天上午去上海的高铁票”,手机就能自动打开铁路App、登录账号、选择车次、填写信息、完成支付——…

BGE-M3开箱即用:快速搭建企业文档检索平台

BGE-M3开箱即用:快速搭建企业文档检索平台 1. 引言:为什么你需要一个智能文档检索系统? 在现代企业中,知识资产往往分散在成千上万的文档、报告、邮件和会议记录中。当员工需要查找某个政策条款、技术参数或历史决策时&#xff…

GPEN镜像亲测报告:修复效果与操作便捷性双优

GPEN镜像亲测报告:修复效果与操作便捷性双优 最近在尝试人像修复相关的AI工具时,接触到了一个名为 GPEN人像修复增强模型 的CSDN星图镜像。说实话,一开始只是抱着“试试看”的心态部署了一下,结果却让我有点惊喜——不仅操作极其…

AI绘画辅助工具:BSHM提供高质量素材源

AI绘画辅助工具:BSHM提供高质量素材源 在数字艺术创作领域,高质量的图像素材是提升作品表现力的关键。无论是电商设计、影视后期还是AI绘画创作,精准的人像抠图能力都至关重要。传统手动抠图耗时耗力,而自动化工具往往难以处理发…

测试开机启动脚本权限设置详解,chmod一步到位

测试开机启动脚本权限设置详解,chmod一步到位 1. 开机自启脚本的核心问题:权限与执行环境 你有没有遇到过这样的情况:写好了一个启动脚本,配置了开机自动运行,结果重启后发现什么都没发生? 不是脚本没执行…

Seaborn 进阶:超越基础图表,深入统计建模可视化与高级定制

好的,遵照您的需求,以下是一篇关于 Seaborn 统计绘图的深度技术文章,专注于其统计模型可视化、高级定制化以及与 Matplotlib 的深度融合,并力求通过新颖的案例和深度的解析,满足开发者的阅读需求。Seaborn 进阶&#x…

亲测Qwen3-Reranker-0.6B:多语言检索效果超预期

亲测Qwen3-Reranker-0.6B:多语言检索效果超预期 1. 引言:为什么重排序模型正在成为RAG的关键拼图 在当前生成式AI广泛应用的背景下,越来越多企业选择通过检索增强生成(RAG)来提升大模型输出的准确性与可控性。但一个…

亲测科哥AI抠图镜像:发丝级人像分离效果惊艳,小白秒变高手

亲测科哥AI抠图镜像:发丝级人像分离效果惊艳,小白秒变高手 1. 为什么这款AI抠图工具值得你立刻上手? 你有没有遇到过这样的情况:一张特别好的人像照片,背景却杂乱无章;想做个电商主图,结果抠图…

效果惊艳!YOLO26镜像打造的工业质检案例展示

效果惊艳!YOLO26镜像打造的工业质检案例展示 1. 引言:工业质检迎来AI革命 在现代制造业中,产品质量是企业的生命线。传统的人工质检方式不仅效率低、成本高,还容易因疲劳或主观判断导致漏检和误检。随着AI技术的发展&#xff0c…

从源码到UI:DeepSeek-OCR-WEBUI镜像让部署变得简单

从源码到UI:DeepSeek-OCR-WEBUI镜像让部署变得简单 1. 为什么OCR部署总是“看着简单,动手就卡”? 你有没有这样的经历:看到一个OCR项目介绍得天花乱坠,点进GitHub发现文档写得满满当当,结果自己一上手&am…