Java如何使用线程池实现socket编程
发表于:2025-02-05 作者:千家信息网编辑
千家信息网最后更新 2025年02月05日,这篇文章主要讲解了"Java如何使用线程池实现socket编程",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Java如何使用线程池实现socket编程
千家信息网最后更新 2025年02月05日Java如何使用线程池实现socket编程
这篇文章主要讲解了"Java如何使用线程池实现socket编程",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Java如何使用线程池实现socket编程"吧!
前言
以多个客户端和一个服务端的socket通信为例,服务端启动时创建一个固定大小的线程池。服务端每接收到一个连接请求后(通信任务),交给线程池执行,任务类实现了Runnable接口,用于跟客户端进行读写操作,该类的对象作为任务通过execute(Runnable task)提交给线程池。
一、一个简单的C/S模型实现
1.服务器:
import java.io.InputStream;import java.net.ServerSocket;import java.net.Socket;public class Server { public static void main(String[] args) throws Exception { System.out.println("server start"); ServerSocket server = new ServerSocket(1003); while (true) { Socket client = server.accept(); InputStream input = client.getInputStream(); byte[] b = new byte[8196]; int len = input.read(b); System.out.println(new String(b, 0, len)); if(new String(b).equals("close")) break; client.close(); } server.close(); }}
2.客户端:
import java.io.OutputStream;import java.net.Socket;import java.util.Scanner;public class Client { public static void main(String[] args) throws Exception { System.out.println("client start"); Scanner scanner =new Scanner(System.in); Socket client =new Socket("localhost",1003); OutputStream out = client.getOutputStream(); while (true) { String str = scanner.nextLine(); out.write(str.getBytes()); } }}
此处只能服务器接收客户端信息。
二、线程池使用方法
1.新建一个线程池
ExecutorService pool = Executors.newFixedThreadPool(3);
创建一个线程池,该线程池重用在共享无界队列上运行的固定数量的线程。 在任何时候,最多3个线程将是活动的处理任务。如果在所有线程都处于活动状态时提交了其他任务,它们将在队列中等待,直到有线程可用。 如果任何线程在关闭之前的执行过程中由于失败而终止,如果需要执行后续任务,新的线程将取代它。 池中的线程将一直存在,直到显式关闭。
2.用Runnable接口实现线程
private static class InnerThread implements Runnable{public void run();}
3.创建线程对象并提交至线程池执行
InnerThread innerThread = new InnerThread();pool.execute(innerThread);
三、结合起来
当新的连接建立时创建一个新线程并提交到线程池
while(true){ Socket clientSocket = server.accept(); InnerThread innerThread = new InnerThread(clientSocket); pool.execute(innerThread); }
run方法为如何处理新连接,以及客户端和服务端的信息交流。
四、使用新的输入输出流
由于OutputStream和InputStream类有方法没有实现或是实现的不是很好,所以我们选择使用
BufferedReader,PrintWriter类来实现通信。
服务器:
BufferedReader br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));PrintWriter pw = new PrintWriter(new OutputStreamWriter(clientSocket.getOutputStream()));while(true){ String buf = br.readLine(); System.out.println(Thread.currentThread().getName()+" client: " + buf); if(buf.equals("close")){ break; } pw.println("response:"+buf); pw.flush(); } System.out.println("close client"); br.close(); pw.close(); clientSocket.close();
客户端:
BufferedReader br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));PrintWriter pw = new PrintWriter(new OutputStreamWriter(clientSocket.getOutputStream())); while(true){ System.out.print("client: "); String buf = sc.nextLine(); pw.println(buf); pw.flush(); if(buf.equals("close")){ break; } buf= br.readLine(); System.out.println("server: " + buf); if(buf.equals("close")){ break; } } br.close(); pw.close(); sc.close(); clientSocket.close();
这样子就能较为方便的实现服务端向客户端发送信息。
感谢各位的阅读,以上就是"Java如何使用线程池实现socket编程"的内容了,经过本文的学习后,相信大家对Java如何使用线程池实现socket编程这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
线程
服务
客户
客户端
任务
编程
信息
服务器
学习
通信
内容
对象
接口
方法
端的
队列
活动
使用方法
前言
多个
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
叶祥柱19计算机网络技术
系统集成软件开发行业
数据库系统原理简答doc下载
网络安全手抄报初
pm2.5数据库
软件开发行业的客户
电脑通过路由器可以访问数据库
学校网络安全工作标准规范
山东苹果软件开发靠谱吗
网络安全法何时开始的
幻塔怎么找以前登过的服务器
珠海搬家服务软件开发设计
吉林省中小学校园网络安全
软件开发人物访谈报告范文
vm虚拟机网络技术
服务器出生点是什么样子的
永劫无间私人服务器
游戏公司的软件开发系统
数据库关闭游标
浪潮英信服务器拓扑图
宾馆网络安全技术措施
web.py 服务器
战舰少女r服务器没了
无线移动网络技术仿真实验
sap和软件开发
服务器未识别网络连接
如何保障服务器安全性
shell服务器默认字符集
全国特殊工种数据库
计算机网络安全技术深圳出版