TCP、UDP协议的应用、ServerSocket和Socket、DatagramSocket和DatagramPacket

DAY13.1 Java核心基础

TCP协议

TCP 协议是面向连接的运算层协议,比较复杂,应用程序在使用TCP协议之前必须建立连接,才能传输数据,数据传输完毕之后需要释放连接

就好比现实生活中的打电话,首先确保电话打通了才能进行通信,如果没有打通则阻塞,需要等待打通才能对话

TCP优缺点:

  • 优点:安全可靠,数据不会丢失,并且数据是按照先后顺序依次到达
  • 缺点:速度慢,效率低,常用于对于业务安全要求较高的场景

Java中如何使用 TCP 呢?

java中通过Socket类来建立TCP连接,使用这个类可以在服务端和客户端建立一个可靠的连接

Socket表示客户端,ServerSocket表示服务端

它们都在java.net包中

在服务端创建ServerSocket对象,通过对象的accept()方法可以接收到若干个表示客户端的Socket对象

ServerSocket

方法描述
public ServerSocket(int port)根据端口创建 ServerSocket 实例对象
public ServerSocket(int port,int backlog)根据端口和 backlog 创建 ServerSocket 对象
public ServerSocket(int port,int backlog,InetAddress address)根据端口、backlog、IP 创建 ServerSocket对象
public ServerSocket()创建没有绑定服务器的 ServerSocket 对象
public synchronized int getSoTimeout()获取 Sotimeout 的设置
public InetAddress getInetAddress()获取服务器的 IP 地址
public Socket accept()等待客户端请求,并返回 Socket 对象
public void close()关闭 ServerSocket
public boolean isClosed()返回 ServerSocket 的关闭状态
public void bind(SocketAddress address)将 ServerSocket 实例对象绑定到指定地址
public int getLocalPort()返回 ServerSocket 的端口

Socket

方法描述
public Socket(String host,int port)根据主机、端口创建 Socket 对象
public Socket(InetAddress host,int port)根据 IP、端口创建 Socket 对象
public Socket(String host,int port,InetAddress address,int localPort)根据主机、端口创建要连接的 Socket 对象并将其连接到指定的远程主机上的指定端口
public Socket(InetAddress host,int port,InetAddress address,int localPort)根据主机、端口创建要连接的 Socket 对象并将其连接到指定的远程主机上的指定端口
pubilc Socket()创建没有连接的 Socket 对象
public InputStream getInputStream()返回 Socket 的输入流
public synchronized void close()关闭 Socket
public boolean isClosed()返回 Socket 的关闭状态、

DataInputStream 的作用

读取基本数据类型:提供方法直接读取二进制数据为Java基本类型,例如:

  • int readInt():读取4字节为int。
  • double readDouble():读取8字节为double。
  • String readUTF():读取修改后的UTF-8编码字符串。

跨平台一致性:数据以**网络字节序(Big-Endian)**存储,确保不同平台间数据读写兼容。

DataOutputStream 的作用

写入基本数据类型:将Java基本类型转换为字节序列写入流中,例如:

  • void writeInt(int v):将int写入为4字节。
  • void writeDouble(double v):将double写入为8字节。
  • void writeUTF(String str):以修改后的UTF-8格式写入字符串。

数据序列化:常用于将数据结构(如对象的字段)转换为字节流,便于存储或网络传输。

服务端启动的时候可以接收多个客户端的信息

服务端:ServerSocket

public class Server {public static void main(String[] args) {ServerSocket serverSocket = null;Socket socket = null;OutputStream outputStream = null;InputStream inputStream = null;DataInputStream dataInputStream = null;DataOutputStream dataOutputStream = null;try {serverSocket = new ServerSocket(8080);System.out.println("------服务端------");System.out.println("已启动,等待接收客户端请求...");while (true){socket = serverSocket.accept();inputStream = socket.getInputStream();dataInputStream = new DataInputStream(inputStream);String request = dataInputStream.readUTF();System.out.println("接收到了客户端请求:" + request);outputStream = socket.getOutputStream();dataOutputStream = new DataOutputStream(outputStream);String response = "Hello World";dataOutputStream.writeUTF(response);System.out.println("给客户端做出响应:" + response);}} catch (Exception e){} finally {try {dataOutputStream.close();outputStream.close();dataInputStream.close();inputStream.close();socket.close();serverSocket.close();} catch (IOException e) {e.printStackTrace();}}}
}

