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

如何在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消息(多线程模式)

目录 导言&#xff1a;正文&#xff1a;1. 创建Server端&#xff1a;2. 创建Client端&#xff1a;3. 多线程模式&#xff1a; 代码示例Server端代码示例&#xff1a;Client端代码示例&#xff1a;同步模式发送TCP消息异步模式 结论&#xff1a; 导言&#xff1a; 在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 开发中&#xff0c;网络请求是一个极为关键的部分。Retrofit 作为一个强大的网络请求库&#xff0c;能够简化开发流程&#xff0c;提供高效的网络请求能力。本文将深入介绍 Retrofit 的高级使用与原理&#xff0c;帮助读者更全面地理解和应用这一库。 什么是…...

三种主要的云交付服务和安全模型

对于许多企业来说&#xff0c;当今的数字化转型之旅包括一个关键决策&#xff1a;采用符合其需求的云交付服务。 云计算已成为现代 IT 基础设施的主要组成部分&#xff0c;具有从可扩展性到成本效率等诸多优势。然而&#xff0c;与所有技术一样&#xff0c;云也有其自身的网络…...

python爬虫实战(3)--爬取某乎热搜

1. 分析爬取地址 打开某乎首页&#xff0c;点击热榜 这个就是我们需要爬取的地址&#xff0c;取到地址某乎/api/v3/feed/topstory/hot-lists/total?limit50&desktoptrue 定义好请求头&#xff0c;从Accept往下的请求头全部复制&#xff0c;转换成json headers {Accep…...

IPv4,IPv6,TCP,路由

主要回顾一下TCP&#xff0f;IP的传输过程&#xff0c;在这个过程中&#xff0c;做了什么事情 ip : 网际协议,IP协议能让世界上任意两台计算机之间进行通信。 IP协议的三大功能&#xff1a; 寻址和路由传递服务&#xff1a;不可靠&#xff08;尽最大努力交付传输数据包&…...

Java 计算文本相似度

接受一个字符串和一个字符串列表作为参数的 Java 方法&#xff0c;用于计算两个字符串之间的相似度。 方法 import java.util.HashSet; import java.util.List; import java.util.Set;public class StringSimilarity {/*** 计算两个字符串之间的相似度* param str1 第一个字符…...

MySQL 视图

目录 一、视图概述 二、视图的作用和优点 三、视图的使用规则 四、视图操作 1、创建视图 2、查看视图 1&#xff09;查看视图基本信息 2&#xff09;查看视图详细信息 3、修改视图 4、更新视图 5、删除视图 一、视图概述 视图是数据库中的一个虚拟表&#xff0c;同真…...

深入理解回调函数qsort:从入门到模拟实现

&#x1f341;博客主页&#xff1a;江池俊的博客 &#x1f4ab;收录专栏&#xff1a;C语言进阶之路 &#x1f4a1;代码仓库&#xff1a;江池俊的代码仓库 &#x1f3aa;我的社区&#xff1a;GeekHub &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐ 文章目录 前…...

【Git基础】获取远程仓库

我们通常从远程服务器克隆一个Git仓库或者将本地仓库初始化为Git仓库。 1 从远程服务器克隆一个Git仓库 $ git clone https://github.com/your-username/your-repo-name你可以自定义其仓库名称&#xff1a; $ git clone https://github.com/your-username/your-repo-name cu…...

chatGPT界面

效果图&#xff1a; 代码&#xff1a; <!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是一个开源的交互式计算环境&#xff0c;主要用于数据分析、数据可视化和科学计算。它的名字来源于三种编程语言的缩写&#xff1a;Julia、Python和R&#xff0c;这三种语言都可以在Jupyter环境中运行。如果您想进行数据分析、科学…...

树形结构的快速生成

背景 相信大家都遇到过树形结构&#xff0c;像是文件列表、多级菜单、评论区的设计等等&#xff0c;我们都发现它有很多层级&#xff0c;第一级可以有多个&#xff0c;下边的每一个层级也可以有多个&#xff1b;有的可以设计成无限层级的&#xff0c;有的只能设计成两级。那么…...

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 在全局写一个全局样式&#xff0c;文字渐变 2 在组件中使用 CSS3利用-webkit-background-clip: text;实现文字渐变效果_css如何把盒子底部的文字变成透明渐变_I俩月亮的博客-CSDN博客 CSS 如何实现文字渐变色 &#xff1f;_css字体颜色渐变_一个水瓶座程序猿.的博客-CSDN博客…...

软考高级系统架构设计师系列论文八十七:论企业应用集成

软考高级系统架构设计师系列论文八十七:论企业应用集成 一、企业应用集成相关知识点二、摘要三、正文四、总结一、企业应用集成相关知识点 软考高级系统架构设计师系列之:企业集成平台技术的应用和架构设计二、摘要 本文讨论了某公司的应用系统集成项目。某公司为了应对市场变…...

C++设计模式之适配器模式

一、适配器模式 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;用于将一个类的接口转换成另一个类所期望的接口&#xff0c;以便两个类能够协同工作。 适配器模式可以解决现有类接口与所需接口不匹配的问题&#xff0c;使得原本因接口不…...

山西电力市场日前价格预测【2023-08-24】

日前价格预测 预测明日&#xff08;2023-08-24&#xff09;山西电力市场全天平均日前电价为319.98元/MWh。其中&#xff0c;最高日前电价为370.78元/MWh&#xff0c;预计出现在19: 30。最低日前电价为272.42元/MWh&#xff0c;预计出现在12: 45。 价差方向预测 1&#xff1a; 实…...

一文速学-让神经网络不再神秘,一天速学神经网络基础(一)

前言 思索了很久到底要不要出深度学习内容&#xff0c;毕竟在数学建模专栏里边的机器学习内容还有一大半算法没有更新&#xff0c;很多坑都没有填满&#xff0c;而且现在深度学习的文章和学习课程都十分的多&#xff0c;我考虑了很久决定还是得出神经网络系列文章&#xff0c;…...

Qwen3-0.6B-FP8多语言落地:支持粤语、闽南语、藏语等方言指令理解实测

Qwen3-0.6B-FP8多语言落地&#xff1a;支持粤语、闽南语、藏语等方言指令理解实测 1. 引言&#xff1a;当AI能听懂你的家乡话 想象一下&#xff0c;你正在用粤语和AI助手聊天&#xff0c;让它帮你写一份工作报告&#xff1b;或者用闽南语问它今天的天气&#xff0c;它不仅能听…...

ente/auth缓存机制详解:提高系统响应速度

ente/auth缓存机制详解&#xff1a;提高系统响应速度 【免费下载链接】ente 完全开源&#xff0c;端到端加密的Google Photos和Apple Photos的替代品 项目地址: https://gitcode.com/GitHub_Trending/en/ente ente/auth作为专注于移动设备的两步验证&#xff08;2FA&…...

手把手教你用丹青识画:智能影像雅鉴系统保姆级入门教程

手把手教你用丹青识画&#xff1a;智能影像雅鉴系统保姆级入门教程 1. 认识丹青识画系统 "以科技之眼&#xff0c;点画意之睛。"这句话完美诠释了丹青识画系统的核心理念。这是一款将人工智能技术与东方美学相结合的创新工具&#xff0c;能够自动分析图像内容并生成…...

终极指南:掌握JSON-BigInt解决JavaScript大整数精度丢失问题

终极指南&#xff1a;掌握JSON-BigInt解决JavaScript大整数精度丢失问题 【免费下载链接】json-bigint JSON.parse/stringify with bigints support 项目地址: https://gitcode.com/gh_mirrors/js/json-bigint 在JavaScript开发中&#xff0c;你是否遇到过处理大整数时精…...

从Shadertoy到Cesium:那些GLSL移植时没人告诉你的分辨率陷阱

GLSL跨平台移植中的分辨率适配陷阱与实战解决方案 当我们将Shadertoy上令人惊艳的GLSL效果移植到Cesium等三维引擎时&#xff0c;往往会遇到一个看似简单却影响深远的问题——分辨率适配。这个问题不仅关乎视觉效果还原度&#xff0c;更直接影响着色器在不同设备上的表现一致性…...

新书推荐:《尊严的颓败》在废墟之上,寻找灵魂的微光

当世界沦为巨大的名利场&#xff0c;当人被简化为数据与欲望的载体&#xff0c;我们该如何定义“人”&#xff1f;又该如何安放那颗被称为“灵魂”的种子&#xff1f;洛本的《尊严的颓败》并非一本让人阅读时感到轻松愉悦的书&#xff0c;它更像是一把手术刀&#xff0c;精准地…...

Apache Doris 存储与查询优化实战:从架构设计到性能调优的完整指南

1. Apache Doris 架构设计精要 第一次接触Apache Doris时&#xff0c;我被它简洁的架构设计惊艳到了。这个MPP架构的分析型数据库&#xff0c;用计算存储分离的设计思路&#xff0c;把复杂的大数据分析变得像查普通MySQL表一样简单。FE&#xff08;Frontend&#xff09;和BE&am…...

OpenRGB:统一多品牌设备控制的开源RGB解决方案

OpenRGB&#xff1a;统一多品牌设备控制的开源RGB解决方案 【免费下载链接】OpenRGB Open source RGB lighting control that doesnt depend on manufacturer software. Supports Windows, Linux, MacOS. Mirror of https://gitlab.com/CalcProgrammer1/OpenRGB. Releases can …...

像素时装锻造坊入门必看:预设咒语+Forge Scale滑块参数详解

像素时装锻造坊入门必看&#xff1a;预设咒语Forge Scale滑块参数详解 1. 工具介绍&#xff1a;像素时装锻造坊 像素时装锻造坊&#xff08;Pixel Fashion Atelier&#xff09;是一款基于Stable Diffusion与Anything-v5模型的图像生成工具。它采用独特的复古日系RPG界面设计&…...

告别PCtoLCD2002!这款单片机调试助手如何用3步搞定OLED汉字显示?

3步解锁OLED汉字显示&#xff1a;新一代嵌入式开发神器实战指南 在嵌入式开发领域&#xff0c;OLED屏幕的汉字显示一直是让开发者头疼的难题。传统方案如PCtoLCD2002等取模软件不仅操作繁琐&#xff0c;生成的代码还需要大量手工调整。如今&#xff0c;一款名为单片机多功能调试…...