套接字从未连接过

时间:2016-07-10 13:45:42

标签: java sockets ip-address port-number

我试图使用套接字连接服务器,但是当我将参数设置为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();
    }
}

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

您需要了解解决问题的请求流程。 使用 localhost ,您直接向您的计算机发出请求,他没有事件进入网络。 当您放置外部IP (通过whatismyipaddress.com找到)时,请求将退出您的计算机并询问您的路由器哪台是具有该IP的计算机。也就是说,请求流程将是:

  1. 您的电脑
  2. 您的路由器
  3. ISP DNS
  4. 您的路由器(因为您的ISP知道您的IP)
  5. 您的计算机
  6. 但是在最后一步中,问题就出现了。出于安全原因,您的路由器将阻止访问您的专用网络的任何外部请求。这是您必须配置路由器端口转发的部分(如前所述),并告诉他必须将来自您的专用网络外部的任何请求重定向到您的本地IP,这种方式将起作用。要配置端口转发只需通过浏览器访问路由器(如192.168.1.1),登录并转到端口转发或类似的东西。配置步骤应该非常明确。 但不要忘记,您的本地和事件外部IP可以更改,因此如果它再次停止工作,请检查IP是否保持不变。

答案 2 :(得分:0)

试试这段代码:对您来说可能更有用。

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 */}
    }
}