版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012727852/article/details/78086925
缺点分析:
BIO主要问题在于每当有一个新客户端请求接入,服务端都会创建一个新的线程,无法满足高性能、高并发场景。
示例源码:
TimeServer.java:
package com.study.netty.server;
import com.study.netty.handler.TimeServerHandler;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/**
* Created by gongqi on 2017/7/9.
*/
public class TimeServer {
public static void main(String[] args) throws IOException {
Integer port = 8080;
ServerSocket server = null;
try {
server = new ServerSocket(port);
System.out.println("this server start at 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();
}
}
}
}
TimeServerHandler.java:
package com.study.netty.handler;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Created by gongqi on 2017/7/9.
*/
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(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(), true);
String currTime = null;
String body = null;
//
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd hh:mm:ss");
while (true) {
body = in.readLine();
if (body == null) {
break;
}
//
currTime = "QueryTime".equals(body) ? format.format(new Date()) : "BADY QUERY";
out.println(currTime);
}
} catch (Exception e) {
//e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (out != null) {
out.close();
}
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
TimeClient.java:
package com.study.netty.client;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
/**
* Created by gongqi on 2017/7/9.
*/
public class TimeClient {
public static void main(String[] args) {
Integer port = 8080;
String ip="127.0.0.1";
Socket socket = null;
BufferedReader in = null;
PrintWriter out = null;
//
try {
socket=new Socket(ip,port);
in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
out=new PrintWriter(socket.getOutputStream(),true);
//
out.println("QueryTime");
String resp=in.readLine();
System.out.println(resp);
} catch (Exception e) {
e.printStackTrace();
}
}
}