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

【Java】--网络编程:基于TCP协议的网络通信

【Java】–网络编程:基于TCP协议的网络通信


文章目录

  • 【Java】--网络编程:基于TCP协议的网络通信
  • 一、TCP协议
    • 1.1 概念
    • 1.2 三次握手
      • 1.2.1 文字描述
      • 1.2.2 画图演示
    • 1.3 四次挥手
      • 1.3.1 文字描述
      • 1.3.2 画图演示
  • 二、基于TCP的Socket网络编程
    • 2.1 概念
    • 2.2 服务器端的开发步骤
      • 2.2.1 文字描述
    • 2.3 客户端的开发步骤
      • 2.3.1 文字描述
  • 总结


一、TCP协议

1.1 概念

TCP协议(Transmission Control Protocol),即传输控制协议,是一种面向连接的,可靠的,基于字节流的传输层通信协议。数据大小无限制。
建立连接的过程需要三次握手
断开连接的过程需要四次挥手
使用TCP协议的通信双方分别为客户端服务器端
客户端负责向服务器端发送数据,服务器端负责接收客户端的数据并给出反馈。两者地位不相同。

1.2 三次握手

1.2.1 文字描述

使用TCP协议的通信双方,建立通信连接需要三次握手,即三个步骤:

  1. 客户端向服务器端发送 建立连接请求(SYN) 数据包。
  2. 服务器端接收到客户端的SYN包,发送 确认信息(ACK) 数据包,表示收到了客户端发来的数据包,同时发送SYN,请求与客户端建立连接。
  3. 客户端接收到服务器端发来的ACK + SYN数据包之后,发送ACK数据包,表示收到了服务器发来的数据包。至此,客户端和服务器之间建立连接。

1.2.2 画图演示

三次握手

1.3 四次挥手

1.3.1 文字描述

使用TCP协议的通信双方,断开已经建立的连接需要四次挥手,即四个步骤:

  1. 客户端向服务器端发送 断开连接请求(FIN) 数据包。
  2. 服务器接收到客户端的FIN数据包,先向客户端发送ACK数据包,表示收到了客户端发来的数据包,并准备断开客户端的连接。
  3. 服务器处理好断开连接所需事宜后,向客户端发送FIN + ACK数据包,表示与客户端断开连接。
  4. 客户端接收到服务器端的FIN + ACK数据包,向服务器端发送ACK数据包,表示收到了服务器端发送的数据包。至此,客户端与服务器端断开连接。

1.3.2 画图演示

四次挥手


二、基于TCP的Socket网络编程

2.1 概念

Socket(套接字)是由操作系统提供的统一网络编程接口,是网络中的一个通信节点。
因为基于TCP协议,在使用Socket进行网络编程时需要分别进行服务器端的开发和客户端的开发。

2.2 服务器端的开发步骤

2.2.1 文字描述

  1. 创建ServerSocket对象,并指定端口号。
ServerSocket listener = new ServerSocket(10086);//指定服务器端的端口号
  1. 侦听客户端的连接,并返回客户端的套接字。
Socket clientSocket = listener.accept();
//注意:accept()是一个阻塞方法,在获得客户端的套接字之前不会执行后面的代码。
  1. 与客户端建立连接后,通过输入流来获取客户端的输出流。
//用于接收客户端的数据
InputStream is = clientSocket.getInputStream();
//用于向客户端输出数据
OutputStream os = clientSocket.getOutputStream();
//使用转换流将字节流转成字符流,并规定读取和输出的编码格式为UTF-8
InputStreamReader isr = new InputStreamReader(is,"UTF-8");
OutputStreamWriter osw = new OutputStreamWriter(os,"UTF-8");
//将字符流转换成字符缓冲流,效率更高
BufferedReader br = new BufferedReaer(isr);
BufferedWriter bw = new BufferedWriter(osw);
  1. 处理数据
String data = br.readLine();//读取一行数据
System.out.println("客户端说:" + data);
String s = "已接收到数据";
bw.write(s);//向客户端发送反馈
bw.newLine();//换行
bw.flush();//刷新缓存
  1. 关闭
listener.close();
clientSocket.close();
is.close();
os.close();
isr.close();
osw.close();
br.close();
bw.close();

2.3 客户端的开发步骤

