Java Socket实战之二 多线程通信
来源:互联网 发布:男人知天命之年说说 编辑:程序博客网 时间:2024/04/26 19:18
一篇文章说到怎样写一个最简单的Java Socket通信,但是在上一篇文章中的例子有一个问题就是Server只能接受一个Client请求,当第一个Client连接后就占据了这个位置,后续Client不能再继续连接,所以需要做些改动,当Server没接受到一个Client连接请求之后,都把处理流程放到一个独立的线程里去运行,然后等待下一个Client连接请求,这样就不会阻塞Server端接收请求了。每个独立运行的程序在使用完Socket对象之后要将其关闭。具体代码如下:[java] view plaincopyprint?1.package com.googlecode.garbagecan.test.socket.sample2; 2. 3.import java.io.BufferedReader; 4.import java.io.IOException; 5.import java.io.InputStreamReader; 6.import java.io.PrintWriter; 7.import java.net.ServerSocket; 8.import java.net.Socket; 9. 10.public class MyServer { 11. public static void main(String[] args) throws IOException { 12. ServerSocket server = new ServerSocket(10000); 13. 14. while (true) { 15. Socket socket = server.accept(); 16. invoke(socket); 17. } 18. } 19. 20. private static void invoke(final Socket client) throws IOException { 21. new Thread(new Runnable() { 22. public void run() { 23. BufferedReader in = null; 24. PrintWriter out = null; 25. try { 26. in = new BufferedReader(new InputStreamReader(client.getInputStream())); 27. out = new PrintWriter(client.getOutputStream()); 28. 29. while (true) { 30. String msg = in.readLine(); 31. System.out.println(msg); 32. out.println("Server received " + msg); 33. out.flush(); 34. if (msg.equals("bye")) { 35. break; 36. } 37. } 38. } catch(IOException ex) { 39. ex.printStackTrace(); 40. } finally { 41. try { 42. in.close(); 43. } catch (Exception e) {} 44. try { 45. out.close(); 46. } catch (Exception e) {} 47. try { 48. client.close(); 49. } catch (Exception e) {} 50. } 51. } 52. }).start(); 53. } 54.} 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程序代码:[java] view plaincopyprint?1.package com.googlecode.garbagecan.test.socket.sample2; 2. 3.import java.io.BufferedReader; 4.import java.io.InputStreamReader; 5.import java.io.PrintWriter; 6.import java.net.Socket; 7. 8.public class MyClient { 9. public static void main(String[] args) throws Exception { 10. Socket socket = new Socket("localhost", 10000); 11. BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 12. PrintWriter out = new PrintWriter(socket.getOutputStream()); 13. BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); 14. 15. while (true) { 16. String msg = reader.readLine(); 17. out.println(msg); 18. out.flush(); 19. if (msg.equals("bye")) { 20. break; 21. } 22. System.out.println(in.readLine()); 23. } 24. socket.close(); 25. } 26.} 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 Socket实战之二 多线程通信
- Java Socket实战之二 多线程通信
- Java Socket实战之二 多线程通信 .
- Java Socket实战之二 多线程通信
- Java Socket实战之二 多线程通信
- Java Socket实战之二:多线程通信
- Java Socket实战之二 多线程通信
- Java Socket实战之二 多线程通信
- Java Socket实战之二 多线程通信
- Java Socket实战之二 多线程通信
- Java Socket实战之二:多线程通信
- Java Socket实战之二 多线程通信
- Java Socket实战之二 多线程通信
- Java Socket实战之二 多线程通信
- Java Socket实战之二 多线程通信
- Java Socket实战之二 多线程通信
- Java Socket实战之二 多线程通信
- Java Socket实战之二 多线程通信
- JacORB安装及配置指南
- COM中的HRESULT, CLISD,ProgID, DLL注册,COM库函数的知识(COM技术内幕笔记之三)
- 动态切换数据源(spring+hibernate)
- 网站分析-这里好像有问题!(三)
- IT菜鸟修行记一
- Java Socket实战之二 多线程通信
- hadoop+hazelcast
- ios导入头文件
- SQLite .net
- 大数据平台开发高级工程师
- QAxBase: Error calling IDispatch member SaveAs: Exception thrown by server Code : 1004
- 线程之同步的两种条件总结
- HDU 3826 Squarefree number 简单的数论题
- session超时,处理ajax请求