package info.istlab.ServerTester;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Hashtable;
public class WhiteBoardServer extends Server {
public ArrayList<String> points = new ArrayList<String>();
public Hashtable<String, RequestHandler4WB> handlers = new Hashtable<String, RequestHandler4WB>();
public WhiteBoardServer() {
this(11111, "127.0.0.1");
}
public WhiteBoardServer(int port) {
this(port, "127.0.0.1");
}
public WhiteBoardServer(String address) {
this(11111, address);
}
public WhiteBoardServer(int port, String address) {
super(port, address);
start();
}
public void handleRequest() {
if (!serverSocket.isBound()) {
try {
serverSocket.close();
} catch (IOException e) {
}
return;
}
try {
Socket socket = serverSocket.accept();
RequestHandler4WB handler = new RequestHandler4WB(this, socket);
handlers.put(socket.toString(), handler);
System.out.println("[WB] connected " + socket.toString());
} catch (IOException e) {
}
}
// 自分以外のクライアントにメッセージを送信
public void publish(String message, String sender) {
for (String key : handlers.keySet()) {
RequestHandler4WB handler = handlers.get(key);
if (!key.equals(sender)) {
handler.send(message);
}
}
}
public static void main(String[] args) {
invokeMain(args, "WhiteBoardServer");
}
}
class RequestHandler4WB implements Runnable {
private WhiteBoardServer server;
private Socket socket;
BufferedReader br = null;
PrintStream os = null;
Thread thread = null;
public RequestHandler4WB(WhiteBoardServer server, Socket socket) {
this.server = server;
this.socket = socket;
thread = new Thread(this);
thread.start();
}
@Override
public void run() {
String line = null;
System.out.println("[WB] accept");
try {
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
os = new PrintStream(socket.getOutputStream());
System.out.println("[WB] "+socket.toString());
// クライアントからのメッセージを待ち、受け取ったメッセージをそのまま返す
while ((line = br.readLine()) != null) {
System.out.println("[WB] Server received: " + line.length());
// 自分以外のクライアントにメッセージを送信
server.publish(line, socket.toString());
}
} catch (IOException e) {
// os.close();
System.out.println(e);
} finally {
System.out.println("[WB] disconnected: " + socket.toString());
server.handlers.remove(socket.toString());
System.out.println("[WB] 残り handlers.size() = " + server.handlers.size());
}
}
public void send(String message) {
os.println(message);
os.flush();
System.out.println("[WB] sent to " + socket.toString());
}
}