2012-05-14 45 views
1

我想爲我的計算機科學決賽創建一個MapleStory類型的遊戲。它基本上是通過局域網播放的2D RPG。我的問題是如何讓兩臺電腦之間的連接同時進行?如何在Java中的同一網絡上的服務器和客戶端之間創建同時連接?

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

我用這個實驗,我可以爲了兩臺計算機之間只發送/收到消息(即服務器發送到客戶端然後客戶端發送到服務器)和我不能出去的順序。我將如何做到這一點?

+0

如果你的要求有電腦硬是將數據發送到對方同時,我不認爲這是可能的。在網絡世界中,計算機不能同時進行通信。他們發出信號然後等待迴應。 – Chillie

+1

這不僅可能,而且很常見。 –

回答

-2

您可以使用多個線程在一個端口上的一個線程中建立一個連接,在另一個線程的另一個端口上建立另一個連接。這可能會引入一些同步問題,因此我建議重新考慮您的設計,以便通信只需要一次在一個方向上進行(如果需要,您可以隨意切換)。

+0

TCP是雙向的。第二個連接是完全沒有必要的。 – EJP

0

您必須通過使用多個線程或通過互鎖隊列來分離您的讀/寫操作來管理您的工作。

在你循環中,你通過執行讀取然後在代碼中寫入來強制序列化。

沒有理由不能生成讀取器線程,該讀取器線程饋送到隊列中以便由工作線程執行工作並在另一個線程上執行寫入。你只需要在工作隊列上進行同步。

您還可以輪詢套接字以查看是否有可用的數據可讀取,如果沒有,則發送等待寫入的數據。

有更多奇特的方法來做到這一點,並有大量的例子,搜索周圍,看看你的舒適。

有一個類似的線程here

相關問題