博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java线程之二 多线程
阅读量:7038 次
发布时间:2019-06-28

本文共 3877 字,大约阅读时间需要 12 分钟。

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

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

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

服务端

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 block25             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         @Override46         public void run() {47 48             try {49                 reader = new BufferedReader(new InputStreamReader(socket50                         .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 block66                 e.printStackTrace();67             } finally {68                 if (null != reader) {69                     try {70                         reader.close();71                     } catch (IOException e) {72                         // TODO Auto-generated catch block73                         e.printStackTrace();74                     }75                 }76                 if (null != writer) {77                     try {78                         reader.close();79                     } catch (IOException e) {80                         // TODO Auto-generated catch block81                         e.printStackTrace();82                     }83                 }84                 try {85                     socket.close();86                 } catch (IOException e) {87                     // TODO Auto-generated catch block88                     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 }

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

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

 

 

转载于:https://www.cnblogs.com/draem0507/archive/2013/05/08/3066463.html

你可能感兴趣的文章
Java第四次作业
查看>>
详解CSS float属性(转)
查看>>
【总结整理】冯诺依曼体系结构
查看>>
Oracle自制事务
查看>>
bzoj 1452: [JSOI2009]Count ——二维树状数组
查看>>
147. Insertion Sort List
查看>>
Windows平台使用Gitblit搭建Git服务器教程
查看>>
课程设计__友元
查看>>
POJ 最小球覆盖 模拟退火
查看>>
[20180813]校内模拟赛
查看>>
关于Fragment的使用与Androikd sdk版本之间的东东
查看>>
for练习相关
查看>>
spring xml头文件xmlns和xsi的意思
查看>>
[转] 嵌入式入门学习法(写给惠州学院电子系学嵌入式的同学们)
查看>>
git学习——Git 基础要点【转】
查看>>
JavaScript基础篇分享之三
查看>>
CF1017A The Rank
查看>>
Java中的并发工具类(CountDownLatch、CyclicBarrier、Semaphore、Exchanger)
查看>>
LeetCode OJ:Isomorphic Strings(同构字符串)
查看>>
Kafka概述与设计原理
查看>>