Клиент может подключаться к серверу только на том же компьютере

Я пытаюсь создать многопользовательскую java-игру и решил использовать сервер сокетов java. «Клиент» может безупречно подключаться и взаимодействовать с сервером, когда они оба запущены на моем компьютере, но когда я отправляю файл клиента на другой компьютер (который подключен к той же сети), он не может подключиться к серверу , и я не могу понять, почему. Я запустил cmd и использовал код netstat -a и смог подтвердить, что сервер прослушивает 127.0.0.1:3251, поэтому я считаю, что проблема связана с клиентом.

Вот как создается сервер:

    try {
        this.serverSocket = new ServerSocket();
        this.serverSocket.bind(new InetSocketAddress("localhost",port)); //port is 3251
        window.show("SERVER: " + "Created On Port: " + port);
    } catch (IOException e) {
        window.show("SERVER: " + e.getMessage());
        window.show("SERVER: " + "Unable To Create Server :(");
    }

и вот как клиент подключается:

    try {
        socket = new Socket("localhost", 3251);
    } catch (IOException e) {
        e.printStackTrace();
    }

Когда сервер принимает соединение, он создает новый поток:

        Socket socket = this.serverSocket.accept();
        ServerThread serverThread = new ServerThread(socket);
        serverThread.start();

person Community    schedule 16.09.2018    source источник


Ответы (2)


    try {
    socket = new Socket("localhost", 3251);
} catch (IOException e) {
    e.printStackTrace();
}

«localhost» означает, что ваша клиентская машина ищет сервер на том же компьютере. Это должен быть IP-адрес сервера, то есть 192.168.0.2 или что-то в этом роде.

person Nick Eu    schedule 16.09.2018
comment
большое спасибо! Изменение локального хоста на мой адрес ipv4 все исправило. - person ; 16.09.2018

У вас две проблемы:

  1. На сервере вы создаете файл this.serverSocket.bind(new InetSocketAddress("localhost",port));. Это создает серверный сокет на IP-адресе, который разрешается localhost. Это может быть проблемой. На большинстве хостов localhost преобразуется в 127.0.0.1 петлевой адрес, и ваш серверный сокет будет прослушивать только его. Чтобы иметь возможность прослушивать все сетевые карты на этом компьютере, используйте new InetSocketAddress(port) см. документацию по Java для этой конструкции. Или найдите и используйте конкретное имя хоста сервера.
  2. Как указал @Nick Eu на клиенте, которого вы пытаетесь подключить к серверу на localhost. У вас должен быть способ настройки вашего клиента, чтобы он знал, где находится сервер, и использовал его.

Для дальнейшего уточнения: сокет — это IP-порт, который используется для связи. Скажем, у хоста есть два сетевых адаптера с IP-адресами 192.168.2.1 и 10.0.0.2. Теперь, если вы привяжете сокет сервера (скажем, 8000) к IP-адресу 192.168.2.1. Этот порт будет доступен только при использовании этой комбинации 192.168.2.1:8000, аналогично, если вы привяжете его к IP-адресу 10.0.0.2, он будет доступен только через этот IP-адрес. И если вы привяжете локальный хост (также известный как петлевой адрес), он будет доступен только для клиентов на этом хосте. . Это полезно, если вы хотите запустить сервер, который ограничен только клиентами на этом хосте.

person Yogesh_D    schedule 16.09.2018