Java Socket實現(xiàn)多線程通信功能示例
本文實例講述了Java Socket實現(xiàn)多線程通信功能的方法。分享給大家供大家參考,具體如下:
前面的文章《Java Socket實現(xiàn)單線程通信的方法示例》說到怎樣寫一個最簡單的Java Socket通信,但是文章中的例子有一個問題就是Server只能接受一個Client請求,當?shù)谝粋€Client連接后就占據(jù)了這個位置,后續(xù)Client不能再繼續(xù)連接,所以需要做些改動,當Server沒接受到一個Client連接請求之后,都把處理流程放到一個獨立的線程里去運行,然后等待下一個Client連接請求,這樣就不會阻塞Server端接收請求了。每個獨立運行的程序在使用完Socket對象之后要將其關閉。代碼如下:
package com.googlecode.garbagecan.test.socket.sample2; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class MyServer { public static void main(String[] args) throws IOException { ServerSocket server = new ServerSocket(10000); while (true) { Socket socket = server.accept(); invoke(socket); } } private static void invoke(final Socket client) throws IOException { new Thread(new Runnable() { public void run() { BufferedReader in = null; PrintWriter out = null; try { in = new BufferedReader(new InputStreamReader(client.getInputStream())); out = new PrintWriter(client.getOutputStream()); while (true) { String msg = in.readLine(); System.out.println(msg); out.println("Server received " + msg); out.flush(); if (msg.equals("bye")) { break; } } } catch(IOException ex) { ex.printStackTrace(); } finally { try { in.close(); } catch (Exception e) {} try { out.close(); } catch (Exception e) {} try { client.close(); } catch (Exception e) {} } } }).start(); } }
下面是Client程序代碼:
package com.googlecode.garbagecan.test.socket.sample2; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; public class MyClient { public static void main(String[] args) throws Exception { Socket socket = new Socket("localhost", 10000); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter out = new PrintWriter(socket.getOutputStream()); BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); while (true) { String msg = reader.readLine(); out.println(msg); out.flush(); if (msg.equals("bye")) { break; } System.out.println(in.readLine()); } socket.close(); } }
測試,首先運行MyServer類,然后運行兩個MyClient類,然后分別在每個MyClient的提示符下輸入字符串,就可以看到Server可以分別接收處理每個Client的請求了。
更多關于java相關內(nèi)容感興趣的讀者可查看本站專題:《Java Socket編程技巧總結(jié)》、《Java文件與目錄操作技巧匯總》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點技巧總結(jié)》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設計有所幫助。
相關文章
Spring整合TimerTask實現(xiàn)定時任務調(diào)度
這篇文章主要介紹了Spring整合TimerTask實現(xiàn)定時任務調(diào)度的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-12-12Java的Flowable工作流之加簽轉(zhuǎn)簽詳解
這篇文章主要介紹了Java的Flowable工作流之加簽轉(zhuǎn)簽詳解,Flowable是一個開源的工作流引擎,它提供了一套強大的工具和功能,用于設計、執(zhí)行和管理各種類型的工作流程,需要的朋友可以參考下2023-11-11Java 實現(xiàn)倒計時功能(由秒計算天、小時、分鐘、秒)
最近做項目遇到這樣的需求,天、小時、分鐘、秒的數(shù)值都是隔開的,服務器端只返回一個時間戳長度,怎么實現(xiàn)這樣的功能呢?下面小編給大家?guī)砹薐ava 實現(xiàn)倒計時功能的方案,需要的朋友參考下吧2018-01-01SpringBoot整合websocket實現(xiàn)即時通信聊天
這篇文章主要介紹了SpringBoot整合websocket實現(xiàn)即時通信聊天,實時通信是一個實時通信系統(tǒng),允許兩人或多人使用網(wǎng)絡實時的傳遞文字消息、文件、語音與視頻交流,需要的朋友可以參考下2022-05-05