核心就是通过while循环accept()接收客户端的连接,然后通过DataInputStream和DataOutputStream实现了接收和发送的业务

启动等待客户端连接…

image-20250317173719789

客户端:Socket

public class Client {public static void main(String[] args) {Socket socket = null;OutputStream outputStream = null;DataOutputStream dataOutputStream = null;InputStream inputStream = null;DataInputStream dataInputStream = null;try {socket = new Socket("127.0.0.1", 8080);System.out.println("------客户端------");String request = "你好!";System.out.println("客户端说:" + request);outputStream = socket.getOutputStream();dataOutputStream = new DataOutputStream(outputStream);dataOutputStream.writeUTF(request);inputStream = socket.getInputStream();dataInputStream = new DataInputStream(inputStream);String response = dataInputStream.readUTF();System.out.println("服务器的响应是:" + response);} catch (Exception e){} finally {try {inputStream.close();dataInputStream.close();dataOutputStream.close();outputStream.close();socket.close();} catch (IOException e) {e.printStackTrace();}}}
}

客户端接收到的消息:

image-20250317174101983

此时服务端的输出为:

image-20250317174050370

UDP协议

TCP 协议连接可以建立稳定可靠的连接,保证信息的完整性,但是它的缺点也很明显,先建立连接再进行操作的方式效率必然低下

实际开发应用中,有些场景不需要可靠的连接,而是需要效率很高的传输,但连接不可靠,容易数据丢失

TCP:打电话,需要建立连接

UDP(发送消息,不需要建立连接):

  • 效率高,速度快,不需要建立连接,直接发送即可
  • 连接不可靠,容易数据丢失,安全性不高

DatagramSocket和DatagramPacket

DatagramSocket (邮箱,等待接收消息):

方法描述
public DatagramSocket(int port)根据端口创建 DatagramSocket 实例对象
public void send(DatagramPacket p)发送数据报
public synchronized void receive(DatagramPacket p)接收数据报
public InetAddress getInetAddress()获取 DatagramSocket 对应的 InetAddress 对象
public boolean isConnected()判断是否连接到服务

DatagramPacket(信封:封装发送的消息以及发送的地址):

方法描述
public DatagramPacket(byte[] buff,int length,InetAddress address,int port)根据发送的数据、数据长度、IP、端口创建 DatagramPacket 对象
public synchronized byte[] getData()获取接收的数据
public synchronized int getLength()获取数据长度
public synchronized int getPort()获取发送数据的 Socket 端口
public synchronized SocketAddress getSocketAddress()获取发送数据的 Socket 信息

客户端A:

