echoserver.java

来自「线程池的开发,创建一个池来提高资源利用率」· Java 代码 · 共 93 行

JAVA
93
字号
import java.io.*;
import java.net.*;

public class EchoServer{
	private int port=8000;
	private ServerSocket serverSocket;
	private ThreadPool threadPool;  //线程池
	private final int POOL_SIZE=4;  //单个CPU时线程池中工作线程的数目 
	  
	public EchoServer() throws IOException
	{
		serverSocket=new ServerSocket(port);
		threadPool=new ThreadPool(Runtime.getRuntime().availableProcessors()*POOL_SIZE);
		
		System.out.println("服务器启动");
	}
	
	public void service()
	{
		while(true)
		{
			Socket socket=null;
			try{
				socket=serverSocket.accept();
				System.out.println("accept");
				threadPool.execute(new Handler(socket));  //把与客户客户通信的任务交给线程池
			}catch(IOException e)
			{
				e.printStackTrace();
			}
		}
	}
	
	
	public static void main(String args[])throws IOException
	{
		new EchoServer().service();
	}
}

class Handler implements Runnable  //负责与单个客户通信
{
	private Socket socket;
	public Handler(Socket socket)
	{
		this.socket=socket;
	}
	
	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 String echo(String msg)
	{
		return "echo:"+msg;
	}
	
	public void run()
	{
		try{
				System.out.println("task running");
			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"))
				break;
			}
		}catch(IOException e)
		{
			e.printStackTrace();
		}
		finally{
			try{
				if(socket!=null) socket.close();//断开连接
			}catch(IOException e){e.printStackTrace();}
		}
	}
}
		

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?