【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协议的网络编程。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c#中使用UTF-8编码处理多语言文本的有效策略

使用UTF-8编码处理多语言文本的有效策略 在当今的全球化时代,软件开发者常常需要处理包含多种语言的文本。这不仅涉及英文和其他西方语言,还包括中文、日文、韩文等多字节字符系统。在这篇博客中,我将探讨如何有效地使用UTF-8编码来处理混合语…

大模型实战营Day5笔记

大模型部署背景 大模型部署是指将训练好的模型在特定的软硬件环境中启动的过程,使模型能够接收输入并返回预测结果。大模型的内存开销巨大,7B模型仅权重需要14G内存。另外大模型是自回归生成,需要缓存Attention的 k/v。 LMDeploy 简…

学生宿舍人走断电管理系统的意义和功能

学生宿舍人走断电管理系统是石家庄光大远通电气公司一款智能化的电力管理设备,旨在解决学生宿舍安全用电问题。以下是一些该系统的功能特点: 1.智能控制:系统能够自动识别宿舍内是否有人,当无人时自动断电,避免能源浪费和安全事故的发生。 2.…

Prometheus插件安装kafka_exporter

下载地址 https://github.com/danielqsj/kafka_exporter/releases 解压 tar -zxvf kafka_exporter-1.7.0.linux-amd64.tar.gzmv kafka_exporter-1.7.0.linux-amd64 kafka_exporter服务配置 cd /usr/lib/systemd/systemvi kafka_exporter.service内容如下 [Unit] Descript…

容器技术2-镜像与容器储存

目录 一、镜像制作 1、ddocker build 2、docker commit 二、镜像存储 1、公共仓库 2、私有仓库 三、镜像使用 四、容器存储 1、镜像元数据 2、存储驱动 3、数据卷 一、镜像制作 1、ddocker build 基于 Dockerfile 自动构建镜像 其机制为:每一行都会基于…

【webrtc】neteq测试工程

设置git代理 $ git config --global http.https://github.com.proxy socks5://127.0.0.1:7890 git config --global https.https://github.com.proxy socks5://127.0.0.1:7890导入cmake直接构建 win32 debug v143 编译opus Build started...

【零基础入门TypeScript】数组

目录 数组的特点 声明和初始化数组 句法 访问数组元素 示例:简单数组 示例:单语句声明和初始化 数组对象 例子 示例:数组构造函数接受逗号分隔值 数组方法 数组解构 例子 使用 for…in 循环遍历数组 TypeScript 中的数组 使用变…

vue:element-ui表单动态验证规则

一、需求: 实现当是否发送消息选择是时,业务类型字段必填。 二、实现: 当你在一个表单中使用 el-form 和 el-form-item 来创建表单项时,el-form-item 的 :rules 属性可以用来设置该表单项的验证规则。我们希望根据用户在 "…

前端JS加密与Buspsuite的坦诚相待

前端JS加密测试场景下的困惑 在渗透测试过程中经常会遇到JS前端加密的场景,假如不借助任何工具的情况下,我们一般是把JS代码进行扣取,本地进行加解密生成Payload,然后在Burpsuite里进行Payload替换。这种方式就存在一个很明显的问…

机器学习:什么是监督学习和无监督学习

目录 一、监督学习 (一)回归 (二)分类 二、无监督学习 聚类 一、监督学习 介绍:监督学习是指学习输入到输出(x->y)映射的机器学习算法,监督即理解为:已知正确答案…

【Web前端开发基础】CSS的定位和装饰

CSS的定位和装饰 目录 CSS的定位和装饰一、学习目标二、文章内容2.1 定位2.1.1 定位的基本介绍2.1.2 定位的基本使用2.1.3 静态定位2.1.4 相对定位2.1.5 绝对定位2.1.6 子绝父相2.1.7 固定定位2.1.8元素的层级关系 2.2 装饰2.2.1 垂直对齐方式2.2.2 光标类型2.2.3 边框圆角2.2.…

Keepalived + Nginx双主架构

Keepalived Nginx双主架构 环境准备: keepalived_master1服务器nginx:172.20.26.167 keepalived_master2服务器nginx:172.20.26.198 各服务器关闭selinux、防火墙等服务。 开机安装部署nginx 在172.20.26.167服务器上 yum install ngi…

基于ADAS的车道线检测算法matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 图像预处理 4.2 车道线特征提取 4.3 车道线跟踪 5.完整工程文件 1.课题概述 基于ADAS的车道线检测算法,通过hough变换和边缘检测方法提取视频样板中的车道线,然后根据车道线的弯曲情况…

在Excel中批量添加前后缀的三种方法,总有一种适合 你

你可以使用高级Excel函数将前缀和后缀快速应用于列。在使用大型电子表格时,为每个单元格添加后缀或前缀可能会花费很长时间,并使你疲惫不堪。 在这里,你可以通过几种快速简单的方式添加后缀或前缀,从而减少所需的手动操作。​我们将通过三种不同的方法向Excel电子表格添加…

互联网盲盒小程序,解锁了盲盒全新模式!

随着潮流玩具的兴起,盲盒因此产生,在时间的推移下,盲盒的发展正处于鼎盛时期。在今年,盲盒市场也将迎来300亿元的市场规模,而盲盒的受众群体也在收入能力较高的年轻人中。 盲盒具有独特的购买方式,它能够让…

硬件监测和系统诊断 -- TechTool Pro 18 中文

TechTool Pro 18是一款功能强大的硬件和软件诊断工具,它提供了多种功能来帮助用户维护和优化Mac电脑的性能。这些功能包括:硬盘检测和修复、内存测试、驱动器克隆、数据恢复、网络和连接测试、系统健康检查以及定期维护等。 TechTool Pro 18还具有直观的…

k8s--helm

什么是helm?在没有这个helm之前,deployment service ingress helm的作用 通过打包的方式,把deployment service ingress等打包在一块,一键式的部署服务,类似yum安装 官方提供的一个类似与安装仓库额功能,…

写着玩的程序:pycharm实现无限弹窗程序(非病毒程序,仅整蛊使用)

运行环境 PyCharm 2023.2.1 python3.11 具体内容 源代码 import tkinter as tk from tkinter import messagebox import threadingclass PopupGenerator:def __init__(self):self.root tk.Tk()self.root.geometry("200x120")self.root.title("无限弹窗&qu…

C# CefSharp 根据输入日期段自动选择日期

1,前言 搞这个Demo整整搞几天通宵,爆肝了。后做的效果出来,还是不错的。给小伙伴看看效果图。 2, 遇到的问题 日期之间相差多少个月数。开始时间框点击对应月份要点击多少次,结束时间框点击对应月份要点击多少次Xpath获取问题。…

理解LSTM一种递归神经网络(RNN)

1 递归神经网络结构 一个简单的传统神经网络结构如下图所示: 给他一些输入x0,x1,x2 … xt, 经过神经元作用之后得到一些对应的输出h0,h1,h2 … ht。每次的训练,神经元和神经元之间不需要传递任何信息。 递归神经网络和传统神经网络不同的一个点在于&am…