4

こんにちは、Java マルチプレイヤー ゲームを作成していますが、すべて正常に動作します。必要なものはすべて揃っていますが、問題が見つかりました。サーバーには ServerSocket を使用し、クライアントには Socket を使用します。問題なく動作しますが、大きな問題は、世界中で動作しないことです。LAN のみ、Hamachi も試しましたが、それもうまくいきませんでした。

何がうまくいくか、何かアイデアはありますか?

いくつかの詳細情報: サーバーで特定のスレッドを使用してソケットを受け入れ、送信し、受信し、クライアントで特定のスレッドを使用して送受信します。私が作成したオブジェクトを送信し、すべての情報を含めます。

ip = InetAddress.getLocalHost().getHostAddress() + ":" + port;

server = new ServerSocket();

//This asks you if you want to use a specific IP or just the one that we got in first line
String socketaddress;
socketaddress = (String) JOptionPane.showInputDialog(null, "IP: ", "Info",JOptionPane.INFORMATION_MESSAGE,null,null,InetAddress.getLocalHost().getHostAddress());
server.bind(new InetSocketAddress(socketaddress, port));

//Here it starts the accept thread, and then it starts send and receive threads
new Thread(accept).start();

私が最も重要だと思うクライアントからの内容は次のとおりです。

socket = new Socket(ip,port);

String set_username = System.getProperty("user.name");
set_username = (String) JOptionPane.showInputDialog(null, "Username: ", "Info", JOptionPane.INFORMATION_MESSAGE,null,null,set_username);
username = set_username;

//It sends the username to server
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(username);

//Then server responds with a message
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
String response = (String) ois.readObject();

//This writes the server' message   
JOptionPane.showMessageDialog(null, response, "Message",JOptionPane.INFORMATION_MESSAGE);

また、別の問題があります。ソケットがクライアントから別のクライアントに到達するのに3〜4秒かかります。同じネットワーク上にあり、インターネットが高速であるため、ほぼ瞬時に完了するはずです。

編集:クライアントと同じPCにサーバーを作成しようとしましたが、グローバルIPを使用して参加すると機能しませんでした:(

編集: その作業は今とても幸せです。私がしなければならなかったのは、ファイアウォールにポートを追加することだけでした。ありがとうございました:D. 友達と遊べるようになりました :3

4

3 に答える 3

7

インターネット上の Java Web サーバーに接続すると、ServerSocket と Socket が使用されます。これはうまくいきます。

おそらく機能しないのは、ファイアウォールまたはルーター/NAT (Java とは関係ありません) の背後にいるため、インターネット上のユーザーが接続できないことです。インターネット上のユーザーが IP アドレスを使用してマシンのポートに telnet で接続できるようになるまでは、Java を使用してもこれはまったく異なる動作をしません。

ところで: ObjectInputStream を作成する前に常に ObjectOutputStream AND flush() を作成する必要があります。そうしないと、反対側の ObjectInputStream が永久にブロックされる可能性があります。

于 2012-04-10T18:39:42.707 に答える
5

ファイアウォール(LAN の外部からマシンへの接続を許可するものを制御する)、ポート転送(パブリック IP アドレスを内部 IP アドレスに転送できる)、および一般的なIP アドレス指定(いくつかのIP アドレスがどのように機能するか、何がパブリック/プライベートか、ネットワーク間でデータがどのように転送されるかについての情報)。

そこから、今後の質問で、接続元および接続の IP アドレス(パブリックまたはその他)、発生しているエラー メッセージ (コードだけでなく)、およびすでに試して失敗しました。stackoverflow に関する Q/A は、トラブルシューティング セッションを意図したものではありません。具体的なエラー メッセージ、ポート フォワーディングの設定方法、ファイアウォールの種類など、試したことなどをお聞かせください。現在、あなたが投稿したコードを考えると、世界規模のプレイには多くの潜在的な問題があります (ただし、コードは実際には問題ではないかもしれません - おそらく構成の問題です)。

私は基本的に、これは信じられないほど広い答えですが、あなたの質問も信じられないほど広く、明確な問題を含んでいないと言っています。

于 2012-04-10T18:41:37.300 に答える