2011-07-31 2 views
0

クライアントにはサーバーのホスト名が与えられているため、クライアントは指定されたホスト名でサーバーに接続できます。クライアントは、上記のようにserver Aに接続するとサーバが接続しているクライアントのホスト名を知る方法はありますか?

//client side 
host = new InetSocketAddress (args[0], 50000); // args[0] = server's address 
sockfd = new Socket(host.getHostName(),host.getPort()); 



//server side 
sockfd = new ServerSocket(50000); 
Socket clientfd= sockfd.accept(); 

、クライアントのホスト名を知るserver Aための方法は何ですか? server Aは、そのクライアントにいくつかのメッセージを与えるようにもう一方のserver Bに伝える必要があるためです。

もし接続されていなければ、クライアントに接続することについてserver Aにどのように通知するのですか?server B

クライアントは、クライアントのホスト名を決定するためにgetInetAddressとGETHOSTNAMEを使用することができますserver B

答えて

1

サーバAからの接続を受信することができServerSocketを持っています。あなたもソケットからクライアントIPを取得することができますので、ホスト名は、しかし、必要とするべきではありません。

Socket clientfd = sockfd.accept(); 
InetAddress clientIA = clientfd.getInetAddress(); 
String clientHN = clientIA.getHostName(); 
byte[] clientIP = clientIA.getAddress(); 

グレッグが言及したネットワークの問題がまだ有効である、しかし、サーバーを任意のクライアントに接続することは困難または不可能な場合があります。

0

1つの方法は、クライアントがサーバーAにホスト名を送信し、サーバーAがサーバーBに渡してサーバーBがクライアントメッセージを送信できるようにすることです。クライアントが自分自身のホスト名について嘘をつかないようにし、DNSがクライアントのアドレスに名前を正しくマップするようにDNSが設定されていることを確認したい場合があります(これは通常、クライアントマシンの直接制御の外にあります)。

「サーバー」を「クライアント」に接続して、特にNATやファイアウォールなどのネットワークに関する問題が発生することは、一般的に問題になることに注意してください。サーバーBがクライアントと直接通信できるように、クライアントにサーバーBへの2番目の接続を確立させることをお勧めします。

関連する問題