2012-04-10 22 views
1

こんにちは私はJavaのマルチプレイヤーゲームを作っています。 これは誰かが必要とするすべてのものを持っていますが、サーバ用にServerSocketを使用し、クライアント向けにソケットを使用していますが、大きな問題は世界中では機能しないということです。 LANだけ、私もHamachiを試したが、それも動作しませんでした。JavaソケットはLAN上で動作しますが、インターネットでは動作しませんか?

何が効果がありますか?

さらに詳しい情報:私は、送受信のためにクライアントでソケットを受け取り、送受信するための特定のスレッドをサーバー内で使用します。それは私が作ったオブジェクトを送り、すべての情報を含んでいます。ここで

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); 

また、私は別の問題を抱えている、ソケットは別の1つのクライアントから取得するには3または4秒のように取ると、それがあるべきそれは同じネットワーク上にあり、私は高速インターネットを持っているのでほとんど瞬間。

編集:私は、同じクライアントを搭載したPCと上のサーバー、私のグローバルIPを使用して参加作成しようとした が、それは動作しませんでした:(

EDIT:RIGHT NOW ALL私が持っていた その作業IM SO HAPPY私は私の友人と遊ぶことができます:3

+0

世界中で機能しないとはどういう意味ですか? _port forwarding_を正しく設定してもよろしいですか? – scientiaesthete

+0

はい、完全に確実であり、ファイアウオールでもあります。 – IvanDonat

+0

インターネット上のユーザーは、ホスト名/ IPとポート番号だけを使用して、マシン上のサービスにtelnetで接続できますか? –

答えて

6

インターネット上のJava Webサーバーに接続すると、ServerSocketとSocketが使用されます。申し訳ございません。

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

ところで、ObjectInputStreamを作成する前にObjectOutputStreamを作成してからflush()する必要があります。それ以外の場合は、ObjectInputStreamを永久にブロックできます。与える

(内部IPアドレスにパブリックIPアドレスを転送することができます)
+2

こんにちは - Peter Lawreyが指摘したように、あなたの質問はおそらくJavaやネットワーク設定とは関係ありません。ファイアウォール、NATなどでお読みください。「wireshark」のコピーを入手することも検討してください:http://www.wireshark.org – paulsm4

+0

どこにflush()を配置しますか? – IvanDonat

+0

"ObjectInputStreamを作成する前にflush()";) –

3
あなたは(LAN外からマシンに接続を許可されているかを制御) firewalls上に読む必要が

port forwarding、そして一般的にはIP addressing( IPアドレスの仕組み、公開/非公開、ネットワーク経由でのデータ転送方法に関する情報)将来の質問に、あなたは(IPあなたは、どのようなエラーメッセージが発生しているからからを(そうでない場合は、パブリックまたは)接続しているに対処するものだけではない投稿したい、場合そこから

、それは本当に参考になりますコード)、あなたがすでに試して失敗したこと。 stackoverflowのQ/Aはトラブルシューティングのためのものではありません。具体的なエラーメッセージ、ポート転送の設定方法、ファイアウォールの設定方法、試したことなどが本当に必要です。現在、あなたが投稿したコードでは、世界的なプレイに潜在的な問題がたくさんあります(実際にはコードは問題ではないかもしれませんが、おそらく設定上の問題です)。

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

+0

私は次のエラーが発生しました:Connection timed out(on client)。 – IvanDonat

+0

しかし、それは接続がうまくいかないことを意味しています。その原因は、ファイアウォール/ポートフォワーディング設定の**どこに**でもある可能性があり、クライアントやサーバー側にある可能性があります。すべてのクライアントまたは一部のクライアントなどになる可能性があります。残念ながら、広いエラーメッセージ。あなたはあなたの設定を通過し、途中で接続の各ステップをテストし、**どのステップ**で接続が失敗しているかを把握し、そのポイントから、関連するログ、エラー、および詳細を設定します。 – jefflunt

+0

私はファイアウォール、移植、および発信ポートのポートを許可しました。(もう一度)今、ゲームを正常にテストして、ハマチでテストします:) – IvanDonat

0

ISPからの静的IPアドレスが必要です。ルータでポートを転送して、使用しているサーバのLAN IPを指すようにする必要があります。 192.168.1.xxx注:一部のISPは、ビジネス顧客に静的IPを提供するだけです。 ISPに確認してください。また、サーバーとして使用しているマシンのファイアウォールに、使用しているポートがあることを確認してください。あなたはそれがLAN上で働いていると言いましたので、あなたはそれを知っていたと確信しています。しかし、私は、LANとWANを介して接続することに問題があることを読んでいる人のためにそれを言及すると思いました。

関連する問題