设为首页 加入收藏

TOP

2.1.3 同步阻塞式I/O创建的TimeClient源码分析
2014-07-09 12:30:40 来源: 作者: 【 】 浏览:93
Tags:2.1.3 同步 阻塞 I/O 创建 TimeClient 源码 分析

2.1.3  同步阻塞式I/O创建的TimeClient源码分析

客户端通过Socket创建,发送查询时间服务器的"QUERY TIME ORDER"指令,然后读取服务端的响应并将结果打印出来,随后关闭连接,释放资源,程序退出执行。

代码清单2-3  同步阻塞I/O的TimeClient
 

  1. 13. public class TimeClient {  
  2. 14.   
  3. 15.     /**  
  4. 16.      * @param args  
  5. 17.      */  
  6. 18.     public static void main(String[] args) {  
  7. 19.     int port = 8080;  
  8. 20.     if (args != null && args.length > 0) {  
  9. 21.         try {  
  10. 22.         port = Integer.valueOf(args[0]);  
  11. 23.         } catch (NumberFormatException e) {  
  12. 24.         // 采用默认值  
  13. 25.         }  
  14. 26.     }  
  15. 27.     Socket socket = null;  
  16. 28.     BufferedReader in = null;  
  17. 29.     PrintWriter out = null;  
  18. 30.     try {  
  19. 31.         socket = new Socket("127.0.0.1", port);  
  20. 32.         in = new BufferedReader(new InputStreamReader(  
  21. 33.             socket.getInputStream()));  
  22. 34.         out = new PrintWriter(socket.getOutputStream(), true);  
  23. 35.         out.println("QUERY TIME ORDER");  
  24. 36.         System.out.println("Send order 2 server succeed.");  
  25. 37.         String resp = in.readLine();  
  26. 38.         System.out.println("Now is : " + resp);  
  27. 39.     } catch (Exception e) {  
  28. 40.        //不需要处理  
  29. 41.     } finally {  
  30. 42.         if (out != null) {  
  31. 43.         out.close();  
  32. 44.         out = null;  
  33. 45.         }  
  34. 46.   
  35. 47.         if (in != null) {  
  36. 48.         try {  
  37. 49.             in.close();  
  38. 50.         } catch (IOException e) {  
  39. 51.             e.printStackTrace();  
  40. 52.         }  
  41. 53.         in = null;  
  42. 54.         }  
  43. 55.         if (socket != null) {  
  44. 56.         try {  
  45. 57.             socket.close();  
  46. 58.         } catch (IOException e) {  
  47. 59.             e.printStackTrace();  
  48. 60.         }  
  49. 61.         socket = null;  
  50. 62.         }  
  51. 63.     }  
  52. 64.     }  
  53. 65. } 

第35行客户端通过PrintWriter向服务端发送"QUERY TIME ORDER"指令,然后通过BufferedReader的readLine读取响应并打印。

分别执行服务端和客户端,执行结果如下。

服务端执行结果如图2-3所示。
 

客户端执行结果如图2-4所示。
 

到此为止,同步阻塞式I/O开发的时间服务器程序已经讲解完毕,我们发现,BIO主要的问题在于每当有一个新的客户端请求接入时,服务端必须创建一个新的线程处理新接入的客户端链路,一个线程只能处理一个客户端连接。在高性能服务器应用领域,往往需要面向成千上万个客户端的并发连接,这种模型显然无法满足高性能、高并发接入的场景。

为了改进一线程一连接模型,后来又演进出了一种通过线程池或者消息队列实现1个或者多个线程处理N个客户端的模型,由于它的底层通信机制依然使用同步阻塞I/O,所以被称为“伪异步”,下面章节我们就对伪异步代码进行分析,看看伪异步是否能够满足我们对高性能、高并发接入的诉求。
 

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:342347198

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇2.1.2 同步阻塞式I/O创建的TimeSe.. 下一篇2.2.1 伪异步I/O模型图

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·C语言指针从入门到基 (2025-12-26 05:21:36)
·【C语言指针初阶】C (2025-12-26 05:21:33)
·C语言指针的定义和使 (2025-12-26 05:21:31)
·在 Redis 中如何查看 (2025-12-26 03:19:03)
·Redis在实际应用中, (2025-12-26 03:19:01)