public class TerminalA {public static void main(String[] args) {// 创建信箱try {byte[] buff= new byte[1024];SocketAddress socketAddress =new InetSocketAddress("127.0.0.1",8081);DatagramPacket datagramPacket= new DatagramPacket(buff,buff.length,socketAddress);DatagramSocket datagramSocket =new DatagramSocket(8080);// 等待接收8081信箱的消息System.out.println("客户端A等待接收消息....");datagramSocket.receive(datagramPacket);// 接收消息String msg = new String(datagramPacket.getData(),0,datagramPacket.getLength());System.out.println("接收到来自"+datagramPacket.getAddress()+":"+datagramPacket.getPort()+"端口的消息:"+msg);// 发送消息String s = "你好我是客户端A";byte[] bytes = s.getBytes();DatagramPacket datagramPacket1 =new DatagramPacket(bytes,bytes.length,new InetSocketAddress("127.0.0.1",8081));datagramSocket.send(datagramPacket1);} catch (IOException e) {throw new RuntimeException(e);}}
}

image-20250318114800461

如果没有消息则一直阻塞等待

阻塞发生在 datagramSocket.receive(datagramPacket);

客户端 B:

public class TerminalB {public static void main(String[] args) {try {// 创建信箱DatagramSocket datagramSocket =new DatagramSocket(8081);// 发送消息给8080String s = "你好我是客户端B";byte[] bytes = s.getBytes();DatagramPacket datagramPacket1 =new DatagramPacket(bytes,bytes.length,new InetSocketAddress("127.0.0.1",8080));datagramSocket.send(datagramPacket1);// 接收消息SocketAddress socketAddress =new InetSocketAddress("127.0.0.1",8080);byte[] buff= new byte[1024];DatagramPacket datagramPacket= new DatagramPacket(buff,buff.length,socketAddress);// 等待接收8080信箱的消息System.out.println("客户端B等待接收消息....");datagramSocket.receive(datagramPacket);String msg = new String(datagramPacket.getData(),0,datagramPacket.getLength());System.out.println("接收到来自"+datagramPacket.getAddress()+":"+datagramPacket.getPort()+"端口的消息:"+msg);} catch (IOException e) {throw new RuntimeException(e);}}
}

发送消息给A,A给B回信

image-20250318114859741

image-20250318114847927

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

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

相关文章

如何在 GoLand 中设置默认项目文件夹

在使用 GoLand 进行开发时,设置一个默认的项目文件夹可以大大提高工作效率。默认项目文件夹会在你打开或新建项目时自动预选,避免每次都需要手动导航到目标目录。本文将详细介绍如何在 GoLand 中设置默认项目文件夹。 步骤一:打开系统设置 …

SvelteKit 最新中文文档教程(5)—— 页面选项

前言 Svelte,一个语法简洁、入门容易,面向未来的前端框架。 从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 6 年一直是开发者最感兴趣的前端框架 No.1: Svelte …

Mac下Ollama安装全攻略:开启本地大模型之旅

文章目录 Mac下Ollama安装全攻略:开启本地大模型之旅一、Ollama 是什么功能特点优势应用场景 二、安装前准备(一)系统要求(二)硬件要求 三、下载安装包(一)官网下载(二)其…

华为营销流程落地方案:MTC=MTL+LTC

目录 简介 MTC流程 作者简介 简介 只讲最本质的底层逻辑,交付可落地的方案。 作为一个主打实践的产品老炮,接下来我将结合自己的经验, 以华为系的这套流程为基准, 将涉及业务层次的流程全部重构一套本地化、落地化的方案。 …

vscode使用ssh同时连接主机CentOS:user和ubuntu20.04:docker

主机为CentOS docker为Ubuntu20.04 两者可以使用一个vscode远程链接 1.使用已拉取好的Ubuntu镜像建立docker容器 2.进入容器内,下载一些关于ssh的安装包 apt-get install vim apt-get install openssh-client apt-get install openssh-server apt-get install ssh passwd …

NFS网络文件共享服务

文章目录 1. NFS工作原理1.1 挂载结构介绍1.2 NFS的工作原理 2. NFS服务安装2.1 NFS软件列表2.2 启动NFS相关服务2.3 NFS服务常见进程2.4 实战配置NFS服务器端 3. NFS服务配置3.1 在NFS Server端执行的操作3.1.1 查看部署环境3.1.2 启动rpcbind及NFS服务,然后加入开…

《多语言实时交流辅助系统前端的设计与实现》开题报告

个人主页:大数据蟒行探索者 目录 一、选题目的与意义 1.选题目的 2选题意义 2.1技术挑战与创新 2.2市场需求 2.3促进文化交流 2.4教育应用 2.5社会影响 二、研究现状与文献综述 1.研究现状 2.文献综述 2.1 前端技术的发展与应用 2.2 自然语言处理技术…

SpringCloud网关:Gateway路由配置与过滤器链

文章目录 引言一、Gateway基本架构二、路由配置方式2.1 配置文件方式2.2 Java代码方式 三、内置断言工厂四、内置过滤器工厂4.1 请求路径相关过滤器4.2 请求和响应头过滤器4.3 功能性过滤器 五、自定义过滤器5.1 自定义GatewayFilter5.2 自定义过滤器工厂 六、全局过滤器总结 引…

咖啡点单小程序毕业设计(JAVA+SpringBoot+微信小程序+完整源码+论文)

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍: 随着社会的快速发展和…

Excel(函数进阶篇):Vlookup函数进阶、TAKE嵌套SORE函数、SUBTOTAL函数、INDIRECT函数

目录 Vlookup函数返回多列结果Vlookup函数多条件匹配Vlookup函数部分匹配TAKE函数嵌套SORT函数,提取排序数据SUBTOTAL函数:制作动态报表SUBTOTAL函数:创建连续编号INDIRECT函数Vlookup跨多表抓取数据INDIRECT函数常见跨表的错误Vloopup函数联…

大模型 VS 传统算法:人工智能时代的“新老对话“

大模型 VS 传统算法:人工智能时代的"新老对话" 在AlphaGo击败李世石、ChatGPT掀起全民AI热潮的今天,人们往往将"大模型"与"算法"混为一谈。但当我们深入技术内核时会发现,这二者恰似人工智能发展的两个平行宇…

【蓝桥杯每日一题】3.17

🏝️专栏: 【蓝桥杯备篇】 🌅主页: f狐o狸x 他们说内存泄漏是bug,我说这是系统在逼我进化成SSR级程序员 OK来吧,不多废话,今天来点有难度的:二进制枚举 二进制枚举,就是…

Matlab 汽车振动多自由度非线性悬挂系统和参数研究

1、内容简介 略 Matlab 169-汽车振动多自由度非线性悬挂系统和参数研究 可以交流、咨询、答疑 2、内容说明 略 第二章 汽车模型建立 2.1 汽车悬架系统概述 2.1.1 悬架系统的结构和功能 2.1.2 悬架分类 2.2 四分之一车辆模型 对于车辆动力学,一般都是研究其悬…

hackmyvm-Smol

信息收集 ┌──(root㉿kali)-[/home/kali] └─# arp-scan -I eth1 192.168.56.0/24 Interface: eth1, type: EN10MB, MAC: 00:0c:29:34:da:f5, IPv4: 192.168.56.103 WARNING: Cannot open MAC/Vendor file ieee-oui.txt: Permission denied WARNING: Cannot open MAC/Vendo…

深度学习项目--基于DenseNet网络的“乳腺癌图像识别”,准确率90%+,pytorch复现

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 前言 如果说最经典的神经网络,ResNet肯定是一个,从ResNet发布后,很多人做了修改,denseNet网络无疑是最成功的…

基于x11vnc的ubuntu远程桌面

1、安装VNC服务 sudo apt install x11vnc -y2、创建连接密码 sudo x11vnc -storepasswd3、安装lightdm服务 x11vnc 在 默认的 GDM3 中不起作用,因此需要使用 lightdm 桌面管理环境 sudo apt install lightdm -y切换至lightdm,上一步已经切换则跳过该…

Git 常用命令完全指南:从入门到高效协作

文章需要结构清晰,涵盖从入门到进阶的常用命令,结合实例和注意事项,帮助用户快速掌握Git的核心功能,并应用到实际项目中 一、仓库初始化与基础操作 1. 创建与克隆仓库 # 初始化本地仓库 git init# 克隆远程仓库(SSH方…

【运维自动化-标准运维】如何实现一个最简单的流程编排

流程编排是标准运维最核心的功能,通过将不同功能的原子插件在画布上可视化的拖拽编排,可以实现各种不同场景的跨系统工作流。标准运维流程 根据实际运维操作场景梳理出来的操作步骤,通过不同的流转逻辑(并行、分支、条件并行&…

【DeepSeek】HTML Api调用(支持V3和 R1,多轮对话、流式输出、对话保存、markdown格式支持)

文章目录 一、项目结构二、功能支持三、使用方法四、待改进五、参数优化 ☘️ 项目地址:https://github.com/CQUPTLei/DeepSeek_HTML/tree/master 对话截图: 一、项目结构 C:\USERS\14134\DESKTOP\DEEPSEEK │ .gitignore │ DeepSeek.html # 所…

烽火HG680-KB_海思HI3798MV310_安卓9.0_U盘强刷固件包及注意点说明

之前发布过这个固件包,关于烽火HG680-KA/HG680-KB_海思HI3798MV310_安卓9.0_U盘强刷固件包详细说明一下,汇总总结一些常遇到的情况,这次固件会分开发布,以免混淆。 上一个帖子地址:烽火HG680-KA&#xff0…