对于一项学校作业,我们必须用 C# 编写一个客户端服务器聊天程序。我以前从未做过任何网络,所以这让我很困惑。我读了一本关于 C# 网络的书,我能够使用二进制读写器和 TCP 套接字进行非常基本的聊天。但是对于分配,我必须让客户端列出所有连接的用户。现在,我将如何做到这一点,以便当有人在服务器上断开连接或连接时,客户端只读取列表流。我可以做到让客户端始终下载新列表,但我觉得发送了很多冗余数据。
附带说明一下,我对客户端/服务器如何知道流中的数据是什么感到困惑。到目前为止,我只有一个字符串通过表示消息的流发送。有没有办法在发送的数据上附加某种签名或其他东西,以便服务器或客户端知道该特定数据是用户名或可能是要显示的消息。
编辑: 我在使用流时遇到问题。我有一个在自己的线程中运行的方法,它始终检查正在发送的信息。它列出了一个字符串,即显示消息的消息和一个包含已连接用户的列表。问题是发送数据的顺序并不总是一致的。有时消息是第一位的,其他人是列表,有时它只是流中的一条消息。有没有办法知道正在读取哪些数据?这是我的客户端监听器。
private void incoming()
{
while (true)
{
try
{
string read = reader.ReadString();
if (read.Length > 0)
lbOutput.Items.Add(read);
lbUsers.Items.Clear();
List<string> users = (List<string>)binaryFormatter.Deserialize(stream);
foreach (string user in users)
lbUsers.Items.Add(user.ToString());
}
catch { lbOutput.Items.Add("Error reading the stream"); }
}
最佳答案
当一个新的客户端连接时,它应该向服务器发送一条消息,通知它它已经连接并要求它存储它的名字。然后服务器可以使用新列表(或只是新客户端的名称)向所有其他客户端广播消息。粗略的轮廓:
public class Server {
public void StartAcceptingConnections() {
while(true) {
// accept socket connection
// read new user name
foreach(Client cl in connectedClients) {
// send new user name to cl.Socket
}
}
}
}
同时,您正在接收来自客户端的消息以进行路由(我假设)。当客户端离开时,它会再次发送一条断开连接消息,服务器可以将更改广播给其余客户端。
如果您想要处理的不仅仅是字节和字符串,您可以尝试通过序列化发送整个对象。看看这个教程:http://msdn.microsoft.com/en-us/magazine/cc301761.aspx .
关于c# - 获取客户端-服务器聊天以流式传输 C# 中的在线用户列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8204824/