【问题标题】:socket never got connected套接字从未连接
【发布时间】:2016-07-10 13:45:41
【问题描述】:

我试图使用套接字连接服务器,但是当我将参数设置为 localhost 时,它可以工作。但是当我把我的ip地址放在那里时,它永远不起作用,所以我不知道出了什么问题,我得到的ip地址来自http://whatismyipaddress.com

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;

public class Client {

    public static void main( String [] arg ) throws Exception
    {
        Socket      socket;
        BufferedReader  stdIn;
        BufferedReader  fromServer;
        PrintWriter toServer;
        String      s;
        String      result;

        socket = new Socket( "96.63.208.240", 5000 );
        stdIn = new BufferedReader( new InputStreamReader( System.in ) );
        fromServer = new BufferedReader( new InputStreamReader( socket.getInputStream() ) );
        toServer = new PrintWriter( new OutputStreamWriter( socket.getOutputStream() ), true );
        while ( (s = stdIn.readLine()) != null )
        {
            toServer.println( s );
            result = fromServer.readLine();
            System.out.println( "reverse: " + result );
        }
        socket.close();
    }
}

服务器端

import java.net.ServerSocket;
import java.net.Socket;

public class Server {

    public static void main( String [] arg ) throws Exception
    {
        ServerSocket    serverSocket = new ServerSocket( 5000, 10 );
        Socket      socket;

        serverSocket.setReuseAddress( true );
        while ( (socket = serverSocket.accept()) != null )
        {
            System.out.println( "Accepted an incoming connection" );
            new SessionThread( socket ).start();
        }
        serverSocket.close();
    }
}

【问题讨论】:

  • 假设这是在家庭类型的网络上 - 您是否在路由器上为端口 5000 启用了端口转发?
  • 对不起,你知道怎么做吗?
  • 如果您登录到路由器,应该有一个端口转发部分,并将流量从端口 5000 路由到您的本地 IP。

标签: java sockets ip-address port-number


【解决方案1】:

您可能忘记设置端口转发,因为您指定的全局 IP 路由器默认情况下不知道它应该发送到本地网络中的哪个设备(本地网络中的设备具有本地 ip,您可以使用 cmd:ipconfig )。因此,您手动告诉路由器将每个数据包从互联网发送到端口 5000,以将其定向到具有 IP 的设备,例如。 192.168.1.5

【讨论】:

    【解决方案2】:

    您需要了解请求流程才能解决您的问题。 使用 localhost 您直接向您的计算机发出请求,他不会离开网络。 当您输入您的外部 IP(您通过 whatismyipaddress.com 找到的)时,请求将退出您的计算机并询问您的路由器具有该 IP 的计算机在哪里。也就是说,请求流将是:

    1. 你的电脑
    2. 你的路由器
    3. ISP DNS
    4. 又是你的路由器(因为你的 ISP 知道你的 IP)
    5. 你的电脑又来了

    但是在这最后一步有一个问题。由于安全原因,您的路由器将阻止任何外部请求访问您的专用网络。有一部分你必须配置你的路由器端口转发(如前所述),并告诉他来自你的私有网络之外的任何请求都必须重定向到你的本地 IP,这样就可以了。要配置端口转发,只需通过浏览器访问您的路由器(如 192.168.1.1),登录并转到端口转发或类似的东西。配置步骤应该非常明确。 但不要忘记,您的本地和活动外部 IP 可以更改,因此如果再次停止工作,请检查 IP 是否保持不变。

    【讨论】:

      【解决方案3】:

      试试这个代码:也许对你更有用。

      import java.net.*;
      import java.io.*;
      
      public class Client {
          public static void main (String args[]) {
          // arguments supply message and hostname of destination
          Socket s = null;
              try{
                  int serverPort = 7896;
              s = new Socket(args[1], serverPort);    
              DataInputStream in = new DataInputStream( s.getInputStream());
              DataOutputStream out =
                  new DataOutputStream( s.getOutputStream());
              out.writeUTF(args[0]);          // UTF is a string encoding see Sn 4.3
              String data = in.readUTF();       
              System.out.println("Received: "+ data) ;      
                  }catch (UnknownHostException e){
                  System.out.println("Sock:"+e.getMessage()); 
              }catch (EOFException e){System.out.println("EOF:"+e.getMessage());
                  }catch (IOException e){System.out.println("IO:"+e.getMessage());}
      
              if (s != null)
                  try {
                      s.close();
                  } catch (IOException e) {
                      System.out.println("close:" + e.getMessage());
                  }
          }
      }
      

      服务器端使用这个。

      import java.net.*;
      import java.io.*;
      
      public class Server {
          public static void main(String args[]) {
              try {
                  int serverPort = 7896;
                  ServerSocket listenSocket = new ServerSocket(serverPort);
                  while (true) {
                      Socket clientSocket = listenSocket.accept();
                      Connection c = new Connection(clientSocket);
                  }
              } catch (IOException e) {
                  System.out.println("Listen :" + e.getMessage());
              }
          }
      }
      
      class Connection extends Thread {
          DataInputStream in;
          DataOutputStream out;
          Socket clientSocket;
      
          public Connection(Socket aClientSocket) {
              try {
                  clientSocket = aClientSocket;
                  in = new DataInputStream(clientSocket.getInputStream());
                  out = new DataOutputStream(clientSocket.getOutputStream());
                  this.start();
              } catch (IOException e) {
                  System.out.println("Connection:" + e.getMessage());
              }
          }
      
          public void run() {
              try { // an echo server
                  String data = in.readUTF();
                  out.writeUTF(data);
              } catch (EOFException e) {
                  System.out.println("EOF:" + e.getMessage());
              } catch (IOException e) {
                  System.out.println("IO:" + e.getMessage());
              }
      
              try {
                  clientSocket.close();
              } catch (IOException e) {
                  /* close failed */}
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2020-12-09
        • 2014-06-30
        • 2015-03-09
        • 1970-01-01
        • 1970-01-01
        • 2020-08-29
        • 1970-01-01
        • 2011-01-01
        • 2021-05-17
        相关资源
        最近更新 更多