簡體   English   中英

用Java管理套接字連接

[英]Socket connections managing in Java

我正在用Java開發一個簡單的多人游戲。 關鍵是,我需要服務器應用程序才能從多個客戶端應用程序接收數據。 示例:我連接了2個客戶端應用程序。 服務器正在等待來自任何客戶端的數據。 使用第一個客戶端應用程序移動游戲角色時,必須將具有新坐標的數據發送到服務器應用程序,然后必須將角色的新位置廣播給所有客戶端。 我讀過,可以通過為每個客戶端連接創建一個新線程來完成此操作,但是有更好的方法嗎? 如果啟動例如100個線程,服務器不會崩潰嗎?

感謝您的所有答復,氰化物

您應該使用套接字池來管理套接字。 一個快速的谷歌帶我到這個例子,但你可以找到更多。 如果您需要處理100個以上的線程,那么這可能不再是一個簡單的多人游戲,您應該將其用作第一個項目。

您無需創建新線程即可處理新的客戶端連接。 您可以根據需要創建,但是根本不需要。

請在下面找到您可以遵循的方法。

擁有一台具有以下功能的服務器:1)一個線程可以接受新連接,創建會話並在現有游戲中添加新玩家。 因此,您可以將其稱為管理線程。

2)一個線程將僅在套接字fds上使用epoll / select。 任何套接字上的任何讀寫都會在該線程上得到通知。

3)有N個(取決於許多因素,尤其是服務器的核心),可以說5個工作線程(線程池),其工作是在游戲會話的所有套接字上廣播數據,但起源的線程除外請求。

因此,當您在任何套接字上接收到任何數據時,都會在線程2(epoll線程)上收到通知,然后您將要求其中一個工作線程將數據廣播到所有相關的套接字

需要注意的重要一點是,您必須等待多少次工作線程才能將工作推到工作線程上。 這需要根據用例進行調整。

只是添加一些東西:

因此,現在您將如何擴展此解決方案。 這將取決於游戲會話的數量,您可以擁有負載平衡器,該負載平衡器將始終在使用最少資源的計算機上啟動新游戲。

如果您在Linux上執行此操作,則有限制配置以限制套接字連接/ proc / sys / net的數量,該數目控制如何打開tcp / ip套接字,並且只要套接字連接數低於該值,就應該沒事的。

暫無
暫無

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

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