通过Internet(Java)进行服务器客户端通信

时间:2018-06-21 12:58:03

标签: java networking tcp server router

我已经编写了一个简单的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秒钟后停止等待并继续执行程序。

由于端口转发应该可以工作,并且我的代码在我的本地网络中也可以正常工作,所以我绝对不知道如何或在哪里可以找到问题。

感谢您的帮助。

非常感谢您!

0 个答案:

没有答案