1

さて、ここに私のコードがあります:

import java.io.InputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.ServerSocket;
import java.net.InetAddress;
import java.net.UnknownHostException;

public class TcpServerEcho {

public static void main(String argv[]) {

    int port = Integer.parseInt(argv[0]);
    ServerSocket server_socket = null;


    try {

        InetAddress thisIp = InetAddress.getByName("kiravaio.homepc.it");
        System.out.println(thisIp.getHostAddress());

        //or
        //server_socket = new ServerSocket(port, 10, InetAddress.getByName("79.47.49.68"));
        server_socket = new ServerSocket(port, 10, thisIp);

    }
    catch (Exception e) {
        System.err.println("Impossible to create socket server!");
        System.out.flush();
        System.exit(1);
    }

    System.out.printf("Server active on port: %d and on address %s\n", port, server_socket.getInetAddress());


    Socket client_socket = null;
    boolean exec = true;

    while(exec) {


        try {

            client_socket = server_socket.accept();

            InputStream is = client_socket.getInputStream();

            OutputStream os = client_socket.getOutputStream();

            boolean stop = false;

            System.out.println("Received: ");

            while(!stop) {
                int b = is.read();
                System.out.print((char)b);
                if(b == -1) {stop = true;}
                else {os.write( (byte)b );}
            }


        }

        catch (IOException ioe) {
            System.err.println("Error I/O!");
        } finally {
            try {
                client_socket.close();
            }

            catch (IOException ioe) {}
            }

        System.out.println("");
    }


    try {
        /* Never executed */
        server_socket.close();
    } catch (IOException ioe) {}
}

}

パブリック IP にソケットを作成する方法がありません。ドメイン kiravaio.homepc.it があり、ip public が変更されるたびに常に更新されます。最初に、InetAddress thisIp = InetAddress.getByName("kiravaio.homepc.it"); で IP アドレスを取得します。次にソケットを作成します: server_socket = new ServerSocket(port, 10, thisIp); しかし、それは常に失敗し、理由はわかりません。127.0.0.1 でソケットを作成することだけが機能します! :(

4

2 に答える 2

4

検索すると、これがdyndnshomepc.itサービス ドメイン名であることがわかります。そのドメイン名は、PC ではなくルーターの IP に解決されます。

PC には、ルーターによって割り当てられたプライベート ネットワーク IP アドレス (192.168.1.x など) があります (この IP は、NAT (ネットワーク アドレス変換) を実行しているルーターと通信するために PC によって使用されています)。

そのアドレスにバインドする必要があります (またはServerSocket、ポートのみを取るコンストラクターを使用します。これは0.0.0.0( INADDR_ANY) にバインドし、すべてのインターフェイスでリッスンします)、選択したポートをその IP アドレスに転送するようにルーターを構成する必要があります。

(その方法がわからない場合は、ルーターのマニュアルを参照するか、https://superuser.com/に質問を投稿してください)

于 2013-02-08T20:45:26.330 に答える
0

ServerSocket の場合、使用する IP アドレスを指定する必要はなく、新しい ServerSocket(port) を実行するだけで、クライアントは動的ドメイン経由で接続できるようになると強く信じています。

于 2013-02-08T20:46:02.460 に答える