Клиент может подключиться к серверу только на одном компьютере - PullRequest
0 голосов
/ 16 сентября 2018

Я пытаюсь создать многопользовательскую 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();

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018

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

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

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

0 голосов
/ 16 сентября 2018
    try {
    socket = new Socket("localhost", 3251);
} catch (IOException e) {
    e.printStackTrace();
}

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

...