如何在Java实现TCP方式发送和接收Socket消息(多线程模式)
目录
- 导言:
- 正文:
- 1. 创建Server端:
- 2. 创建Client端:
- 3. 多线程模式:
- 代码示例
- Server端代码示例:
- Client端代码示例:
- 同步模式发送TCP消息
- 异步模式
- 结论:
导言:
在Java编程中,使用TCP协议进行Socket通信是非常常见的场景。本文将详细介绍如何在Java中实现TCP方式发送和接收Socket消息,并且利用多线程模式来提高通信效率。

正文:
1. 创建Server端:
首先,我们需要创建一个Server端来处理接收到的Socket连接请求。以下是实现的步骤:
- 创建一个ServerSocket对象,并指定监听的端口号。
- 使用accept()方法监听客户端的连接请求,并为每个连接创建一个新的线程进行处理。
- 在线程中,使用Socket对象的getInputStream()方法获取输入流,可以读取客户端发送的消息。
- 实现业务逻辑,处理收到的消息。
- 使用Socket对象的getOutputStream()方法获取输出流,可以向客户端发送响应消息。
- 关闭Socket连接和相关资源。
2. 创建Client端:
接下来,我们需要创建一个Client端来发送Socket消息到Server端。以下是实现的步骤:
- 创建一个Socket对象,并指定Server端的IP地址和端口号。
- 使用Socket对象的getOutputStream()方法获取输出流,可以向Server端发送消息。
- 实现业务逻辑,发送需要传输的消息。
- 使用Socket对象的getInputStream()方法获取输入流,可以读取Server端的响应消息。
- 关闭Socket连接和相关资源。
3. 多线程模式:
在上述的Server端实现中,我们为每个连接创建了一个新的线程来处理消息。这样可以并发地处理多个客户端的请求,提高通信效率。以下是实现的步骤:
- 创建一个Runnable接口的实现类,实现run()方法。
- 在run()方法中实现Server端的逻辑:监听客户端连接、接收消息、处理消息、发送响应。
- 在Server端的主线程中,创建一个线程池(ThreadPoolExecutor)来管理线程的执行。
- 使用线程池的execute()方法提交任务,每次有新的连接请求时,创建一个新的任务并执行。
- 关闭线程池和相关资源。
代码示例
当然,以下是一个简单的示例代码,展示了如何在Java中实现TCP方式发送和接收Socket消息(多线程模式):
Server端代码示例:
import java.io.*;
import java.net.*;public class Server {public static void main(String[] args) {try {ServerSocket serverSocket = new ServerSocket(12345);System.out.println("Server started, waiting for client...");while (true) {Socket socket = serverSocket.accept();System.out.println("Client connected: " + socket.getInetAddress().getHostAddress());Thread thread = new Thread(new ClientHandler(socket));thread.start();}} catch (IOException e) {e.printStackTrace();}}private static class ClientHandler implements Runnable {private Socket socket;public ClientHandler(Socket socket) {this.socket = socket;}@Overridepublic void run() {try {BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));String message = reader.readLine();System.out.println("Received message from client: " + message);// 处理消息(这里仅做回显)String response = "Server: " + message.toUpperCase();writer.write(response);writer.newLine();writer.flush();System.out.println("Sent response to client: " + response);// 关闭连接socket.close();System.out.println("Connection closed");} catch (IOException e) {e.printStackTrace();}}}
}
Client端代码示例:
同步模式发送TCP消息
import java.io.*;
import java.net.*;public class Client {public static void main(String[] args) {try {Socket socket = new Socket("localhost", 12345);System.out.println("Connected to server");BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));String message = "Hello from client";writer.write(message);writer.newLine();writer.flush();System.out.println("Sent message to server: " + message);String response = reader.readLine();System.out.println("Received response from server: " + response);// 关闭连接socket.close();System.out.println("Connection closed");} catch (IOException e) {e.printStackTrace();}}
}
异步模式
以下是客户端添加异步方式发送Socket消息并接收服务端响应消息的代码示例:
import java.io.*;
import java.net.*;
import java.util.concurrent.*;public class Client {public static void main(String[] args) {try {Socket socket = new Socket("localhost", 12345);System.out.println("Connected to server");// 异步发送消息ExecutorService executorService = Executors.newSingleThreadExecutor();Future<Void> sendFuture = executorService.submit(() -> {BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));String message = "Hello from client";writer.write(message);writer.newLine();writer.flush();System.out.println("Sent message to server: " + message);return null;});// 异步接收响应Future<String> receiveFuture = executorService.submit(() -> {BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));String response = reader.readLine();System.out.println("Received response from server: " + response);return response;});// 等待发送和接收完成sendFuture.get();String response = receiveFuture.get();// 关闭连接socket.close();executorService.shutdown();System.out.println("Connection closed");} catch (IOException | InterruptedException | ExecutionException e) {e.printStackTrace();}}
}
在这个异步模式的示例中,我们使用了ExecutorService来创建一个线程池,并利用submit()方法异步地执行发送和接收任务。Future对象用于获取异步任务的结果。
通过这种方式,客户端可以并行地发送消息和接收响应,提高通信效率。请注意,在实际应用中,您可能需要根据具体需求对代码进行修改和调整以满足项目的要求。
在上述示例中,Server端监听12345端口,接受客户端的连接请求,并为每个连接创建一个新的线程进行处理。Client端连接到Server端,发送消息,并接收Server端的响应。Server端仅将客户端发来的消息转换为大写并回显。
请注意,在实际应用中,您可能需要根据具体需求对代码进行修改和扩展,以满足更复杂的场景和功能要求。
结论:
通过以上步骤,我们可以在Java中实现TCP方式发送和接收Socket消息,并且利用多线程模式提高通信效率。这样可以满足大规模并发的需求,使得服务器能够同时处理多个客户端的请求。
需要注意的是,在实际应用中,我们还需要考虑网络异常、数据传输的安全性等问题,并进行相应的处理和优化。
希望本文对您理解如何在Java中实现TCP方式发送和接收Socket消息以及多线程模式有所帮助。如有任何疑问,请随时向我提问。如果您喜欢本文,欢迎点赞、收藏。
相关文章:
如何在Java实现TCP方式发送和接收Socket消息(多线程模式)
目录 导言:正文:1. 创建Server端:2. 创建Client端:3. 多线程模式: 代码示例Server端代码示例:Client端代码示例:同步模式发送TCP消息异步模式 结论: 导言: 在Java编程中…...
SYBASE查询全量字段及对应的表名方法
SELECT COLUMN_name,table_name,user_type,COLUMN_type,width FROM syscolumn a,systable b WHERE a.table_idb.table_id AND COLUMN_name...
Alions 8.6 下 Redis 7.2.0 集群搭建和配置
Redis 7.2.0 搭建和集群配置 一.Redis 下载与单机部署1.Redis 下载2.虚拟机配置3.Redis 单机源码安装和测试4.Java 单机连接测试1.Pom 依赖2.配置文件3.启动类4.配置类5.单元测试6.测试结果 二.Redis 集群部署1.主从1.从节点配置2.Java 测试 2.哨兵1.哨兵节点配置2.复制一个哨兵…...
Android Retrofit 使用及原理详解~
简介 在 Android 开发中,网络请求是一个极为关键的部分。Retrofit 作为一个强大的网络请求库,能够简化开发流程,提供高效的网络请求能力。本文将深入介绍 Retrofit 的高级使用与原理,帮助读者更全面地理解和应用这一库。 什么是…...
三种主要的云交付服务和安全模型
对于许多企业来说,当今的数字化转型之旅包括一个关键决策:采用符合其需求的云交付服务。 云计算已成为现代 IT 基础设施的主要组成部分,具有从可扩展性到成本效率等诸多优势。然而,与所有技术一样,云也有其自身的网络…...
python爬虫实战(3)--爬取某乎热搜
1. 分析爬取地址 打开某乎首页,点击热榜 这个就是我们需要爬取的地址,取到地址某乎/api/v3/feed/topstory/hot-lists/total?limit50&desktoptrue 定义好请求头,从Accept往下的请求头全部复制,转换成json headers {Accep…...
IPv4,IPv6,TCP,路由
主要回顾一下TCP/IP的传输过程,在这个过程中,做了什么事情 ip : 网际协议,IP协议能让世界上任意两台计算机之间进行通信。 IP协议的三大功能: 寻址和路由传递服务:不可靠(尽最大努力交付传输数据包&…...
Java 计算文本相似度
接受一个字符串和一个字符串列表作为参数的 Java 方法,用于计算两个字符串之间的相似度。 方法 import java.util.HashSet; import java.util.List; import java.util.Set;public class StringSimilarity {/*** 计算两个字符串之间的相似度* param str1 第一个字符…...
MySQL 视图
目录 一、视图概述 二、视图的作用和优点 三、视图的使用规则 四、视图操作 1、创建视图 2、查看视图 1)查看视图基本信息 2)查看视图详细信息 3、修改视图 4、更新视图 5、删除视图 一、视图概述 视图是数据库中的一个虚拟表,同真…...
深入理解回调函数qsort:从入门到模拟实现
🍁博客主页:江池俊的博客 💫收录专栏:C语言进阶之路 💡代码仓库:江池俊的代码仓库 🎪我的社区:GeekHub 🎉欢迎大家点赞👍评论📝收藏⭐ 文章目录 前…...
【Git基础】获取远程仓库
我们通常从远程服务器克隆一个Git仓库或者将本地仓库初始化为Git仓库。 1 从远程服务器克隆一个Git仓库 $ git clone https://github.com/your-username/your-repo-name你可以自定义其仓库名称: $ git clone https://github.com/your-username/your-repo-name cu…...
chatGPT界面
效果图: 代码: <!DOCTYPE html> <html> <head><title>复选框样式示例</title> </head> <style>* {padding:0;margin: 0;}.chatpdf{display: flex;height: 100vh;flex-direction: row;}.chatpdf .pannel{widt…...
windows一键启动jupyter
windows一键启动jupyter jupyter简介 Jupyter是一个开源的交互式计算环境,主要用于数据分析、数据可视化和科学计算。它的名字来源于三种编程语言的缩写:Julia、Python和R,这三种语言都可以在Jupyter环境中运行。如果您想进行数据分析、科学…...
树形结构的快速生成
背景 相信大家都遇到过树形结构,像是文件列表、多级菜单、评论区的设计等等,我们都发现它有很多层级,第一级可以有多个,下边的每一个层级也可以有多个;有的可以设计成无限层级的,有的只能设计成两级。那么…...
Android笔记(二十七):自定义Dialog实现居中Toast
背景 记录实现符合项目需求的Toast弹窗 具体实现 class MyTipDialog private constructor(val context: Activity): Dialog(context, R.style.MyTipTheme) {val resId ObservableField(0)private val mainHandler Handler(Looper.getMainLooper())init {setCanceledOnTouc…...
css实现文字的渐变,适合大屏
1 在全局写一个全局样式,文字渐变 2 在组件中使用 CSS3利用-webkit-background-clip: text;实现文字渐变效果_css如何把盒子底部的文字变成透明渐变_I俩月亮的博客-CSDN博客 CSS 如何实现文字渐变色 ?_css字体颜色渐变_一个水瓶座程序猿.的博客-CSDN博客…...
软考高级系统架构设计师系列论文八十七:论企业应用集成
软考高级系统架构设计师系列论文八十七:论企业应用集成 一、企业应用集成相关知识点二、摘要三、正文四、总结一、企业应用集成相关知识点 软考高级系统架构设计师系列之:企业集成平台技术的应用和架构设计二、摘要 本文讨论了某公司的应用系统集成项目。某公司为了应对市场变…...
C++设计模式之适配器模式
一、适配器模式 适配器模式(Adapter Pattern)是一种结构型设计模式,用于将一个类的接口转换成另一个类所期望的接口,以便两个类能够协同工作。 适配器模式可以解决现有类接口与所需接口不匹配的问题,使得原本因接口不…...
山西电力市场日前价格预测【2023-08-24】
日前价格预测 预测明日(2023-08-24)山西电力市场全天平均日前电价为319.98元/MWh。其中,最高日前电价为370.78元/MWh,预计出现在19: 30。最低日前电价为272.42元/MWh,预计出现在12: 45。 价差方向预测 1: 实…...
一文速学-让神经网络不再神秘,一天速学神经网络基础(一)
前言 思索了很久到底要不要出深度学习内容,毕竟在数学建模专栏里边的机器学习内容还有一大半算法没有更新,很多坑都没有填满,而且现在深度学习的文章和学习课程都十分的多,我考虑了很久决定还是得出神经网络系列文章,…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...