2.3.1 文字描述

  1. 创建客户端套接字对象,并指定服务器端的地址和端口号。
//指定服务器端的地址和端口号
Socket ClientSocket = new Socket("10.9.48.155",10086);
  1. 获取输出流和输入流
//用于向服务器端输出数据
OutputStream os = ClientSocket.getOutputStream();
//用于接收服务器端的反馈
InputStream is = ClientSocket.getInputStream();
//将字节流通过转换流转换成字符流
OutputStreamWriter osw = new OutputStreamWriter(os,"UTF-8");
InpusStreamReader isr = new InputStreamReader(is,"UTF-8");
//将字符流转换成字符缓冲流,效率更高
BufferedWriter bw = new BufferedWriter(osw);
BufferedReader br = new BufferedReader(isr);
  1. 处理数据并发送
String s = "好久不见,甚是想你";
bw.write(bw);
bw.newLine();//另起一行,令客户端知道上一行是需要接收的内容
bw.flush();//刷新缓存,零数据发送出去
String feedback = br.readLine();
System.out.println("服务器回应道:" + data);
  1. 关闭
ClientSocket.close();
os.close();
is.close();
osw.close();
isr.close();
bw.close();
br.close();

总结

这篇文章讲解了什么是网络编程,以及在java中如何实现基于TCP协议的网络编程。

相关文章:

【Java】--网络编程:基于TCP协议的网络通信

【Java】–网络编程:基于TCP协议的网络通信 文章目录 【Java】--网络编程:基于TCP协议的网络通信一、TCP协议1.1 概念1.2 三次握手1.2.1 文字描述1.2.2 画图演示 1.3 四次挥手1.3.1 文字描述1.3.2 画图演示 二、基于TCP的Socket网络编程2.1 概念2.2 服务…...

CMake+QT+大漠插件的桌面应用开发(QThread)

文章目录 CMakeQT大漠插件的桌面应用开发(QThread)简介环境项目结构配置编译环境代码 CMakeQT大漠插件的桌面应用开发(QThread) 简介 在CMakeQT大漠插件的桌面应用开发中已经给出了QT配合大漠插件开发桌面应用的样例 不过由于主…...

【笔记】Helm-3 主题-9 Helm高级技术

Helm高级技术 这部分解释说明了使用Helm的各种高级特性和技术。这部分旨在为Helm的高级用户提供高度自定义和操作chart及发布的信息。每个高级特性都会有它自己的权衡利弊, 因此每个使用它们的都要有Helm的深度知识并小心使用。或者换言之,谨记 Peter Pa…...

YOLOv5改进 | 主干篇 | 华为GhostnetV1一种移动端的专用特征提取网络

一、本文介绍 本文给大家带来的改进机制是华为移动端模型Ghostnetv1,华为GhostnetV1一种移动端的专用特征提取网络,旨在在计算资源有限的嵌入式设备上实现高性能的图像分类。GhostNet的关键思想在于通过引入Ghost模块,以较低的计算成本增加了特征图的数量,从而提高了模型的…...

特斯拉FSD的神经网络(Tesla 2022 AI Day)

这是特斯拉的全自动驾驶(Full Self Driver)技术结构图,图中把自动驾驶模型拆分出分成了几个依赖的模块: 技术底座:自动标注技术处理大量数据,仿真技术创造图片数据,大数据引擎进不断地更新&…...

LLM自回归解码

在自然语言处理(NLP)中,大型语言模型(LLM)如Transformer进行推理时,自回归解码是一种生成文本的方式。在自回归解码中,模型在生成下一个单词时会依赖于它之前生成的单词。 使用自回归解码的公式…...

#Uniapp:uni.request(OBJECT)

