按关键词阅读:
2、使用newCachedThreadPool( )动态创建线程池线程池作为成员变量:
//创建动态线程池 , 适合小并发量 , 容易出现OutOfMemoryErrorprivate ExecutorService executorService=Executors.newCachedThreadPool();
服务端的Service方法中创建新线程 , 交给线程池处理 。
//多客户版本 , 可以同时与多用户建立通信连接public void Service() throws IOException {while (true){Socket socket=null;socket=serverSocket.accept();//将服务器和客户端的通信交给线程池处理Handler handler=new Handler(socket);executorService.execute(handler);}}
三、多用户与服务端通信演示之前服务端只支持单用户通信对话时候 , 新用户发送的信息阻塞 , 服务器无法返回 。
文章插图
很有趣发现一点 , 另外一端结束通信 , 与此同时 , 另一端则立即收到服务器的回复信息 。
文章插图
从显示的时间上初步观察 , 可以判断之前发送的信息是阻塞在服务端进程 , 断开一方连接后 , 服务端才将阻塞队列的信息发送到客户端 。 那使用多线程之后 , 结果是怎么样呢?
文章插图
动图演示进一步体会:
文章插图
四、多用户服务器完整代码
/** TCPThreadServer.java* Copyright (c) 2020-11-14* author : Charzous* All right reserved.*/package chapter05;import java.io.*;import java.net.ServerSocket;import java.net.Socket;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class TCPThreadServer {private int port =8008;//服务器监听窗口private ServerSocket serverSocket;//定义服务器套接字//创建动态线程池 , 适合小并发量 , 容易出现OutOfMemoryErrorprivate ExecutorService executorService=Executors.newCachedThreadPool();public TCPThreadServer() throws IOException{serverSocket =new ServerSocket(8008);System.out.println("服务器启动监听在"+port+"端口...");}private PrintWriter getWriter(Socket socket) throws IOException{//获得输出流缓冲区的地址OutputStream socketOut=socket.getOutputStream();//网络流写出需要使用flush , 这里在printWriter构造方法直接设置为自动flushreturn new PrintWriter(new OutputStreamWriter(socketOut,"utf-8"),true);}private BufferedReader getReader(Socket socket) throws IOException{//获得输入流缓冲区的地址InputStream socketIn=socket.getInputStream();return new BufferedReader(new InputStreamReader(socketIn,"utf-8"));}//多客户版本 , 可以同时与多用户建立通信连接public void Service() throws IOException {while (true){Socket socket=null;socket=serverSocket.accept();//将服务器和客户端的通信交给线程池处理Handler handler=new Handler(socket);executorService.execute(handler);}}class Handler implements Runnable {private Socket socket;public Handler(Socket socket) {this.socket = socket;}public void run() {//本地服务器控制台显示客户端连接的用户信息System.out.println("New connection accept:" + socket.getInetAddress());try {BufferedReader br = getReader(socket);PrintWriter pw = getWriter(socket);pw.println("From 服务器:欢迎使用服务!");String msg = null;while ((msg = br.readLine()) != null) {if (msg.trim().equalsIgnoreCase("bye")) {pw.println("From 服务器:服务器已断开连接 , 结束服务!");System.out.println("客户端离开 。 ");break;}pw.println("From 服务器:" + msg);pw.println("来自服务器,重复消息:"+msg);}} catch (IOException e) {e.printStackTrace();} finally {try {if (socket != null)socket.close();} catch (IOException e) {e.printStackTrace();}}}}public static void main(String[] args) throws IOException{new TCPThreadServer().Service();}}
最后本篇将解决了服务端多用户通信的问题 , 详细记录服务端多线程的实现 , 目标是多用户(客户端)能够同时与服务器建立连接并通信 , 避免阻塞 , 进一步完善TCP的Socket网络通信 , 运用Java多线程技术 , 实现多用户与服务端Socket通信!简而言之 , 相当于多用户访问服务器资源 , 服务器应该与各个客户端建立连接 , 就像我们日常使用QQ、微信、视频等客户端 , 就是多用户与服务器通信的例子 。 老问题了 , ?乛?乛? , 好像完成这个之后 , 可以来实现一个什么有趣的呢?这里停留思考3秒!………………就是:实现一个群组聊天房间 , 类似QQ、微信的群聊 , 可以多个用户之间的对话交流 , 是不是感觉挺有趣的 。 ————————————本博文版权归作者所有!禁止商业转载等用途或联系作者授权 , 非商业转载请注明出处!作者:Charzueus 来源:博客园本文链接:
稿源:(未知)
【傻大方】网址:http://www.shadafang.com/c/111J2a392020.html
标题:Java多线程技术:实现多用户服务端Socket通信( 二 )