• java线程之二 多线程


    单线程开发模式中。如果一个客户端没有与客户端断开连接,则其他的客户端就必须

    一直等待。多线程则允许多个客户端同时连接服务端,而不需要等待其他客户端断开后

    才可以连接,也就是通常所说的非阻塞通信。

    服务端

     1 /**
     2  * @author  draem0507@gmail.com
     3  * @TODO    java线程开发之二 多线程
     4  * @version 1.0
     5  * @date 2013-5-7下午09:19:45    
     6  * @blgos http://www.cnblogs.com/draem0507
     7  */
     8 
     9 
    10  class ServerTest {
    11     private ServerSocket serverSocket;
    12 
    13     
    14 
    15     public ServerTest() {
    16         try {
    17             serverSocket = new ServerSocket(10000);
    18             // 开启无限循环 创建每个客户端的socket线程
    19             while (true) {
    20                 Socket socket = serverSocket.accept();
    21                 new ReceiveSocket(socket).start();
    22             }
    23         } catch (IOException e) {
    24             // TODO Auto-generated catch block
    25             e.printStackTrace();
    26         }
    27 
    28     }
    29 
    30     public static void main(String[] args) {
    31         new ServerTest();
    32 
    33     }
    34 
    35     private class ReceiveSocket extends Thread {
    36         private Socket socket;
    37 
    38         public ReceiveSocket(Socket socket) {
    39             this.socket = socket;
    40         }
    41 
    42         private BufferedReader reader;
    43         private PrintWriter writer;
    44 
    45         @Override
    46         public void run() {
    47 
    48             try {
    49                 reader = new BufferedReader(new InputStreamReader(socket
    50                         .getInputStream()));
    51                 writer = new PrintWriter(socket.getOutputStream(), true);
    52                 // 开启无限循环 监控消息
    53                 while (true) {
    54                     String msg = reader.readLine();
    55                     System.out.println("客户端对你说:" + msg);
    56                     // write(msg)+write("\r")==println() 具体请参考PrintWriter源码
    57                     writer.write("服务端收到客户端发送的信息:" + msg);
    58                     writer.println();
    59                     while (msg.equals("bye")) {
    60                         break;
    61                     }
    62                 }
    63 
    64             } catch (IOException e) {
    65                 // TODO Auto-generated catch block
    66                 e.printStackTrace();
    67             } finally {
    68                 if (null != reader) {
    69                     try {
    70                         reader.close();
    71                     } catch (IOException e) {
    72                         // TODO Auto-generated catch block
    73                         e.printStackTrace();
    74                     }
    75                 }
    76                 if (null != writer) {
    77                     try {
    78                         reader.close();
    79                     } catch (IOException e) {
    80                         // TODO Auto-generated catch block
    81                         e.printStackTrace();
    82                     }
    83                 }
    84                 try {
    85                     socket.close();
    86                 } catch (IOException e) {
    87                     // TODO Auto-generated catch block
    88                     e.printStackTrace();
    89                 }
    90             }
    91 
    92         }
    93 
    94     }
    95 
    96 }

    客户端

     1 public class ClientTest {
     2     public static void main(String[] args) throws Exception {
     3         Socket socket = new Socket("localhost", 10000);
     4         BufferedReader in = new BufferedReader(new InputStreamReader(socket
     5                 .getInputStream()));
     6         PrintWriter out = new PrintWriter(socket.getOutputStream());
     7         BufferedReader reader = new BufferedReader(new InputStreamReader(
     8                 System.in));
     9 
    10         while (true) {
    11             String msg = reader.readLine();
    12             out.println(msg);
    13             out.flush();
    14             if (msg.equals("bye")) {
    15                 break;
    16             }
    17             System.out.println(in.readLine());
    18         }
    19         socket.close();
    20     }
    21 }

    运行服务端后,可以多次运行客户端,并且之间的通信是互不干扰。

    顺便提个问题,如果实现客户端与客户端的通信 及其服务端如何群发信息给客户端,感兴趣的朋友可以去研究下。

  • 相关阅读:
    Java8新特性
    搜索解决方案 -- ElasticSearch入门
    插入排序
    单点登录系统CAS入门
    快速排序
    选择性排序
    冒泡排序
    springcloud入门
    消息中间件 -- RabbitMQ
    ActiveMQ中消息的重发与持久化保存
  • 原文地址:https://www.cnblogs.com/draem0507/p/3066463.html
Copyright © 2020-2023  润新知