package GroupTalk;
import java.io.*;
import java.net.*;
import java.util.*;
import java.util.concurrent.*;
public class GroupServer {
private static Set Members; // å¨çº¿æåéå
private int port = 8013;
private ServerSocket serverSocket;
private ExecutorService executorService; //çº¿ç¨æ±
private final int POOL_SIZE = 15; //å个CPUæ¶çº¿ç¨æ± ä¸å·¥ä½çº¿ç¨çæ°ç®
public GroupServer() throws IOException {
Members = new HashSet();
serverSocket = new ServerSocket(port);//å¯å¨æå¡å¨
//åå»ºçº¿ç¨æ±
//RuntimeçavailableProcessors()æ¹æ³è¿åå½åç³»ç»çCPUçæ°ç®
//ç³»ç»çCPUè¶å¤ï¼çº¿ç¨æ± ä¸å·¥ä½çº¿ç¨çæ°ç®ä¹è¶å¤
executorService = Executors.newFixedThreadPool(
Runtime.getRuntime().availableProcessors() * POOL_SIZE);
System.out.println("å¤ç¨æ·æå¡å¨å¯å¨");
}
//å¨GroupServer主类ä¸å®ä¹ç¾¤ç»æ¶æ¯åéæ¹æ³ã
public static void sendToAllMembers(String msg) throws IOException {
PrintWriter pw;
Socket tempSocket;
OutputStream socketOut;
Iterator it = Members.iterator();
while (it.hasNext()) {//éåå¨çº¿æåsetéå.
tempSocket = (Socket) it.next(); //ååºä¸ä¸ªæå
try{
socketOut = tempSocket.getOutputStream();//å¾å°è¾åºæµ
}catch(SocketException e){
removeMember(tempSocket);
continue;
}
//è£
饰æå符æµ
pw = new PrintWriter(new OutputStreamWriter(socketOut, "GB2312"), true);
pw.println(msg);//åéè天信æ¯ç»æå
}
System.out.println(Members.size());
}//end while群ç»åéç»æã
//å¨GroupServer主类ä¸å®ä¹ç»åéåºæ¹æ³ã
public static void removeMember(Socket socket) {
Members.remove(socket);//å é¤ä¸ä¸ªæå
}
public void service() {
while (true) {
Socket socket = null;
try {
socket = serverSocket.accept(); //çå¬å®¢æ·è¯·æ±, é»å¡è¯å¥.
//æ¥åä¸ä¸ªå®¢æ·è¯·æ±,ä»çº¿ç¨æ± 䏿¿åºä¸ä¸ªçº¿ç¨ä¸é¨å¤ç该客æ·.
GroupServer.Members.add(socket); // å°æ°æ·»å çç¨æ·æ·»å è¿ç¨æ·éå
executorService.execute(new Handler(socket));
} catch (IOException e) {
}
}
}
public static void main(String args[]) throws IOException {
new GroupServer().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(new OutputStreamWriter(socketOut, "GB2312"), true);
}
private BufferedReader getReader(Socket socket) throws IOException {
InputStream socketIn = socket.getInputStream();
return new BufferedReader(new InputStreamReader(socketIn, "GB2312"));
}
public void run() {//è¦ç线ç¨ä½
try {
System.out.println("New connection accepted " + socket.getInetAddress());
BufferedReader br = getReader(socket);//åèè£
饰æå符æµ
//PrintWriter pw = getWriter(socket); //åèè£
饰æå符æµ
String msg = null;
while ((msg = br.readLine()) != null) {
//pw.println("From ThreadServer:" + msg);//send to client.
GroupServer.sendToAllMembers(msg); // send to all menbers
if (msg.contains("bye".subSequence(0, 2))) {
System.out.println(socket.getInetAddress() + ":" + "Exit");
break;
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (socket != null) {
socket.close();
}
} catch (IOException e) {
}
}
}
}