線程池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);
}
}
}
}
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);
}
}
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.