2009-04-13 14 views
1

私はTCPネットワークを経由する簡単なゲームを作ろうとしています。 Player.javaで、JAVA - クライアントに見えるシンプルなサーバーでの問題

try 
{ 
    server = new ServerSocket(port); 
    System.out.println("Server started on port " + port); 

    while (true) 
    { 
     socket = server.accept(); 
     System.out.println("A new player has joined the server."); 
     new Server(socket).start(); 
    } 
} 

をまた、新しいクライアントを作るために:

サーバはServer.javaで、接続を確認するために、このような何かをし

socket = new Socket(hostname, port); 

を今、この作品をうまくいっていますが、サーバーのインスタンスを配列リストに追加し、それらのすべてに特定のデータを送信できるようにする必要があります。それらはどちらもメインの方法を持っているので、1台のコンピュータでサーバーを実行し、Player.javaを実行して4台の他のコンピュータに接続することができます。すべてのPlayerが新しいソケットを作成している場合、サーバーはどのように各プレイヤーと対話する予定ですか? clientsList<Server>を入力した

Server client = new Server(socket); 
clients.add(client); 
client.start(); 

+0

プレーヤーはどこですか? - クライアントまたはサーバー? –

答えて

1

私はこの質問をよく理解していません。

acceptを呼び出すと、接続する各クライアント(通常はクライアントのアドレスとポートを表す)ごとに異なる戻り値が生成されるため、それぞれを格納する必要があります。 その後、ソケットを介して対話することができます。Sunはpretty good example in its tutorial

と言われています。 use JMS and ActiveMQを通信に使用すると、自分で多くの問題を解決し、信頼性とスケーラビリティを簡単に追加できます。

学習しない限り、低レベルのソケットプログラミングを行わずに、ゲームを書く時間を費やしてください。

+0

+1木の代わりに森林を見るためのよ!私はあなたの答えがそんなに好きです、私は裸でいます。 :-P –

+0

私はあなたの答えが良いと思う、それをヌークしないでください。私はソケットを構築する時間を費やしました(私はそれが学ぶことが重要だと思いますが)、既存のフレームワークに頭痛を延期する能力を理解することを学びました。私のプログラムは今より信頼性があります(例:ノートパソコンのテストでウォーキングをパスします) – Uri

+0

私はあなたとより具体的になります。ゲームはスクラブルです。サーバーは、各プレーヤーの移動に関する情報をTCP経由で送信できる必要があります。この情報は本質的にはそれらの位置の文字と位置です。私はこれを送ることができません。なぜなら、私はプレイヤーではなくソケットとしかやりとりできないからです。 –

0

はこれを試してみてください。次に、sendMessageメソッド(または何でも)をServerクラスに追加します。次に:

for (Server client : clients) { 
    client.sendMessage("..."); 
} 

希望します。 (ところで、私は、変数clientclients呼び出す明確な理由がある。彼らのようなサーバ、本当に入ってくるクライアントのための抽象化じゃない、Server内のコードが本当にと対話するためのサーバであっても、クライアントが言ったが。)

1

server.accept()メソッドは、Socketというオブジェクトを返します。 SocketクラスにはメソッドgetOutputStream()があります。このストリームを使用してメッセージを送信できます。

+0

問題は、Playerクラスと対話する必要があることです。 Socketクラスではありません。あなたが示唆しているのは、ArrayListをPlayersの代わりにSocketでいっぱいにすることです。 –

+0

それはおそらくあなたがする必要があります。クライアントによって作成されたPlayerオブジェクトは、サーバー上にまったく存在しないことに注意してください。 –

+0

@Logan:オブジェクトをバイトストリームにシリアライズする方法が必要です。このストリームは、OutputStream経由でPlayerクラスが受け取るために送信します。この場合、ストリーム内のバイトを逆直列化して(「再構成」して)オブジェクトに戻す必要があります。 –

0

彼の質問に対する私の理解に基づいて、いくつかの名前のリファクタリングをしてみましょう。

は、サーバがすべてのプレーヤーに通知したい場合、それはさらに、クライアントにデータを送信する作業を必要としない選手オブジェクトのメソッドを呼び出すことができます

Player player = new Player(socket); 
players.add(player); // server can use this collection for group notification 
..... 


class Player implements Runnable { 

    Player(Socket socket) { 
     this.socket = socket; 
     new Thread(this).start(); // later you may avoid it by using a threadpool executor. 
    } 


    public void run() { 
     while(running) { 
      // read and write data from client machines. 
      // use wait() appropriately 
     } 
    } 

} 

Player.java

に既存のServer.javaの名前を変更します。

最後に、既存のPlayer.javaの名前をGameLauncher.javaに変更します。

この単純な「リネーム」リファクタリングを実行すると、より多くのグリップが得られる場合があります。

関連する問題