簡體   English   中英

如何在所有TCP客戶端上實現連接的用戶列表

[英]How to implement list of connected users on all TCP clients

我正在嘗試編寫一種方式,以便可以向每個tcp客戶端顯示連接到服務器的已連接用戶的列表。

嘗試過的事情:我試圖將列表數組轉換為單個變量,該變量使用逗號“,”連接數組中的所有項目。 然后,我使用顯示消息的廣播方法將變量發送給所有客戶端。

我的問題是,是否有更好的方法可以做到這一點。

我嘗試過的代碼如下所示:

內部服務器:

NetworkStream stream= tcpclient.GetStream();  
var bytes= stream.Read(bytes, 0, tcpclient.ReceiveBufferSize);
nameUser= Encoding.ASCII.GetString(bytes, 0, bytes);

var users= String.Join("x", userList);
Console.WriteLine("Connected users " + users);
ChatServer.Broadcast(users, nameUser, false);

然后廣播該消息,在這種情況下,該消息為“用戶”。

在客戶端上:

byte[] bytes = new byte[10025];
stream= Client.GetStream();
var byte= Netstream.Read(bytes, 0, (int)Client.ReceiveBufferSize);
string msg= Encoding.ASCII.GetString(bytes, 0, byte);
if (msg.Contains("x") == true)
   {
    elements = msg.Split(new[] { 'x' });
   }

使用String.Contains來檢測這樣的消息是一個非常糟糕的主意。

您可以考慮消息中與消息類型相對應的一些前導字節(或字符)。 例如,如果您為此分配了5個字符,則可以使用USERS來開始每一封有關在線用戶的消息。 您應該為此建立一些其他約定。 但是我想您也可以找到某種傳達這些消息的標准。

另外,更常見的是使用byte[]代替字符。 因此,您可以假設一個標准,即您的第一個(例如四個字節)與消息類型相關,而您的第二個(第二個字節)顯示用戶ID,依此類推。 您可以將shortintlong用於與此相關的代碼,並使用Enumeration types來組織它們。

請注意,當您使用第一個字節數來檢測消息的類型和其他內容時,您可以根據這些消息的特征來編寫其他代碼。 無論您做什么,都不要使用Contains 一條消息可能包含任何內容,因此您無法檢測到它的類型!

暫無
暫無

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

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