我已经编写了一个简单的Java TCP Server和一个Client(请参见下文)。
这个想法很简单:客户端向服务器发送一条消息,服务器读取该消息,对其进行修改,然后将其发送回客户端。
import java.io.*;
import java.net.*;
public class ServerTest2 {
public static void main(String[] argv) {
try {
ServerSocket serverSocket = new ServerSocket(2000); // Create Socket and bind to port 2000
System.out.println("Created");
Socket clientSocket = serverSocket.accept(); //Wait for client and if possible accept
System.out.println("Connection accepted");
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream())); // for outputs
BufferedReader br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); // for inputs
String request; // requst/input of client
String answer; // the answer for the client
System.out.println("Start Waiting");
request = br.readLine(); //Wait for input from client
answer = "answer to "+request;
bw.write(answer); // Send answer to client
System.out.println("send");
bw.newLine();
bw.flush();
//Shut everything down
bw.close();
br.close();
clientSocket.close();
serverSocket.close();
}
catch (Exception e) {
System.out.println(e);
}
}
}
客户端实施
import java.io.*;
import java.net.*;
public class ClientTest2 {
public static void main(String[] argv) {
try {
String host = "185.75.149.8"; //public ip of router
Socket clientSocket = new Socket(host,2000); //Create and connect Socket to the host on port 2000
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream())); // for outputs
BufferedReader br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); // for inputs
String answer;
String request = "HelloWorld";
bw.write(request); //Write to server
bw.newLine();
bw.flush();
System.out.println("Waiting");
answer = br.readLine(); //Wait for answer
System.out.println("Host = "+host);
System.out.println("Echo = "+answer);
//Shut eveything down
bw.close();
br.close();
clientSocket.close();
}
catch (Exception e) {
System.out.println(e);
}
}
}
它在我的本地网络上完美运行。
现在,我想通过Internet使用它,因此我在路由器的 Port 2000 上安装了端口转发,然后将其发送到PC的 Port 2000 。 我的PC直接连接到路由器,而两者之间没有任何子网。
问题在于服务器不接受connection(Stops at serverSocket.accept())
。
它不会抛出异常,而是会一直等待。 客户端也不会引发异常(如果端口未打开,则会引发拒绝连接异常)
这意味着端口转发应该工作(我还测试了端口是否使用Webtool打开(打开))。
但是奇怪的是,客户端在大约10秒钟后停止等待并继续执行程序。
由于端口转发应该可以工作,并且我的代码在我的本地网络中也可以正常工作,所以我绝对不知道如何或在哪里可以找到问题。
感谢您的帮助。
非常感谢您!