Я пытаюсь установить TCP-соединение между ноутбуком как клиентом и ПК в качестве сервера. Моя цель - использовать сервер для отправки сообщений между двумя устройствами Android. Сервер имеет общедоступный IP-адрес. Чтобы проверить соединение, я написал два простых класса Java:
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServer {
public ServerSocket welcome;
public Socket soc;
public int listeningPort = /* default port */;
public TcpServer() {
}
public static void main(String[] args) {
TcpServer ms = new TcpServer();
if(args.length > 0) {
ms.listeningPort = Integer.parseInt(args[0]);
}
ms.listen();
}
public void listen() {
try {
welcome = new ServerSocket(listeningPort);
System.out.println(">>> listening on port " + listeningPort + " <<<");
soc = welcome.accept();
System.out.println(">>> got a new connection from "
+ soc.getInetAddress().toString() + " <<<");
while (true) {
try {
byte b[] = new byte[1024];
soc.getInputStream().read(b, 0, 1);
System.out.print((char) (b[0]));
} catch (Exception e) {
System.err.println(e);
}
}
} catch (Exception e) {
System.err.println(e);
}
}
}
import java.net.Socket;
public class TcpSendClient {
private String serverIp = /* some ip */;
public int port = /* default port */;
private SendThread st;
public TcpSendClient() {
}
public static void main(String[] args) {
TcpSendClient client = new TcpSendClient();
if(args.length > 0) {
client.port = Integer.parseInt(args[0]);
}
client.send();
}
public void send() {
System.out.println("Try to connet to " + serverIp + " via Port" + port);
st = new SendThread(serverIp, port);
st.start();
}
class SendThread extends Thread {
private Socket soc;
public SendThread(String theIp, int thePort) {
try {
soc = new Socket(theIp, thePort);
} catch (Exception e) {
System.err.println(e);
}
}
public void run() {
try {
while (true) {
String toSend = "Hello ";
soc.getOutputStream().write(toSend.getBytes());
Thread.sleep(800);
System.out.println("sent");
}
} catch (Exception e) {
System.err.println(e);
}
}
}
}
Когда я запускаю оба файла Java на сервере pc, соединение работает нормально. Он также работал, если я настроил локальный Wi-Fi с одним ноутбуком и подключился к нему с помощью другого ноутбука. Но когда я запускаю клиентский файл с ноутбука, подключенного к Интернету, я не могу получить соединение. В брандмауэре на сервере я открыл несколько портов для подключения, а ноутбук, который я использую в качестве клиента, отключен брандмауэром. Помимо брандмауэра, я действительно не знаю, что посмотреть, чтобы запустить соединение. Любые идеи относительно причины моей проблемы и решения?
Я нашел решение: брандмауэр Windows по-прежнему блокировал порты для Java. Мне потребовалось немного времени, чтобы понять это, потому что я не был зарегистрирован как администратор на этом компьютере и не мог видеть правила.