Установка локального порта сокета вызывает исключение - PullRequest
1 голос
/ 21 ноября 2011

Учитывая это:

. . .
ServerSocket serverSocket = new ServerSocket(1111);

while (helperSockets.size() < Common.NUM_HELPERS) {
    Socket helperSocket = serverSocket.accept();
. . .

Это вызывает исключение:

new Socket("localhost", 1111, InetAddress.getLocalHost(), localPort);

Исключение:

java.net.ConnectException: connect: Address is invalid on local machine, or port is not valid on remote machine

Я пытаюсь использовать этот конструктор длялокальный порт, так что я делаю не так?Источник ниже.

Конструктор создает поток, который прослушивает клиентов через ServerSockets, одновременно пытаясь подключиться к другим клиентам.Этот клиент пытается связаться с самим собой для тестирования.Проблема возникает при первой итерации цикла for.

public class DisSemHelper extends Thread {
private int id;
private int semaphore;
private Clock clock;
private Vector<Socket> helperSockets;
private int localPort;

private int receivedSender;
private String receivedOperation;
private int receivedTimestamp;

/**
 */
public DisSemHelper(int id) {
    this.id = id;
    this.semaphore = 0;
    this.clock = new Clock();
    this.helperSockets = new Vector<Socket>();
    this.receivedSender = -1;
    this.receivedOperation = null;
    this.receivedTimestamp = -1;
    this.localPort = Common.portMap.get(id);

    new ConnectionListener().start();

    /* Create and store connections to all helpers */
    for (int i=0; helperSockets.size() < Common.NUM_HELPERS; i++) {
        Socket helperSocket = null;
        //              String portKey = "STREET_" + i;

        /* Wait until target street socket is ready. Retry every second. */
        Exception e = new ConnectException();
        while (helperSocket == null) {
            try {
                Thread.sleep(1000);
                helperSocket = new Socket("localhost", 2222, InetAddress.getLocalHost(), localPort);

            } catch (ConnectException ce) {
                e = ce;
                e.printStackTrace();
            } catch (UnknownHostException uhe) {
                uhe.printStackTrace();
            } catch (IOException ioe) {
                ioe.printStackTrace();
            } catch (InterruptedException ie) {
                e.printStackTrace();
            }
        }

        int remotePort = helperSocket.getPort();
        int connectedHelperID = Common.portMap.indexOf(remotePort);
        if (this.helperSockets.size() <= connectedHelperID) {
            this.helperSockets.add(helperSocket);
            System.out.println("Helper " + id + " added socket from outgoing: local port: " + helperSocket.getLocalPort() + " remote port: " + helperSocket.getPort());
        }
    }

    System.out.println(this.helperSockets);
}

private class ConnectionListener extends Thread {
    public void run() {
        try {
            ServerSocket serverSocket = new ServerSocket(2222);

            /* Listen for connections from other helpers */
            while (helperSockets.size() < Common.NUM_HELPERS) {
                Socket helperSocket = serverSocket.accept();
                // TODO Will indexof int in list of Integers work?
                int remotePort = helperSocket.getPort();
                int connectedHelperID = Common.portMap.indexOf(remotePort);
                // TODO Does this really work?
                if (connectedHelperID == -1) {
                    helperSockets.add(helperSocket);
                    System.out.println("Helper " + id + " added socket from incoming: local port: " + helperSocket.getLocalPort() + " remote port: " + helperSocket.getPort());
                }
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

Ответы [ 3 ]

1 голос
/ 21 ноября 2011

Можете ли вы сделать простой тест-кейс и опубликовать исходный код? Это поможет нам решить эту проблему лучше.

new Socket("localhost", 1111, InetAddress.getLocalHost(), localPort);

Что именно ты здесь пытаешься сделать? Почему вам нужно определить, какую локальную пару хост / порт использовать локально? Клиент обычно должен просто указать удаленный хост / порт и позволить ОС выбрать локальный порт. Возможно, это проблема.

1 голос
/ 21 ноября 2011

Это WAG, но я бы попробовал другие конструкторы в Socket.

Попробуйте новый сокет (INetAddress.getLocalHost (), "111");

См:

http://ashishmyles.com/tutorials/tcpchat/index.html

0 голосов
/ 29 ноября 2011

Не верное решение, но я закончил работать над настройкой локального порта (потому что эта идея никому не нравится).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...