2013-06-20 3 views
5

私はいつか(私はかなり若いですが)いつかソケットについて学んでいます。私はJavaソケットについてよく考えています。私は単純なマルチプレイのJava 2Dソーシャルゲームを作成することに決めました。私の目標は、サーバにプレーヤーのX、Y座標を出力させ、10ミリ秒ごとにチャットさせることです。私が読んだことから、私の非常に平均的なロジックは、一度に1人のユーザーしかソケットに接続できないことを示しています。したがって、私は、接続する各プレーヤーのための別個のスレッドとソケットが必要になります。参加するすべてのプレーヤーに別のソケットとスレッドが必要ですか? [JAVA]

プレーヤーごとに1つのServerSocketとスレッドが必要ですか?

+1

はいです。 1つのServerSocketですが、クライアントを処理する複数のソケットとスレッド。 – Thihara

+2

無限のスレッド作成に注意してください!スレッドの合計数を制限するほうがよいでしょう。最善の策はここで 'ExecutorService'を使うことです。 – fge

+1

接続を処理するソケットを作成して、ユーザーを一意のソケットに誘導するだけでいいですか? – user2016705

答えて

6

ServerSocketは、クライアントが認識しているポートでリッスンするポートを1つだけ持つ必要があります。クライアントがサーバーに接続すると、新しいSocketオブジェクトが作成され、元のServerSocketは再びリスニングに戻ります。新しいThreadをスピンオフするか、Executorに実際に話す作業を渡す必要があります。そうしないと、サーバーはクライアント接続の受信を停止します。

ここには非常にのコードの基本的なスケッチがあります。

import java.net.*; 
import java.util.concurrent.*; 

public class CoordinateServer { 
    public static void main(String... argv) throws Exception { 
    // 'port' is known to the server and the client 
    int port = Integer.valueOf(argv[0]); 
    ServerSocket ss = new ServerSocket(port); 

    // You should decide what the best type of service is here 
    ExecutorService es = Executors.newCachedThreadPool(); 

    // How will you decide to shut the server down? 
    while (true) { 
     // Blocks until a client connects, returns the new socket 
     // to use to talk to the client 
     Socket s = ss.accept(); 

     // CoordinateOutputter is a class that implements Runnable 
     // and sends co-ordinates to a given socket; it's also 
     // responsible for cleaning up the socket and any other 
     // resources when the client leaves 
     es.submit(new CoordinateOutputter(s)); 
    } 
    } 
} 

彼らが始めるのは簡単ですので、私はここにソケットを入れているが、あなたはこのうまく機能しており、あなたのパフォーマンスを向上したいたら、あなたはおそらくjava.nio.channelsパッケージを調査したいと思うでしょう。良いチュートリアルover at IBMがあります。

+0

あなたの答えをありがとう – user2016705

3

はい。

ソケットは、2つのポイント(クライアントとサーバー)間の接続です。これは、各プレーヤーがサーバー側で独自のソケット接続を必要とすることを意味します。

アプリケーションを意味のある方法で応答させたい場合は、サーバー上の各着信接続をそれぞれのスレッド内で処理する必要があります。

これにより、接続が遅いクライアントが他の人のためにボトルネックにならないようにすることができます。また、クライアント接続が失われた場合、タイムアウトを待っている更新プログラムに負担をかけることもありません。

+0

あなたの答えをありがとう – user2016705

関連する問題