簡體   English   中英

同時處理多個固定套接字連接

[英]handling multiple constant socket connections simultaneously

我想用Java編寫一個聊天應用程序,它可以同時處理許多用戶。 我閱讀了有關套接字和線程池以限制線程數的信息,但我無法想象如何同時處理100個套接字連接,並且不創建100個新線程。 想法是,客戶在開始時就進行連接,並且他的連接保持打開狀態,直到他離開聊天。 他可以將數據發送到服務器,也可以接收其他用戶的消息。

從套接字讀取阻止了操作,因此如果在特定的套接字連接中有新數據可用,我需要檢查所有用戶套接字是否處於循環中並超時。 我的第一個想法是創建例如3個線程來處理所有已連接用戶的輸入,並創建3個線程來處理服務器與客戶端之間的通信,但是我如何實現呢? Java中是否有用於套接字的異步API,在哪里可以定義用於輸入/輸出通信的線程池?

創建一個擴展ThreadClient 編寫所有方法,並在void run()方法中,編寫在建立客戶端連接時要執行的代碼。

Server端,偵聽新連接。 接受一個新的連接,獲取有關該連接的信息,將其傳遞給構造函數以創建一個新的Client對象,然后將其添加到ArrayList以跟蹤所有正在進行的連接並執行start()方法。 因此,所有Client對象都在Arraylist ,並且它們保持同時運行。

大約一年前,我做了一個這樣的聊天應用程序。 並且,一旦客戶端脫離,不要忘記關閉連接,否則所有對象就會堆積並降低應用程序的速度。 我了解到這很困難。

使用Netty,因為它提供了NIO框架(非阻塞IO),因此每個連接不需要1個線程。 使用非阻塞IO編寫服務器要稍微復雜一點(或很多),但是在不需要每個連接一個線程的情況下,性能會有所提高。

但是,100個線程並不是很多,因此您仍然可以使用標准IO和每個連接一個線程來創建服務器,這僅取決於您需要擴展多少。

對於使用Netty進行的服務器設置,您創建一個分配新連接的通道。 該通道是處理程序的有序系列,處理來自連接/客戶端的傳入(和傳出)消息。 處理程序本身都需要異步,這樣,當處理程序需要將消息返回給客戶端時,它會異步(非阻塞地)將消息寫入通道,並接收將來的消息,當消息實際存在時,它可以將動作附加到該消息上。書面。

有一些學習曲線,但並不是那么陡峭,如果構建Netty方式與使用標准阻塞IO相比,應用程序的總體設計會更好。

暫無
暫無

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

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