TCP(Transmission Control Protocol)是一种面向连接的、可靠的网络传输协议,它提供了端到端的数据传输和可靠性保证。TCP通信适用于对数据传输的可靠性和完整性要求较高的场景,如文件传输、网页浏览等。本文将详细介绍Java中如何使用TCP协议进行网络通信,包括TCP套接字、服务器和客户端的创建、数据传输等。
1. TCP基础知识
1.1. TCP工作原理
TCP是一种面向连接的协议,它的工作原理如下:
- 建立连接:通信双方首先建立连接,进行三次握手,确保双方都准备好进行数据传输。
- 数据传输:建立连接后,数据可以在通信双方之间传输。TCP保证了数据的可靠性和顺序性。
- 断开连接:通信完成后,可以断开连接,进行四次挥手,释放资源。
1.2. TCP的特点
- 可靠性:TCP保证数据的可靠性,数据不会丢失,且按顺序传输。
- 面向连接:TCP需要建立连接和维护状态,确保通信双方都准备好进行数据传输。
- 高效性:TCP的头部开销较大,传输效率相对较低。
- 适用性广泛:TCP适用于对数据传输可靠性要求较高的应用场景。
2. Java TCP编程基础
Java提供了用于TCP编程的相关类,主要位于java.net
包中。下面是TCP编程的基本步骤:
2.1. 创建TCP服务器
使用ServerSocket
类创建TCP服务器,并绑定到指定的端口。
import java.net.*;
// 创建TCP服务器并绑定到指定端口
int port = 8888;
ServerSocket serverSocket = new ServerSocket(port);
2.2. 创建TCP客户端
使用Socket
类创建TCP客户端,并指定连接的服务器地址和端口。
// 创建TCP客户端并连接到服务器
String serverAddress = "localhost";
int serverPort = 8888;
Socket clientSocket = new Socket(serverAddress, serverPort);
2.3. 数据传输
在TCP通信中,可以使用输入流和输出流进行数据传输。服务器和客户端都可以使用InputStream
和OutputStream
来发送和接收数据。
服务器端发送数据示例:
OutputStream outputStream = clientSocket.getOutputStream();
String message = "Hello, TCP!";
outputStream.write(message.getBytes());
客户端接收数据示例:
InputStream inputStream = serverSocket.getInputStream();
byte[] buffer = new byte[1024];
int bytesRead = inputStream.read(buffer);
String receivedMessage = new String(buffer, 0, bytesRead);
System.out.println("收到消息:" + receivedMessage);
2.4. 关闭连接
在完成TCP通信后,需要关闭连接以释放资源。
// 关闭TCP服务器
serverSocket.close();
// 关闭TCP客户端
clientSocket.close();
3. Java TCP服务器和客户端示例
下面是一个简单的Java TCP服务器和客户端示例:
TCP服务器端代码:
import java.io.*;
import java.net.*;
public class TCPServer {
public static void main(String[] args) {
try {
// 创建TCP服务器并绑定到指定端口
int port = 8888;
ServerSocket serverSocket = new ServerSocket(port);
System.out.println("服务器已启动,等待客户端连接...");
while (true) {
// 等待客户端连接
Socket clientSocket = serverSocket.accept();
System.out.println("客户端连接成功");
// 创建输入流和输出流
InputStream inputStream = clientSocket.getInputStream();
OutputStream outputStream = clientSocket.getOutputStream();
// 读取客户端发送的数据
byte[] buffer = new byte[1024];
int bytesRead = inputStream.read(buffer);
String receivedMessage = new String(buffer, 0, bytesRead);
System.out.println("收到消息:" + receivedMessage);
// 发送响应数据给客户端
String responseMessage = "Hello, Client!";
outputStream.write(responseMessage.getBytes());
// 关闭连接
clientSocket.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
TCP客户端代码:
import java.io.*;
import java.net.*;
public class TCPClient {
public static void main(String[] args) {
try {
// 创建TCP客户端并连接到服务器
String serverAddress = "localhost";
int serverPort = 8888;
Socket clientSocket = new Socket(serverAddress, serverPort);
// 创建输入流和输出流
InputStream inputStream = clientSocket.getInputStream();
OutputStream outputStream = clientSocket.getOutputStream();
// 发送数据给服务器
String message = "Hello, Server!";
outputStream.write(message.getBytes());
// 读取服务器响应的数据
byte[] buffer = new byte[1024];
int bytesRead = inputStream.read(buffer);
String receivedMessage = new String(buffer, 0, bytesRead);
System.out.println("收到服务器响应:" + receivedMessage);
// 关闭连接
clientSocket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
4. 总结
本文介绍了Java中如何使用TCP协议进行网络通信,包括TCP的基础知识、TCP编程的基本步骤、创建TCP服务器和客户端、数据传输等内容。通过学习本文,您可以开始使用TCP协议来构建自己的网络应用程序,实现可靠的数据传输。希望本文能够帮助您更好地理解和应用Java中的TCP通信。
相关文章
详解动态网页数据获取以及浏览器数据和网络数据交互流程-Python
动态网页是一种在用户浏览时实时生成或变化的网页。。相比之下,动态网页可以根据用户的互动、请求或其他条件在浏览器端或服务器端生成新的内容。而且现在的网页一般都是采用前后端分离的架构,前端负责展示和用户交互,后端负责数据处理。这种架构使得前端可以更加灵活地实现动态内容的加载和展示。所以说以后想要获取到数据,动态网页数据获取会成为我们主流获取网页数据的技术。所以在动态网页数据获取这方面我们需要下足功夫了解动态网页数据交互形式、数据存储访问模式等方方面面的知识,我们才好更加灵活的获取到数据。
编程日记 2024/01/13 17:46:53
学习如何使用 Python 连接 MongoDB: PyMongo 安装和基础操作教程
Python 可以用于数据库应用程序。最流行的 NoSQL 数据库之一是 MongoDB MongoDB MongoDB 将数据存储在类似 JSON 的文档中,使数据库非常灵活和可扩展。 您可以在 MongoDB 官网 上下载免费的 MongoDB 数据库 PyMongo Python 需要一个 M
编程日记 2024/01/13 10:25:09
CentOS本地部署SQL Server数据库无公网ip环境实现远程访问
GeoServer是OGC Web服务器规范的J2EE实现,利用GeoServer可以方便地发布地图数据,允许用户对要素数据进行更新、删除、插入操作,通过GeoServer可以比较容易地在用户之间迅速共享空间地理信息。另外,GeoServer是开源软件。下面介绍GeoServer web ui 管理界面 结合cpolar 内网穿透工具实现远程访问,
编程日记 2024/01/11 10:40:30
ElasticSearch 集群搭建与状态监控cerebro
在单机上利用docker容器运行多个es实例来模拟es集群。部署es集群可以直接使用docker-compose来完成,但要求Linux虚拟机至少有4GI的内存空间。"number_of_replicas": 1 // 副本数。"number_of_shards": 3,// 分片款量。kibana可以监控es集群,不过新版本需要依赖es的x-pack 功能,配置比较复杂。第一种方式:利用kibana的DevTools创建索引库 ,在DevTools中输入指令。第二种方式:利用cerebro创建索引库。
编程日记 2024/01/09 18:16:38
【微信支付】springboot-java接入微信支付-JSAPI支付/查单/退款/发送红包(四)---发送红包
在发放现金红包之前,请确保你的资金充足。操作路径:【登录商户平台——>交易中心——>资金管理——>充值】和红包相关的参数,你可以在页面上自主设置和更改。操作路径如下:【登录商户平台——>产品中心——>现金红包——>产品设置】在使用现金红包之前,请前往开通现金红包功能。操作路径:【登录微信支付商户平台——>产品中心——>现金红包——>开通】至此,整个微信支付的教程基本结束了,如果有小伙伴有其他问题,欢迎留言或者私信。商户调用微信红包接口时,微信支付服务器会进行证书验证,请现在商户平台下载证书。
编程日记 2024/01/09 13:11:24
Samtec卓越应用 | SEARAY:最大限度提高设计灵活性和密度
与标准的BGA/焊球连接相比,Solder Charge互连在连接器与印刷电路板的组装过程中。是专为高带宽应用而设计的坚固触头点。如果您需要SEARAY™尺寸的高速、高密度电缆组件,请查看SEAC系列阵列电缆组件。0.80 毫米间距系统的密度是标准 1.27 毫米栅格的两倍。为设计人员提供了大量的设计灵活性,远远超过业内任何其他阵列产品。这样就能实现更长的循环寿命和更优越的电气性能。如果使用我们推荐的引脚分配,设计人员的单端设计最多可获得。,这在设计高引脚数连接器时是一个重要的考虑因素。
编程日记 2024/01/08 17:37:56
网络知识-以太网技术的发展及网络设备
大家都被互联网上各种各样的内容、技术闪亮了眼睛,没有太多人去了解比较底层的一些网络技术。面试的时候,我也问过很多技术人员,对以太网是否了解,了解多少?但是很多人都知之甚少!但是,在我们实际工作碰到问题、分析问题、定位问题、解决问题的时候,又必须要了解这方面的知识。以太网最初到现在的主要设备包括集线器、中继器、网桥、交换机。以太网目前应用在很多行业,在视频监控、安防、视频会议等领域都有很广泛的应用。
编程日记 2024/01/07 09:49:43
C# Onnx Chinese CLIP 通过一句话从图库中搜出来符合要求的图片
C# Onnx Chinese CLIP 通过一句话从图库中搜出来符合要求的图片
编程日记 2024/01/06 21:02:14
Zoho SalesIQ:构建客户服务知识库的实用工具与指南
客户服务知识库是一个集中的信息存储库,提供常见问题解答(FAQ)、故障排除指南、分步教程和其他资源。它旨在使客户能够自己找到解决方案,同时还可以减轻您的支持团队的工作量。
编程日记 2024/01/06 15:37:59
详解静态网页数据获取以及浏览器数据和网络数据交互流程-Python
在网站设计领域,基于纯HTML格式构建的网页通常定义为静态网页,这种类型的网页是早期网站建设的主要形式。对于网络爬虫来说,抓取静态网页中的数据相对较为简单,因为所需的所有信息都直接嵌入在网页的HTML代码里。然而,对于那些利用AJAX技术动态加载数据的网页,其数据并不总是直接出现在HTML代码中,这对爬虫的抓取工作造成了一定的难度。在静态网页的数据抓取过程中,Requests库显示出其卓越的实用性。这个库不仅功能全面,而且操作简洁直观。
编程日记 2024/01/05 10:50:34
Redis内存使用率高,内存不足问题排查和解决
在使用redis的对象或者list队列等实例时,要记得给key设置过期时间,避免数据一直堆积无法释放。对于重要的异常数据队列的数据,要进行业务处理:重回队列或数据持久化。
编程日记 2024/01/02 14:54:27
为什么ChatGPT选择了SSE,而不是WebSocket?
WebSocket是一种网络通信协议,它最早被提出来是为了解决HTTP连接的一大限制:HTTP协议中,一个客户端发送给服务端的请求必须由服务端返回一个响应,这使得服务端无法主动向客户端推送数据。客户端通过发送一个特殊的HTTP请求向服务器请求建立WebSocket连接。这个请求类似于:GET /chat HTTP/1.1 Upgrade: websocket Connection: Upgrade服务器响应这个请求,确认建立WebSocket连接。
chatgpt教程 2024/01/02 10:11:45
网络安全-真实ip获取&伪造与隐藏&挖掘
proxy protocol没有研究,和TOA差不多,按照协议发包就行了,实现就交给读者吧。TOA的伪造方式还是不错的,非linux下没有btftools,可以自己写一个代理,把浏览器的流量转发到本地代理,代理的功能就是把TOA改一下。一些代理隐藏ip还是不错的,除非网站从开始没有使用cdn、部分使用cdn,或网站服务器有其他服务导致真实ip发出包了。该博客作者我也问了,一开始就使用了CDN,也没有其他子域名、服务,应该是无法找到真实IP了。
编程日记 2024/01/01 21:38:10
【HarmonyOS】ArkTS语言介绍与组件方式运用
自定义组件自定义函数:自定义函数可以将烦长的代码单独抽离出一个函数当中,然后在原位置调用我们设置的函数即可,自定义函数可以定义在全局或组件内,如下:@Styles装饰器@Extend装饰器// 继承模式,只能写在全局。
编程日记 2024/01/01 10:01:42
深入理解Mysql事务隔离级别与锁机制
我们的数据库一般都会并发执行多个事务,多个事务可能会并发的对相同的一批数据进行增删改查操作,可能就会导致我们说的脏写、脏读、不可重复读、幻读这些问题。这些问题的本质都是数据库的多事务并发问题,为了解决多事务并发问题,数据库设计了事务隔离机制、锁机制、MVCC多版本并发控制隔离机制,用一整套机制来解决多事务并发问题。接下来,我们会深入讲解这些机制,让大家彻底理解数据库内部的执行原理。
编程日记 2023/12/31 19:32:25
SpringBoot解决前后端分离跨域问题:状态码403拒绝访问
前后端分离项目因为端口不一致造成状态码403异常,通过Spring Boot来解决此跨域问题
编程日记 2023/12/31 08:34:33
Jupyter Notbook+cpolar内网穿透实现公共互联网访问使用数据分析工作
在数据分析工作中,使用最多的无疑就是各种函数、图表、代码和说明文档,这些复杂的内容不仅让使用的人头晕脑胀,也让普通的聊天工具一脸蒙圈。沟通工具不给力,就没法协同办公,可数据分析又离不开多人配合,所以Jupyter Notebook就成为大部分数据工作人员的必备工具。正如之前所说,Jupyter Notebook很适应复杂内容的沟通,因此现在也在机器学习、深度学习和教育工作中获得广泛应用。但Jupyter Notebook也有缺陷,就是被局限在局域网范围。
编程日记 2023/12/29 09:56:39
如何搭建Tomcat服务并结合内网穿透实现公网访问本地站点
Tomcat作为一个轻量级的服务器,不仅名字很有趣(让人想起童年),也拥有强大功能,由于其可以实现JavaWeb程序的装载,就成为配置JSP和Java系统必备的环境软件,也是开发调试JSP程序的首选。Tomcat运行稳定且开源免费,加上apache和Sun的加持即免费和开源的特性,使其广泛应用在中小型系统及并发访问用户较少的场景中。但想要让Tomcat网页能在公共互联网环境下被访问到,就需要cpolar内网穿透的协助。现在。笔者就为大家介绍,如何使用cpolar内网穿透。
编程日记 2023/12/28 14:28:26
SpringMVC之获取请求参数和域对象共享数据
一、SpringMVC获取请求参数1、通过ServletAPI获取2、通过控制器方法的形参获取请求参数6、通过POJO获取请求参数7、解决获取请求参数的乱码问题二、域对象共享数据1、使用ServletAPI向request域对象共享数据2、使用ModelAndView向request域对象共享数据3、使用Model向request域对象共享数据4、使用map向request域对象共享数据5、使用ModelMap向request域对象共享数据。
编程日记 2023/12/28 11:31:11
移动开发新的风口?Harmony4.0鸿蒙应用开发基础+实践案例
HarmonyOS 是啥?HarmonyOS 是华为新一代的智能终端操作系统,为不同设备的智能化、互联与协同提供了统一的语言。带来简洁、流畅、连续、安全可靠的全场景交互体验。
编程日记 2023/12/27 17:53:06
如何使用Docker部署Dashy并无公网ip远程访问管理界面
Dashy是一个开源的自托管的导航页配置服务,具有易于使用的可视化编辑器、状态检查、小工具和主题等功能。你可以将自己常用的一些网站聚合起来放在一起,形成自己的导航页。一款功能超强大,颜值爆表的可定制专属导航页工具结合cpolar内网工具,我们实现无需部署到公网服务器,即可实现公网访问Dashy,下面我们介绍配置方法。
编程日记 2023/12/25 15:40:38
如何在Spring Boot中优雅地进行参数校验
在Java中,注解(Annotation)是一种代码标记,通常用于提供元数据,这些元数据可以被编译器或运行时环境使用。这些注解通常用于框架和库中,以实现更加灵活和可配置的代码。
编程日记 2023/12/25 10:15:17
大数据告诉你新能源汽车哪家强?
随着双碳战略的提出和电池技术、电动机技术等的不断进步,新能源汽车最近几年势头很猛,借着一份汽车销售数据一起来了解一下新能源汽车目前的市场情况,大家买电车的说不定可以用上,毕竟这可是。
大数据 2023/12/24 22:34:30
高并发场景下如何实现系统限流?
在分布式高可用设计中,限流应该是应用最广泛的技术手段之一,今天一起来讨论一下,为什么需要限流,以及常见的限流算法都有哪些。
编程日记 2023/12/24 15:10:00
Python使用多线程解析超大日志文件
使用Python的多线程技术可以有效地提高处理超大日志文件的效率。但在实际应用中需要注意多线程编程中的各种问题,如线程管理、资源管理、错误处理等。通过合理的优化和调整可以提高程序的性能和稳定性。
编程日记 2023/12/24 11:16:35
如何在Linux设置JumpServer实现无公网ip远程访问管理界面
JumpServer 是广受欢迎的开源堡垒机,是符合 4A 规范的专业运维安全审计系统。JumpServer 帮助企业以更安全的方式管控和登录所有类型的资产,实现事前授权、事中监察、事后审计,满足等保合规要求。下面介绍如何简单设置即可使本地jump server 结合cpolar 内网穿透实现远程访问jump server 管理界面.
编程日记 2023/12/23 09:20:24
AI时代架构设计新模式
本书是一本旨在帮助架构师在人工智能时代展翅高飞的实用指南。全书以ChatGPT为核心工具,揭示了人工智能技术对架构师的角色和职责进行颠覆和重塑的关键点。本书通过共计 13 章的系统内容,深入探讨AI技术在架构设计中的应用,以及AI对传统架构师工作方式的影响。通过学习,读者将了解如何利用ChatGPT这一强大的智能辅助工具,提升架构师的工作效率和创造力。本书的读者主要是架构师及相关从业人员。
AI专题 2023/12/22 11:42:53
windows如何环境搭建属于自己的Zblog博客并发布上线公网访问?
想要成为一个合格的技术宅或程序员,自己搭建网站制作网页是绕不开的项目。就以笔者自己的经历来说,就被自制网页网站卡过很久。不过随着电脑技术的发展,已经出现了很多便捷快速建站的工具软件。今天,笔者就为大家展示,如何快速上手Z-blog,建立自己的个人博客网站,并通过cpolar建立的内网穿透数据隧道,将这个个人博客软件发布到公互联网上。从上面介绍的步骤可以看出,想要快速发布一个网站,有必要选择一些简单趁手的辅助工具,虽然Z-blog搭建的网站但很简单,但却是我们熟悉cpolar发布本地网站很好的例子。
编程日记 2023/12/21 12:24:48
复杂 SQL 实现分组分情况分页查询
在处理数据库查询时,分页是一个常见的需求。尤其是在处理大量数据时,一次性返回所有结果可能会导致性能问题。因此,我们需要使用分页查询来限制返回的结果数量。同时,根据特定的条件筛选数据也是非常常见的需求。在本博客中,我们将探讨如何根据 camp_status 字段分为 6 种情况进行分页查询,并根据 camp_type 字段区分活动类型,返回不同的字段。我们将使用 SQL 变量来实现这一功能,并通过示例进行详细解释。
编程日记 2023/12/21 09:58:28