0

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

3 回答 3

1

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

于 2016-07-10T13:49:52.490 回答
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 */}
    }
}
于 2016-07-10T16:29:38.610 回答
0

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

  1. 你的电脑
  2. 你的路由器
  3. 互联网服务供应商 DNS
  4. 再次使用您的路由器(因为您的 ISP 知道您的 IP)
  5. 又是你的电脑

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

于 2016-07-10T14:03:15.833 回答