2015-01-04 90 views
-1

我已經進入遊戲開發一段時間了,我正在嘗試讓我的下一個遊戲成爲多人遊戲。我正在嘗試編寫一個服務器,它可以在每秒1/16秒左右循環計算所有實體在遊戲中的位置。客戶將能夠在需要時請求所有這些信息。Java服務器正在等待客戶端響應

因此,我試着寫一個簡單的服務器/客戶端,可以交換信息。部分的代碼可以在這裏看到:

ServerSocket listener; 
Socket socket; 

while(running) 
{ 
    socket = listener.accept(); 

    PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 
    out.println("information"); //sending the string "information" to any client that has connected 
} 

唯一的問題是,該服務器爲客戶端每次listener.accept()連接等待被調用,因此停止在循環其他一切需要做完了。我該如何做到這一點,以便許多客戶可以連接/請求信息,而無需服務器停止專門監聽每一次?當涉及到所有這些網絡問題時,我確實沒有太多線索,這就是我努力學習的原因。我從來沒有深入研究過,所以我很抱歉,如果這是一個看似簡單的解決方案。

(希望我對比賽如何在這裏工作正確的想法?我倒是覺得位置,一切是服務器端,並處理客戶端的唯一的東西被渲染和用戶輸入和這樣的。)

+1

你可能會考慮在客戶端/服務器端編程中使用類似Netty的東西,這是一個非常成熟和廣泛使用的網絡通信庫。他們有很好的例子(查看簡單的Echo例子的基礎知識)http://netty.io/wiki/ – Alex

+0

看看Java教程的自定義網絡部分。 – EJP

回答

1

你需要切換到NIO,這給非攔截功能:

class Server { 
    public static void main(String[] args) { 
     try { 
      ServerSocketChannel serverSocket = ServerSocketChannel.open(); 
      serverSocket.configureBlocking(false); 
      serverSocket.bind(port); 

      while(running) { 
       SocketChannel channel = serverSocket.accept(); 

       //... 
      } 
     } 
    } 
} 

serverSocket.accept()被調用時,它會返回null如果沒有連接到接受,而不是阻塞。

您也可以使用Selector來管理單個線程上的讀/寫和接受。請記住,您需要爲每個用戶提供一個線程以阻止閱讀。相反,Selector會通知您何時需要從任何頻道進行閱讀。

+2

對於不熟悉使用多個線程的人來說,非阻塞NIO是一個非常高級的主題。 –

+0

@PeterLawrey這有點矛盾;這可以防止需要創建新線程。只要他研究如何使用「ByteBuffer」,我認爲他會沒事的。我知道一些主題可能有些粗糙,但它比需要深入研究同步和原子更容易 –

+2

有多少java開發人員知道何時使用flip和compact;) –

3

如果它是一個簡單的解決方案,你應該考慮簡單輯陣線程的請求的處理,所以每個聽者從主程序代碼分開運行:http://tutorials.jenkov.com/java-multithreaded-servers/multithreaded-server.html

此外,如果遊戲涉及精確的動作,如拍攝時,你應該考慮稍微快一點的tickrate。

+0

我會考慮多線程,謝謝! – TheNewGuy

+0

基本上,您不會監聽Main()中while塊中的傳入連接,直到每個請求到達時,程序都停留在while塊中。你需要做的是創建一個新的類,它實現了Runnable接口:(在新評論中添加代碼) – Rodolffo

+0

public class MultiThreadedServer implements Runnable{ 然後複製整個代碼,然後你可以運行它MultiThreadedServer server = new MultiThreadedServer(9000); new Thread(server).start(); @rozkosz – Rodolffo

相關問題