Гнездо никогда не подключалось

Я пытался использовать сокет для подключения к серверу, но когда я установил параметр для 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 ответа

Вы, вероятно, забыли установить переадресацию портов, потому что вы указали, что глобальный IP-маршрутизатор по умолчанию не знает, какому устройству в локальной сети оно должно отправлять (устройства в локальной сети имеют локальный ip, который вы можете найти с помощью cmd: ipconfig). Таким образом, вы вручную указываете маршрутизатору отправлять каждый пакет, поступающий на порт 5000, из Интернета, чтобы направить его на устройство с IP, например. 192.168.1.5

Попробуйте этот код: может быть, более полезным для вас.

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

Вам нужно понять поток запросов, чтобы решить вашу проблему. С localhost вы делаете запрос непосредственно на свой компьютер, он не попадает в сеть. Когда вы добавите свой внешний IP-адрес (который вы нашли через whatismyipaddress.com), запрос выйдет из вашего компьютера и спросит ваш маршрутизатор, где находится машина с этим IP-адресом. Тем не менее, поток запросов будет:

  1. Твой компьютер
  2. Ваш роутер
  3. Интернет-провайдер DNS
  4. Ваш маршрутизатор снова (потому что ваш провайдер знает ваш IP)
  5. Ваш компьютер снова

Но на этом последнем шаге есть проблема. По соображениям безопасности ваш маршрутизатор заблокирует любой внешний запрос на доступ к вашей частной сети. Есть часть, где вы должны настроить переадресацию портов вашего маршрутизатора (как упомянуто выше) и сказать ему, что любой запрос из-за пределов вашей частной сети должен быть перенаправлен на ваш локальный IP, таким образом будет работать. Чтобы настроить переадресацию портов, просто подключитесь к маршрутизатору через браузер (например, 192.168.1.1), войдите в систему и перейдите к переадресации портов или что-то подобное. Этапы настройки должны быть очень явными. Но не забывайте, что ваш локальный IP-адрес и внешний IP-адрес события могут измениться, поэтому, если он снова прекратит работу, проверьте, не изменились ли IP-адреса.

Другие вопросы по тегам