簡體   English   中英

Java中可能的Socket + ServerSocket?

[英]Possible Socket + ServerSocket in java?

我們正在用Java開發某種RTS網絡游戲。 我有這個主服務器,可以接受其他具有serversocket的播放器。 然后在我們的游戲中,當您創建自己的游戲室時,我過濾了加入我房間的所有玩家。然后,當游戲開始時,房間的創建者應該是主持人。 我應該仍在使用我的主服務器還是應該為連接到我房間的人建立一個新的服務器機架? 還有一個問題是inputstream.readObject()應該使一條消息進入另一個循環還是連續循環? 這是inputstream的示例代碼片段。

 public void run() {
    while (running) {
        try {
            inStream = new ObjectInputStream(client.getInputStream());
            command = (String) inStream.readObject();

            Thread.sleep(10);
        }//try
        catch (Exception e) {
            e.printStackTrace();
        }//catch
    }//while
}//run

////接受新客戶

while (running) {
        try {
            clientConnecting = serverSocket.accept();
            new TCPServerHandle(clientConnecting).start();
                            Thread.sleep(10);
        }//try
        catch (Exception e) {
            e.printStackTrace();
        }//catch
   }//while

對對象I / O流使用阻塞I / O並不是RTS的最佳條件,因為您不希望其他客戶端在另一個客戶端的登錄過程中等待。 您可能會認為您可以對所有內容都進行多線程處理以避免等待,但這並沒有太大的區別,因為仍然有阻塞的讀/寫操作。 同樣,對於對象I / O流,必須首先序列化所有發送的對象(稱為序列化),這可能是一個相當漫長的過程,具體取決於您的用戶群。 如果有很多玩家,那么實際上每毫秒都是重要的。 您應該將非阻塞I / O(例如NIO)與ByteBuffer一起使用。 我建議改用NIO教程, 是有關如何制作簡單服務器-客戶端應用程序的非常詳細的教程。

您可以為“一方”明確創建第二個ServerSocket以與主機進行通信。 使用端口號將傳入的數據包demultiplexed正確的過程。 您可以設置多個TCPServerSockets來偵聽和接受不同端口上的傳入連接請求。

ServerSocket welcomeSocket = new ServerSocket(portNumber);
Socket clientSocket = welcomeSocket.accept();

是的,在許多情況下,結合使用TCP和UDP更為有效,因為正如您提到的,某些數據比其他數據更為關鍵。 UDP僅提供best effort服務,在這種情況下數據包可能會丟失。 如果要設置UDP套接字:

DatagramSocket UDPSocket = new DatagramSocket();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM