Java 套接字连接程序(TCP/IP)适用于本地主机/公共网络,但不适用于其他IP

Java 套接字连接程序(TCP/IP)适用于本地主机/公共网络,但不适用于其他IP,java,sockets,networking,router,tcp-ip,Java,Sockets,Networking,Router,Tcp Ip,我试图在连接到网络(例如通过网络X的热点)的机器(服务器)和连接到网络Y的热点的另一台(客户端)之间建立连接 第1期: 如果服务器和客户端(可以 多个)连接到同一网络(如X),但如果服务器和 客户端位于不同的网络(X和Y)上,然后我将获得连接 超时错误 第二期: 若服务器和客户端位于同一网络上(此处通过路由器),则 他们无法连接到相同的上述错误。我已经做完了 转发(此处:5555)与我的路由器、防火墙和defender放置 关闭客户端和服务器 我错过了什么?请复习 为服务器附加代码段:

我试图在连接到网络(例如通过网络X的热点)的机器(服务器)和连接到网络Y的热点的另一台(客户端)之间建立连接

第1期:

如果服务器和客户端(可以 多个)连接到同一网络(如X),但如果服务器和 客户端位于不同的网络(X和Y)上,然后我将获得连接 超时错误

第二期:

若服务器和客户端位于同一网络上(此处通过路由器),则 他们无法连接到相同的上述错误。我已经做完了 转发(此处:5555)与我的路由器、防火墙和defender放置 关闭客户端和服务器

我错过了什么?请复习

  • 为服务器附加代码段

        import java.net.*;
        import java.io.*;
    
    
        class ServerSideConnection{
    
        public static void main(String args[]){
    
        try{
            while(true){
                ServerSocket socket = new ServerSocket(5555);
                Socket serverinput = socket.accept();
                Mutithrd_excutn mutithrd_excutn_obj = new Mutithrd_excutn(serverinput);
                mutithrd_excutn_obj.start();
                socket.close();
            }   
        }catch(IOException e){
    
        }
    
        }
    }
    
    
    
    
        import java.net.*;
        import java.io.*;
    
        class Mutithrd_excutn extends Thread{
    
    
    
        public Socket serverinput;
        public Mutithrd_excutn(Socket serverinput){ 
    
            this.serverinput = serverinput;
    
        }   
    
        public void run(){
                try{
    
                BufferedReader br = new BufferedReader(new InputStreamReader(serverinput.getInputStream()));
                PrintWriter pw = new PrintWriter(serverinput.getOutputStream());
                BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in));
    
                String str_client = "";
                String str_server = "";
                while(true){
    
                    str_client = br.readLine();
                    System.out.println("Client : " + str_client);
    
                    if(str_client.equals("stop")){
    
                        return;
                    }
                    str_server = br1.readLine();
                    pw.println(str_server);
                    pw.flush();
                }
    
    
    
                //serverinput.close();
                //socket.close();
            }catch(IOException e){
    
            }       
    
    
    
        }
    
    }   
    
  • 为客户端附加代码片段(我在本地主机中输入 服务器(计算机)的IP地址:

    }


此外,如果我在阐述问题时遗漏了任何一点,请写下评论。

如果它在同一网络中工作,但不是在不同网络之间工作,则我会看到以下选项:

  • 有防火墙阻止了连接
  • 或者您设置的端口转发错误
  • 或者您使用了错误的目标IP,即目标网络中的专用IP,而不是来自转发端口的公共可见IP

遗憾的是,您的问题没有包含足够的详细信息来进一步限制选项,即不知道端口转发是如何完成的,以及您在测试中使用哪个IP地址(内部或外部)作为服务器地址。

谢谢您的回答。但是如果服务器和客户端在不同的网络上(我在不同的android热点上连接了这两个系统),那么我也会收到连接超时错误。我们在热点连接中也需要端口转发吗?@Akash:如果客户端和服务器位于不同的热点,那么它们位于不同的网络中。很可能这些网络使用的是,这意味着它们不会通过internet进行路由,这意味着您需要端口转发,并且需要访问服务器的公共可访问IP。
import java.io.*;
import java.net.*;


public class ClientSideConnection {

public static void main(String[] args) {

    try {

        Socket s = new Socket("localhost",5555);
        PrintWriter pw = new PrintWriter(s.getOutputStream());
        BufferedReader br_client_input = new BufferedReader(new InputStreamReader(System.in));
        BufferedReader br_server_output = new BufferedReader(new InputStreamReader(s.getInputStream()));

        String str_client = "";
        String str_server = "";
        while(!str_client.equals("stop")) {

            str_client = br_client_input.readLine();
            pw.println(str_client);
            pw.flush();
            if(!str_client.equals("stop")) { 
                str_server = br_server_output.readLine();
                System.out.println("Server : " + str_server);

            }   

        }
        br_client_input.close();
        br_server_output.close();
        s.close();
    }catch(IOException e) {

    }

}