1.代码
服务端:
TimeServer.java
package com.ccy.IO.pools;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class TimeServer {
public static void main(String[] args) throws IOException {
int port = 8080;
if(args!=null && args.length>0){
port = Integer.valueOf(args[0]);
}
ServerSocket server = null;
try {
server = new ServerSocket(port);
Socket socket =null;
TimeServerHandlerExecutePool pool = new TimeServerHandlerExecutePool(512, 1024);
while(true){
socket = server.accept();
pool.excute(new TimeServerHandler(socket));
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if(server!=null){
server.close();
server = null;
}
}
}
}
TimeServerHandlerExecutePool.java
package com.ccy.IO.pools;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class TimeServerHandlerExecutePool {
private ExecutorService executor;
public TimeServerHandlerExecutePool(int maxPoolSize,int queueSize){
executor = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(), maxPoolSize, 120L, TimeUnit.SECONDS,new ArrayBlockingQueue<Runnable>(queueSize));
}
public void excute(java.lang.Runnable task){
executor.execute(task);
}
}
TimeServerHandler.java
package com.ccy.IO.pools;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.text.SimpleDateFormat;
public class TimeServerHandler implements Runnable{
private Socket socket;
public TimeServerHandler(Socket socket){
this.socket = socket;
}
@Override
public void run() {
System.out.println("TIME SERVER IS LISTENING!!!");
BufferedReader reader =null;
PrintWriter writer = null;
try {
reader = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
writer = new PrintWriter(this.socket.getOutputStream(),true);
String msg =null;
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
while(true){
msg = reader.readLine();
if(msg == null){
break;
}else{
System.out.println("received msg is:"+msg);
writer.println(format.format(new java.util.Date()));
}
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if(reader!=null){
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
reader = null;
}
if(writer!=null){
writer.close();
writer = null;
}
if(this.socket != null){
try {
this.socket.close();
} catch (IOException e) {
e.printStackTrace();
}
this.socket = null;
}
}
}
}
客户端:
TimeClient.java
package com.ccy.IO.pools;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class TimeClient {
public static void main(String[] args) {
Socket socket = null;
PrintWriter writer = null;;
BufferedReader reader = null;
try {
socket = new Socket("127.0.0.1", 8080);
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer = new PrintWriter(socket.getOutputStream(),true);
writer.println("what time is it now?");
String resp = reader.readLine();
System.out.println("Now is:"+resp);
} catch (Exception e) {
e.printStackTrace();
}finally{
if(reader!=null){
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
reader = null;
}
if(writer!=null){
writer.close();
writer = null;
}
if(socket != null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
socket = null;
}
}
}
}
代码来自:李林峰《Netty权威指南》
2.分析:
采用线程池实现IO通信框架,避免了为每一个请求创建一个线程而造成的资源枯竭问题。但是依然采用IO同步阻塞模型,无法从根本上解决我们高并发,高性能的需求!
先模仿在创造吧!
更多精彩内容请继续关注我的博客:http://blog.youkuaiyun.com/caicongyang
记录与分享,你我共成长
-fromcaicongyang