一、模型说明
![](https://img.haomeiwen.com/i8540320/f67018d1c368302a.png)
采用BIO通信模型的服务端,通常由一个独立的Acceptor线程负责监听来自客户端的连接,接收到客户端请求后产生一个新的线程进行链路处理,处理完毕后通过输出流返回给客户端,线程销毁。
该模型最大的问题就是缺乏弹性伸缩能力,当访问量上升之后,服务端的线程数和客户端的访问数呈1:1的正比关系。
二、代码
1、服务端代码
public class TimeServer {
public static void main(String[] args) throws IOException {
int port = 8080;
ServerSocket server = null;
try {
server = new ServerSocket(port);
System.out.println("the time server is start in port : " + port);
Socket socket = null;
while (true){
socket = server.accept();
new Thread(new TimeServerHandler(socket)).start();
}
}catch (Exception e){
e.printStackTrace();
}finally {
if (server!=null){
server.close();
server = null;
}
}
}
}
public class TimeServerHandler implements Runnable{
private Socket socket;
public TimeServerHandler(Socket socket){
this.socket = socket;
}
@Override
public void run() {
BufferedReader in = null;
PrintWriter out = null;
try {
in = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
out = new PrintWriter(this.socket.getOutputStream(), true);
String body = null;
while (true) {
body = in.readLine();
if(body==null){
break;
}
System.out.println("the time server receive msg : " + body);
String responseStr = "now time is : " + System.currentTimeMillis();
out.println(responseStr);
}
}catch (Exception e){
e.printStackTrace();
}finally {
if (in!=null){
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (out!=null){
out.close();
out = null;
}
if (this.socket!=null){
try {
this.socket.close();
} catch (IOException e) {
e.printStackTrace();
}
this.socket = null;
}
}
}
}
2、客户端代码
public class TimerClient {
public static void main(String[] args) {
int port = 8080;
Socket socket = null;
BufferedReader in = null;
PrintWriter out = null;
try {
socket = new Socket("127.0.0.1", port);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(), true);
out.println("what time is now ?");
System.out.println("the time client send msg succeed");
String responsStr = in.readLine();
System.out.println("the time server response --- " + responsStr);
}catch (Exception e){
e.printStackTrace();
}finally {
if (out!=null){
out.close();
out = null;
}
if (in!=null){
try {
in.close();
in = null;
} catch (IOException e) {
e.printStackTrace();
}
}
if (socket!=null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
socket = null;
}
}
}
}
三、运行结果
1、服务端
the time server is start in port : 8080
the time server receive msg : what time is now ?
2、客户端端
the time client send msg succeed
the time server response --- now time is : 1528517383573
网友评论