Java Socket: клиент ожидает сервера, который будет принят - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть пул потоков, который обслуживает до 3 потоков.Каждый из них создает и принимает клиента.Когда 4-й клиент пытается подключиться, я хочу, чтобы он был проинформирован о том, что ему нужно дождаться освобождения потока / соединения.

Проблема заключается в том, что, когда 4-й клиент запускает запрос с помощью connect (), вТеория должна застрять на 500 миллиллисов, затем вывести строку тайм-аута исключения и, наконец, повторить попытку, пока поток сервера не сможет его обслуживать.На самом деле, клиент передает connect () и, конечно, застревает вObjectOutputStream, не показывая никаких сообщений об ошибках ...

Сторона клиента:

    boolean connected = false;
    Socket s=null;
    ObjectOutputStream dos = null;
    ObjectInputStream dis = null;
    while (!connected) {
        try {
            s = new Socket();
            InetSocketAddress sa = new InetSocketAddress("localhost", 5056);
            s.connect(sa,500);
            connected = true;
            dos = new ObjectOutputStream(s.getOutputStream());
            dis = new ObjectInputStream(s.getInputStream());
        } catch (ConnectException e) {
            System.out.println("Error while connecting. " + e.getMessage());
        } catch (SocketTimeoutException e) {
            System.out.println("Connection: " + e.getMessage() + ".");
        } catch (IOException e) {
            e.printStackTrace();
        } 
    }

    //<CONNECTED: OPERATIONS TO DO>

Сторона сервера:

Диспетчер серверов:

    ServerSocket ss = new ServerSocket(5056);

    ExecutorService exec = Executors.newFixedThreadPool(3);

    for (int i = 0; i < 10; i++) { // only 10 connections in total
        Runnable task = new ClientHandler(ss);
        exec.execute(task);
    }
    exec.shutdown();

Задача сервера:

class ClientHandler implements Runnable {
final ServerSocket ss;
private Socket s;
private ObjectInputStream dis;
private ObjectOutputStream dos;

// Constructor 
public ClientHandler(ServerSocket ss) {
    this.ss = ss;
}

@Override
public void run() {

    try {
        System.out.println("ClientHandler: "+Thread.currentThread().getName()+" <WAITING>");
        s = ss.accept();
        System.out.println("ClientHandler: "+Thread.currentThread().getName()+" <CONNECTED>");
        dis = new ObjectInputStream(s.getInputStream());
        dos = new ObjectOutputStream(s.getOutputStream());
    } catch (IOException e) {
        e.printStackTrace();
    }
    //<OPERATIONS>
    }
}
...