線程池server

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;


public class Server
{
//服務器端口
    private static final int SERVERPORT = 54321; 
    //客戶端連接
    private static List<Socket> mClientList = new ArrayList<Socket>(); 
    //線程池
    private ExecutorService mExecutorService;  
    //ServerSocket對象
    private ServerSocket mServerSocket;  
    //開啓服務器
    public static void main(String[] args)
{
new Server();
}
public Server()
{
try
{
//設置服務器端口
mServerSocket = new ServerSocket(SERVERPORT);
//創建一個線程池
mExecutorService = Executors.newCachedThreadPool();
System.out.println("start...");
//用來臨時保存客戶端連接的Socket對象
Socket client = null;
while (true)
{
//接收客戶連接並添加到list中
client = mServerSocket.accept(); 
mClientList.add(client);
//開啓一個客戶端線程
mExecutorService.execute(new ThreadServer(client));
}
}
catch (IOException e)
{
e.printStackTrace();
}
}   
    //每個客戶端單獨開啓一個線程
static class ThreadServer implements Runnable
{
private Socket mSocket;
private BufferedReader mBufferedReader;
private PrintWriter mPrintWriter;
private String mStrMSG;


public ThreadServer(Socket socket) throws IOException
{
this.mSocket = socket;
mBufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
mStrMSG = "user:"+this.mSocket.getInetAddress()+" come total:" + mClientList.size();
sendMessage();
}
public void run()
{
try
{
while ((mStrMSG = mBufferedReader.readLine()) != null)
{
if (mStrMSG.trim().equals("exit"))
{
//當一個客戶端退出時
mClientList.remove(mSocket);
mBufferedReader.close();
mPrintWriter.close();
mStrMSG = "user:"+this.mSocket.getInetAddress()+" exit total:" + mClientList.size();
mSocket.close();
sendMessage();
break;
}
else
{
mStrMSG = mSocket.getInetAddress() + ":" + mStrMSG;
sendMessage();
}
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
//發送消息給所有客戶端
private void sendMessage() throws IOException
{
System.out.println(mStrMSG);
for (Socket client : mClientList)
{
mPrintWriter = new PrintWriter(client.getOutputStream(), true);
mPrintWriter.println(mStrMSG);
}
}
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章