1

我正在尝试为我的计算机科学决赛创建一个 MapleStory 类型的游戏。它基本上是通过 LAN 播放的 2D 角色扮演游戏。我的问题是如何让两台计算机之间的连接同时进行?

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

我正在试验这个,我只能在两台计算机之间按顺序发送/接收消息(即服务器发送到客户端,然后客户端发送到服务器),我不能乱序。我该怎么做?

4

2 回答 2

0

您必须通过使用多个线程或通过互锁队列来分离您的读/写来管理您的工作。

在循环中,您通过在代码中执行读取然后写入来强制序列化。

没有理由不能生成一个读取器线程,该线程馈入队列以执行工作线程的工作,而写入发生在另一个线程上。您只需要在工作队列上进行同步。

您还可以轮询套接字以查看是否有任何数据可供读取,如果没有,则发送任何等待写入的数据。

有更多奇特的方法可以做到这一点,还有很多例子,四处搜索,看看你喜欢什么。

这里有一个类似的线程

于 2012-05-14T16:54:00.543 回答
-2

您可以使用多个线程在一个端口的一个线程中以一种方式连接,在另一个线程的不同端口上以另一种方式连接。但是,这可能会引入一些同步问题,因此我建议重新考虑您的设计,以便一次只需要在一个方向上进行通信(如果需要,您可以随意来回切换)。

于 2012-05-14T15:28:53.067 回答