EchoServer和EchoClient模型的改进1之多线程
2024-10-20 07:37:37
在之前的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();
}
}
}
}
最新文章
- Android Studio 入门
- cf595d
- c语言中赋值语句的结果
- css.day04
- mac中遇到的mysql编码问题
- hibernate Criteria查询 2.3
- UVA 10905 Children's Game 孩子的游戏 贪心
- SSL 3.0曝出Poodle漏洞的解决方案
- Enterprise architect 类图加时序图
- [LeetCode&;Python] Problem 27. Remove Element
- 关于Collections.sort()排序方法的源码探索
- HBase最佳实践之Scan
- Java连接数据库的driver和url写法
- GitHub客户端使用
- delphi Drag and Drop sample 鼠标拖放操作实例
- Windows Server 2008 R2 小技巧 (转)
- angular学习笔记(三十)-指令(8)-scope
- 大数据竞赛平台Kaggle案例实战
- C# DateTime 月第一天和最后一天 取法
- 微软研发流程(ALM)管理培训会议(比亚迪汽车)
热门文章
- C#调用大漠插件
- LeetCode:加油站【134】
- 3.30课·········Marquee标签
- [原创]java WEB学习笔记13:JSP介绍(背景,特点,原理)
- 算法(Algorithms)第4版 练习 1.3.37
- bzoj 1008: [HNOI2008]越狱 数学
- jsp的9个内置对象
- Spark-Spark setMaster &; WordCount Demo
- JavaScript 的 async/await
- DBGrideh 实现自动排序