在之前的EchoServer模型个EchoClient模型中,客户端和服务端只是单纯的一一对应的关系,如果存在多个客户端和一个服务端,这就需要具体处理了。在这里我们明显想到的第一种方案是使用多线程处理。为每一个客户端设置一个工作线程,来处理连接,如下所示:

此时我们改进server代码:

package com.asiaInfo.caozg.ch_03;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket; public class EchoServerThread {
private int port = 8000;
private ServerSocket serverSocket; public EchoServerThread() throws IOException {
serverSocket = new ServerSocket(port);
System.out.println("服务器启动");
} public void service() {
while (true) {
Socket socket = null;
try {
socket = serverSocket.accept(); //等待客户连接
// 为每一个客户端创建一个线程
Thread workThread = new Thread(new Handles(socket));
//启动线程
workThread.start();
} catch (IOException e) {
e.printStackTrace();
}
}
} public static void main(String args[]) throws IOException {
new EchoServerThread().service();
} private class Handles implements Runnable {
private Socket socket; public Handles(final Socket socket) {
this.socket = socket;
} public String echo(String msg) {
return "echo:" + msg;
} private PrintWriter getWriter(Socket socket) throws IOException {
OutputStream socketOut = socket.getOutputStream();
return new PrintWriter(socketOut, true);
} private BufferedReader getReader(Socket socket) throws IOException {
InputStream socketIn = socket.getInputStream();
return new BufferedReader(new InputStreamReader(socketIn));
} @Override public void run() {
try {
System.out.println("New connection accepted "
+ socket.getInetAddress() + ":" + socket.getPort());
BufferedReader br = getReader(socket);
PrintWriter pw = getWriter(socket);
String msg = null;
while ((msg = br.readLine()) != null) {
System.out.println(msg);
pw.println(echo(msg));
if (msg.equals("bye")) //如果客户发送的消息为“bye”,就结束通信
break;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} }
} }

之前的客户端代码不变:

package com.asiaInfo.caozg.ch_03;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket; /**
* @Authgor: gosaint
* @Description:
* @Date Created in 21:31 2018/1/7
* @Modified By:客户端代码
*/
public class EchoClientThread {
private String host = "localhost";
private int port = 8000;
private Socket socket; public EchoClientThread() throws IOException {
socket = new Socket(host, port);
} public static void main(String args[]) throws IOException {
new EchoClientThread().talk();
} private PrintWriter getWriter(Socket socket) throws IOException {
OutputStream socketOut = socket.getOutputStream();
return new PrintWriter(socketOut, true);
} private BufferedReader getReader(Socket socket) throws IOException {
InputStream socketIn = socket.getInputStream();
return new BufferedReader(new InputStreamReader(socketIn));
} public void talk() throws IOException {
try {
BufferedReader br = getReader(socket);
PrintWriter pw = getWriter(socket);
BufferedReader localReader = new BufferedReader(new InputStreamReader(System.in));
String msg = null;
while ((msg = localReader.readLine()) != null) { pw.println(msg);
System.out.println(br.readLine()); if (msg.equals("bye"))
break;
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

最新文章

  1. Android Studio 入门
  2. cf595d
  3. c语言中赋值语句的结果
  4. css.day04
  5. mac中遇到的mysql编码问题
  6. hibernate Criteria查询 2.3
  7. UVA 10905 Children's Game 孩子的游戏 贪心
  8. SSL 3.0曝出Poodle漏洞的解决方案
  9. Enterprise architect 类图加时序图
  10. [LeetCode&Python] Problem 27. Remove Element
  11. 关于Collections.sort()排序方法的源码探索
  12. HBase最佳实践之Scan
  13. Java连接数据库的driver和url写法
  14. GitHub客户端使用
  15. delphi Drag and Drop sample 鼠标拖放操作实例
  16. Windows Server 2008 R2 小技巧 (转)
  17. angular学习笔记(三十)-指令(8)-scope
  18. 大数据竞赛平台Kaggle案例实战
  19. C# DateTime 月第一天和最后一天 取法
  20. 微软研发流程(ALM)管理培训会议(比亚迪汽车)

热门文章

  1. C#调用大漠插件
  2. LeetCode:加油站【134】
  3. 3.30课·········Marquee标签
  4. [原创]java WEB学习笔记13:JSP介绍(背景,特点,原理)
  5. 算法(Algorithms)第4版 练习 1.3.37
  6. bzoj 1008: [HNOI2008]越狱 数学
  7. jsp的9个内置对象
  8. Spark-Spark setMaster & WordCount Demo
  9. JavaScript 的 async/await
  10. DBGrideh 实现自动排序