如何在所有TCP客户端上实现连接用户列表

时间:2018-04-24 18:09:16

标签: c# serialization tcp tcpclient tcpserver

我正在尝试编写一种方法,在其中我可以向每个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' });
   }

1 个答案:

答案 0 :(得分:1)

使用String.Contains来检测此类消息是一个非常糟糕的主意。

您可以考虑消息中与消息类型对应的一些前导字节(或字符)。 例如,如果为此分配了5个字符,则可以使用USERS启动每条与在线用户相关的邮件。你应该为此建立一些其他约定。但我想你也可以找到某种传播这些信息的标准。

此外,更常见的是使用byte[]而不是字符。因此,您可以假设一个标准,即您的第一个例如四个字节与消息类型相关,例如,后两个字节显示用户ID,依此类推。您可以使用shortintlong来获取与这些内容相关的代码,并使用Enumeration types对其进行整理。

请注意,当您使用第一个字节数来检测消息的类型和其他内容时,您可以以依赖于这些消息特征的方式编写更多代码。无论你做什么,都不要使用Contains;消息可以包含任何内容,您无法通过该消息检测其类型!