#java #sockets #serversocket
#ява #сокеты #serversocket
Вопрос:
Описание
Цель состоит в том, чтобы сервер запускался на моем компьютере, в то время как другой человек запускает клиент на своем компьютере, в другой сети,
это должно быть сделано с использованием классов Socket
и ServerSocket
из java.net
пакета.
Ожидаемый результат — соединение между сервером и клиентом
Фактический вывод — нет соединения
Исходный код:
Примечание: Предоставляется минимальный объем кода, необходимый для подключения, без ненужных инструкций печати / журнала и другого кода, чтобы пользовательский интерфейс / приложение функционировали так, как задумано.
Server.java:
class Server {
ServerSocket server;
Socket connection;
final int PORT = 0xface // random port
public static void main(String[] args) {
Server application = new Server(); // constructor is just for UI
application.runServer();
}
private runServer() {
server = new ServerSocket(PORT, 5);
connection = server.accept();
}
}
Client.java
class Client {
String charServerAddress;
final int PORT = 0xface // random port, same as Server port
public static void main(String[] args) {
Client application = new Client(args[0]); // where args[0] is 127.0.0.1
application.runClient();
}
public Client(String host) {chatServerAddress = host;}
private runClient() {
client = new Socket(InetAddress.getByName(chatServerAddress), PORT);
}
}
Результат
Сервер работает нормально, но клиент не может подключиться
Прежде чем приступить к проблеме
- Клиент подключается к localhost, то есть использует
127.0.0.1
в качестве аргумента вclient = new Socket(InetAddress.getByName(chatServerAddress), PORT)
.- Все работает так, как ожидалось; Клиент может подключаться к серверу.
- Клиент подключается с использованием IP-адреса сервера, сервер запускается на том же компьютере, что и клиент. Мы получили IP-адрес сервера, набрав
ipconfig
в cmd на компьютере, на котором он размещен, затем используяIPv4 Address
.- Все работает так, как ожидалось; Клиент может подключаться к серверу.
- Клиент подключается, используя IP-адрес Сервера, сервер и клиент запускаются на разных машинах. Мы получили IP-адрес Сервера, набрав
ipconfig
в cmd на компьютере, на котором он размещен, затем используяIPv4 Address
.- Проблема: нет сообщения об ошибке, однако клиент никогда не подключался к серверу.
Попытки решения
- Полное отключение брандмауэра Windows на обеих машинах.
- Переключение того, на какой машине размещен сервер, а на какой — Клиент.
- Используя другой
PORT
номер. - Пингует одну машину с другой, набрав
ping <IP Address>
в cmd.
Все вышеперечисленное привело к одной и той же ошибке: connection timeout
.
Комментарии:
1. какие-либо настройки брандмауэра? оба расположены в одной сети? ах, вы упомянули, что сети разные, тогда является ли адрес узла назначения общедоступным?
2. @mangusta При просмотре всех правил брандмауэра Java заблокировал некоторый доступ. Однако нашим первым решением было полностью отключить его на обеих машинах, что не сработало. Да, сервер и клиент находятся в разных сетях
3. Как подключены сети?
4. @NomadMaker Я не думаю, что это так, я подключен к Интернету через маршрутизатор через моего провайдера, а другой парень у себя дома, за много миль, подключен к Интернету через свой маршрутизатор через, возможно, другого провайдера.
5. Есть ли у вашего домашнего компьютера внешнее IP-имя? В противном случае, как вы находите ip-номер для подключения к нему?