2017-02-03 9 views
1

私は大学のプロジェクト用のゲームサーバーを作成していますので、ライブラリ/フレームワークを使用せずにこれを行います。JavaゲームサーバーからクライアントへのTCPとUDPの接続

多くの研究の後、ゲームのこの側面の信頼性がそれほど重要ではなく、失われたパケットを補うことができるため、UDPプロトコルを使用してキャラクターの移動やタイマーなどの大量の通信をクライアントとサーバーに実行させたいために。

しかし、私は、情報がクライアントに届くことが重要なアクションやイベントなど、ゲームのいくつかの他の側面についてもTCPプロトコルを使用したいと考えています。

私の問題は、一般的に、そしてJavaでUDPを使用することについてよく分かりません。私の理解からは、TCP用のオープンソケットオブジェクトを持つこととはまったく異なります。私は、クライアントとサーバー間の初期接続がTCPによって行われ、サーバーがUDPを介してサーバーと通信するために使用するクライアントにポート番号を送り返す必要がある場合、この接続が確立されたと考えていますか?

私は、複数のクライアントを持つという問題に遭遇します。UDPを介してサーバーに接続するために、異なるポート番号を割り当てる必要がありますか?したがって、サーバーには、接続されているクライアントごとに1つの異なるポート番号がありますか?

私の計画は、すべてのクライアントが1つの送信スレッドと1つの受信スレッドを接続していることです。これらのスレッドのそれぞれでTCP通信とUDP通信の両方を処理できるか、それぞれに4つのスレッドが必要ですtcpとudpの2つのクライアント?

これもちょうど私の最初の考えであり、私はスティックの完全な間違った終わりを持っている場合、ごめんなさいUDPについてはあまり知らない!誰でもこれのいずれかで助けることができればありがとう!

+0

[Java Javaチュートリアル](https://docs.oracle.com/javase/tutorial/networking/datagrams/)から始めてください。通常、UDPクライアントは同じポートを使用します。 – bradimus

+0

UDPやJavaを研究した場合、多くの問題のようなサウンドが解決できる可能性があります。 – DuKes0mE

+0

私はこれを読んだけど、私はUDPのコネクションレスな性質を理解していません - サーバが複数の異なるクライアントからこのUDPポートに移動パケットを受信して​​いる場合、どのキャラクタがどのキャラクタを '接続' ? – imattacus

答えて

1

サーバは、クライアントがUDP経由でサーバと通信するために使用するポート番号をクライアントに返す必要がありますか?

これを行うこともできますし、プロパティファイルからロードすることもできます。実装によって異なります。

UDPを介してサーバーに接続するには、[複数のクライアント]に異なるポート番号を割り当てる必要がありますか?したがって、サーバーには、接続されているクライアントごとに1つの異なるポート番号がありますか?

いいえ。サーバーは、受信したデータグラム(UDP)パケットのIPアドレスからパケットが属するクライアントを区別できます。

これらのスレッドのそれぞれでTCP通信とUDP通信の両方を処理できますか、クライアントごとに4つのスレッドが必要ですか?2つはtcp、2つはudpです。

スレッドをブロックすることはないので、データを送信するために別のスレッドは必要ありません。受信のみがスレッドをブロックするので、クライアントプログラムは2つの通信スレッドしか必要としません。 1つはTCPを受信し、もう1つはUDP通信を受信する。

注記:Javaでは、TCPとUDPの通信が全く異なります。 TCPはあなたが書き込むストリームです(ハンドシェイクとパケット損失を自動的に処理します)。UDPはDatagramPacketオブジェクトを使用します。このオブジェクトにはバイトが移入されて送信されます。

+0

この返答いただきありがとうございます!すべてのクライアントがサーバ上の同じポートに送信されるとすれば、サーバは任意の数のクライアントを処理するために1つのUDP受信スレッドしか必要としないのでしょうか? – imattacus

+0

ようこそ。はい。サーバーは、すべてのクライアントからの情報を受信するために1つのUDPポートしか必要としません。私はこのようにメッセージを受け取る前にサーバーをプログラミングしました。 – schwissig

関連する問題