1

コンピューター サイエンスのファイナル用に MapleStory タイプのゲームを作成しようとしています。基本的にLAN経由でプレイする2D RPGです。私の質問は、どうすれば 2 台のコンピューター間の接続を同時に行うことができるでしょうか?

    class MagicServer extends Thread
    {
       private ServerSocket serverSocket;

       public MagicServer(int port) throws IOException
       {
          serverSocket = new ServerSocket(port);
          //serverSocket.setSoTimeout(10000);
       }

       public void run()
       {
          Scanner kb = new Scanner(System.in);
          while(true)
          {
             try
             {
                System.out.println("Waiting for client on port " + serverSocket.getLocalPort() + "...");
                Socket server = serverSocket.accept();

                System.out.println("Just connected to " + server.getRemoteSocketAddress());

                DataInputStream in = new DataInputStream(server.getInputStream());
                DataOutputStream out = new DataOutputStream(server.getOutputStream());

                System.out.println(in.readUTF());

                for(int i=0; i<5; i++)
                {
                    System.out.println(in.readUTF());
                    out.writeUTF(kb.nextLine());
                }

                server.close();

             }

             catch(SocketTimeoutException s)
             {
                System.out.println("Socket timed out!");
                break;
             }

             catch(IOException e)
             {
                e.printStackTrace();
                break;
             }
          }
       }
       public static void main(String [] args)
       {
          int port = 2001;
          try
          {
             Thread t = new MagicServer(port);
             t.start();
          }catch(IOException e)
          {
             e.printStackTrace();
          }
       }
    }

私はこれを実験していましたが、2 台のコンピューター間でメッセージを順番に送受信することしかできず (つまり、サーバーがクライアントに送信し、次にクライアントがサーバーに送信します)、順不同になることはありません。どうすればいいですか?

4

2 に答える 2

0

複数のスレッドを使用するか、インターロックされたキューを使用して、読み取り/書き込みを分離して作業を管理する必要があります。

ループでは、コードで読み取りを行ってから書き込みを行うことにより、シリアル化を強制します。

キューにフィードしてワーカー スレッドによる作業を実行し、書き込みが別のスレッドで行われるリーダー スレッドを生成できない理由はありません。作業キューで同期が必要なだけです。

ソケットをポーリングして、読み取り可能なデータがあるかどうかを確認し、ない場合は、書き込み待ちのデータを送信することもできます。

それを行うためのよりエキゾチックな方法があり、多くの例があり、周りを検索して、あなたが快適なものを見てください.

ここに似たスレがある

于 2012-05-14T16:54:00.543 に答える
-2

複数のスレッドを使用して、あるポートの一方のスレッドで一方向の接続を確立し、もう一方のスレッドの別のポートで逆方向の接続を確立できます。ただし、これにより同期の問題が発生する可能性があるため、通信が一度に一方向でのみ発生するように設計を再考することをお勧めします (必要に応じて、何度でも前後に切り替えることができます)。

于 2012-05-14T15:28:53.067 に答える