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

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

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

相关文章

Kafka-服务端-网络层

Reactor模式 Kafka网络层采用的是Reactor模式,是一种基于事件驱动的模式。熟悉Java编程应该了解JavaNIO提供了实现Reactor模式的API。常见的单线程Java NIO的编程模式如图所示。 为了满足高并发的需求,也为了充分利用服务器的资源,服务端需要…

中间件存储设计 - 数组与链表

文章目录 数组ArrayListLinkedListHashMap小结 中间件主要包括如下三方面的基础:数据结构、JUC 和 Netty,接下来,我们先讲数据结构。 数据结构主要解决的是数据的存储方式问题,是程序设计的基座。 按照重要性和复杂程度&#xf…

Python fork方法:创建新进程

除可以进行多线程编程之外,Python 还支持使用多进程来实现并发编程。 Python 的 os 模块提供了一个 fork() 方法,该方法可以 fork 出来一个子进程。简单来说,fork() 方法的作用在于,程序会启动两个进程(一个是父进程&…

《WebKit 技术内幕》学习之十(1): 插件与JavaScript扩展

虽然目前的浏览器的功能很强 ,但仍然有其局限性。早期的浏览器能力十分有限,Web前端开发者希望能够通过一定的机制来扩展浏览器的能力。早期的方法就是插件机制,现在流行次啊用混合编程(Hybird Programming)模式。插件…

大模型实战营 Day5作业

基础作业: 使用 LMDeploy 以本地对话、网页Gradio、API服务中的一种方式部署 InternLM-Chat-7B 模型,生成 300 字的小故事(需截图) TurboMind 推理命令行本地对话 lmdeploy chat turbomind /share/temp/model_repos/internlm-cha…

RK3568平台 TinyAlsa集成第三方音频算法

一.tinyalsa介绍 ALSA(Advanced Linux Sound Architecture)是一个开源项目,涵盖了用户空间和内核空间对音频设备的操作接口,通过应用层使用alsalib可以实现对音频设备的控制 TinyAlsa是android推出的一个精简的ALSA库&#xff0c…

【教程】npm的时候ssh报错ssh://git@github.com/frozeman/bignumber.js-nolookahead.git

问题: fiscoubuntu:~/fisco/benchmarks$ npm install install web30.20.7 npm ERR! code 128 npm ERR! An unknown git error occurred npm ERR! command git --no-replace-objects ls-remote ssh://gitgithub.com/frozeman/bignumber.js-nolookahead.git npm ERR! …

Spring Cloud 系列:Seata 中TCC模式具体实现

概述 https://seata.io/zh-cn/docs/dev/mode/tcc-mode https://seata.io/zh-cn/docs/user/mode/tcc TCC模式与AT模式非常相似,每阶段都是独立事务,不同的是TCC通过人工编码来实现数据恢复。需要实现三个方法: Try:资源的检测和…

第4章-IP基本原理

目录 1. IP协议概述 1.1. 定义 1.2. 功能 1.3. IP网络的结构 1.4. IP头格式 2. IP地址和地址映射 3. IP包转发 4. 其他相关协议介绍 1. IP协议概述 1.1. 定义 IP协议:IP协议是网际互连协议; 工作层次:网络层; 封装&#…

dubbo:服务暴露

节点角色说明: Provider:暴露服务的服务提供方。 Consumer::调用远程服务的服务消费方。 Registry:服务注册与发现的注册中心。 Monitor:统计服务的调用次调和调用时间的监控中心。 Container:服务运行容器。 调用关系说明: 0.服务容器负责启动&#xff…

HTML+JavaScript-03

JavaScript函数 定义函数的格式 JavaScript 函数是通过 function 关键词定义的。 function sum(a, b){//函数体return a b;//返回值为a、b的和 }函数的调用 调用函数时直接书写函数名即可 function show(){alert("函数show被调用"); } show();函数的相互调用 …

使用Docker部署Apache Superset结合内网穿透实现远程访问本地服务

文章目录 前言1. 使用Docker部署Apache Superset1.1 第一步安装docker 、docker compose1.2 克隆superset代码到本地并使用docker compose启动 2. 安装cpolar内网穿透,实现公网访问3. 设置固定连接公网地址 前言 Superset是一款由中国知名科技公司开源的“现代化的…

PSEUDO-LIDAR++:自动驾驶中 3D 目标检测的精确深度

论文地址:PSEUDO-LIDAR: ACCURATE DEPTH FOR 3D OBJECT DETECTION IN AUTONOMOUS DRIVING 论文代码:https://github.com/mileyan/Pseudo_Lidar_V2 摘要 3D 检测汽车和行人等物体在自动驾驶中发挥着不可或缺的作用。现有方法很大程度上依赖昂贵的激光雷…

华为数通方向HCIP-DataCom H12-831题库(判断题:81-100)

第81题 基本QinQ能根据业务种类选择外层Tag封装的方式 正确 错误 答案: 错误 解析: 基本QinQ是基于端口方式实现的,不能根据业务种类选择外层TAG封装的方式。 第82题 display interface GE0/0/0-次,发现Total Error计数(该接口物理层的错误报文总数目)不是此时可以断定当前…

登录页面(附源码)

特色&#xff1a; 点击登录之后卡片翻转效果 话不多说&#xff0c;看展示。 还在等什么&#xff0c;赶快白嫖起来吧 HTML文件 <div id"window" style"display: none"><div class"page page-front"><div class"page-content&…

SCCB接口

文章目录 概述引脚传输时序起始/结束信号三线模式两线模式 传输周期3阶段写传输周期2阶段写传输周期2阶段读传输周期阶段一 ID Address阶段二 子地址/读数据阶段三 写数据 SCCB与IIC区别未完待续(还有代码&#xff09;... 概述 SCCB&#xff08;Serial Camera Control Bus&…

aspose-cells-20.7.jar 去除水印及次数限制

1.使用 jd-gui.exe 反编译查看&#xff0c;直接搜索 License 1.修改 public static boolean isLicenseSet() {return (a ! null);}改成 public static boolean isLicenseSet() {return true;}2.修改 public void setLicense(InputStream stream) {Document document null;if (…

【EI会议征稿通知】2024年第四届人工智能、自动化与高性能计算国际会议(AIAHPC 2024)

2024年第四届人工智能、自动化与高性能计算国际会议&#xff08;AIAHPC 2024&#xff09; 2024 4th International Conference on Artificial Intelligence, Automation and High Performance Computing 2024第四届人工智能、自动化与高性能计算国际会议(AIAHPC 2024)将于20…

SpringMVC:拦截器

一般我们会做一些统一的操作这个时候我们需要使用springmvc提供的拦截器&#xff0c;例如token的验证&#xff0c;字段必填的操作&#xff0c;接口超时判断&#xff0c;签名验证&#xff0c;字段加密等操作&#xff0c;所以我们需要了解执行先后顺序。 我们来简单介绍下实现过程…

第6章-路由器、交换机及其操作系统介绍

目录 1. 路由器与交换机的作用与特点 1.1. 路由器 1.2. 交换机 1.3. 路由交换 2. H3C路由器与交换机介绍 3. H3C网络设备操作系统Comware 1. 路由器与交换机的作用与特点 1.1. 路由器 1、定义&#xff1a;路由器&#xff08;Router&#xff09;是连接两个或多个网络的硬…