Newer
Older
ServerTester / src / main / java / info / istlab / ServerTester / WhiteBoardServer.java
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(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());
    }
}