2.1.3 同步阻塞式I/O创建的TimeClient源码分析
客户端通过Socket创建,发送查询时间服务器的"QUERY TIME ORDER"指令,然后读取服务端的响应并将结果打印出来,随后关闭连接,释放资源,程序退出执行。
代码清单2-3 同步阻塞I/O的TimeClient
- 13. public class TimeClient {
- 14.
- 15. /**
- 16. * @param args
- 17. */
- 18. public static void main(String[] args) {
- 19. int port = 8080;
- 20. if (args != null && args.length > 0) {
- 21. try {
- 22. port = Integer.valueOf(args[0]);
- 23. } catch (NumberFormatException e) {
- 24. // 采用默认值
- 25. }
- 26. }
- 27. Socket socket = null;
- 28. BufferedReader in = null;
- 29. PrintWriter out = null;
- 30. try {
- 31. socket = new Socket("127.0.0.1", port);
- 32. in = new BufferedReader(new InputStreamReader(
- 33. socket.getInputStream()));
- 34. out = new PrintWriter(socket.getOutputStream(), true);
- 35. out.println("QUERY TIME ORDER");
- 36. System.out.println("Send order 2 server succeed.");
- 37. String resp = in.readLine();
- 38. System.out.println("Now is : " + resp);
- 39. } catch (Exception e) {
- 40. //不需要处理
- 41. } finally {
- 42. if (out != null) {
- 43. out.close();
- 44. out = null;
- 45. }
- 46.
- 47. if (in != null) {
- 48. try {
- 49. in.close();
- 50. } catch (IOException e) {
- 51. e.printStackTrace();
- 52. }
- 53. in = null;
- 54. }
- 55. if (socket != null) {
- 56. try {
- 57. socket.close();
- 58. } catch (IOException e) {
- 59. e.printStackTrace();
- 60. }
- 61. socket = null;
- 62. }
- 63. }
- 64. }
- 65. }
第35行客户端通过PrintWriter向服务端发送"QUERY TIME ORDER"指令,然后通过BufferedReader的readLine读取响应并打印。
分别执行服务端和客户端,执行结果如下。
服务端执行结果如图2-3所示。

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

到此为止,同步阻塞式I/O开发的时间服务器程序已经讲解完毕,我们发现,BIO主要的问题在于每当有一个新的客户端请求接入时,服务端必须创建一个新的线程处理新接入的客户端链路,一个线程只能处理一个客户端连接。在高性能服务器应用领域,往往需要面向成千上万个客户端的并发连接,这种模型显然无法满足高性能、高并发接入的场景。
为了改进一线程一连接模型,后来又演进出了一种通过线程池或者消息队列实现1个或者多个线程处理N个客户端的模型,由于它的底层通信机制依然使用同步阻塞I/O,所以被称为“伪异步”,下面章节我们就对伪异步代码进行分析,看看伪异步是否能够满足我们对高性能、高并发接入的诉求。
喜欢的朋友可以添加我们的微信账号:
51CTO读书频道二维码

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