uni.request(OBJECT) 发起网络请求。 示例 uni.request({url: https://www.example.com/request, //仅为示例,并非真实接口地址。data: {text: uni.request},header: {custom-header: hello //自定义请求头信息},success: (res) > {console.log(res.data);thi…...

旅游项目day14

其他模块数据初始化 搜索实现 请求一样,但是参数不一样,根据type划分。 后台需要提供一个搜索接口。 请求分发器: 全部搜索 目的地搜索 精确搜索、无高亮展示 攻略搜索 全文搜索、高亮显示、分页 游记搜搜 用户搜索 丝袜哥...

关于缓存 db redis local 取舍之道

文章目录 前言一、影响因素二、db or redis or local1.db2.redis3. local 三、redisson 和 CaffeineCache 封装3.1 redisson3.1.1 maven3.1.2 封装3.1.3 使用 3.2 CaffeineCache3.1.1 maven3.1.2 封装3.1.3 使用 总结 前言 让我们来聊一下数据缓存,它是如何为我们带…...

imgaug库图像增强指南(33):塑造【云层】效果的视觉魔法

引言 在深度学习和计算机视觉的世界里,数据是模型训练的基石,其质量与数量直接影响着模型的性能。然而,获取大量高质量的标注数据往往需要耗费大量的时间和资源。正因如此,数据增强技术应运而生,成为了解决这一问题的…...

树莓派ubuntu:CSI接口摄像头安装驱动程序及测试

树莓派中使用OV系列摄像头,网上能搜到的文章资源太老了,文章中提到的摄像头配置选项在raspi-config中并不存在。本文重新测试整理树莓派摄像头的驱动安装、配置、测试流程说明。 libcamera 新版本中使用libcamera作为摄像头驱动程序。 libcamera是一个…...

Webpack5入门到原理6:处理图片资源

处理图片资源 过去在 Webpack4 时,我们处理图片资源通过 file-loader 和 url-loader 进行处理 现在 Webpack5 已经将两个 Loader 功能内置到 Webpack 里了,我们只需要简单配置即可处理图片资源 1. 配置 const path require("path");modul…...

大语言模型(LLM)有哪些?

国际大语言模型 目前国际上有以下几个知名的大语言模型: GPT-4 GPT-4由OpenAI团队开发,是闭源的。GPT(Generative Pre-trained Transformer)系列是目前最著名的大语言模型之一。最早的版本是GPT-1,之后发展到了GPT-2和GPT-3&…...

2 - 部署Redis集群架构

部署Redis集群架构 部署Redis集群部署管理主机第一步 准备ruby脚本的运行环境第二步 创建脚本第三步 查看脚本帮助信息 配置6台Redis服务器第一步 修改配置文件启用集群功能第二步 重启redis服务第三步 查看Redis-server进程状态(看到服务使用2个端口号为成功&#…...

NOIP2003提高组T1:神经网络

题目链接 [NOIP2003 提高组] 神经网络 题目背景 人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别、函数逼近及贷款风险评估等诸多领域有广泛的应用。对神经网络的研究一直是当今的热门方向&am…...

Doris数据库误删除恢复

如果不小心误删除了表,doris提供了恢复机制,但时间间隔不能超过一天,记得要迅速 首先查看当前能恢复的记录有那些 可以通过 SHOW CATALOG RECYCLE BIN 来查询当前可恢复的元信息,也可以在语句后面加 WHERE NAME XXX 来缩小查询…...

C# byte转int:大小端读取

参考:byte[]数组和int之间的转换 文章目录 Byte转为INT小端存储方式转int大端存储方式转int 大端模式和小端模式是计算机存储多字节数据时的两种方式。内存地址从小往大增长。 大端模式:最高有效(最高位)的字节存放在最小地址上&…...

安全通信网络

1.网络架构 1)应保证网络设备的业务处理能力满足业务高峰期需要。 设备CPU和内存使用率的峰值不大于设备处理能力的70%。 在有监控环境的条件下,应通过监控平台查看主要设备在业务高峰期的资源(CPU、内存等)使用 情况&#xff…...

深度学习笔记(九)——tf模型导出保存、模型加载、常用模型导出tflite、权重量化、模型部署

文中程序以Tensorflow-2.6.0为例 部分概念包含笔者个人理解,如有遗漏或错误,欢迎评论或私信指正。 本篇博客主要是工具性介绍,可能由于软件版本问题导致的部分内容无法使用。 首先介绍tflite: TensorFlow Lite 是一组工具,可帮助开…...

七Docker可视化管理工具

Docker可视化管理工具 本节介绍几款Docker可视化管理工具。 DockerUI(ui for Docker) 官方GitHub:https://github.com/kevana/ui-for-docker 项目已废弃,现在转投Portainer项目,不建议使用。 Portainer 简介:Portainer是一个…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...