我创建了一个简单的聊天室程序。
基本消息发送和接收在客户端和服务器上也很有效。
但我想在任何用户离开时向所有用户广播连接列表。
我使用一个线程来处理这个任务。
private void monitorProc()
{
while(true)
{
try
{
int bytereads = 0;
byte[] buffer = new byte[4096];
bytereads = clientStream.Read(buffer, 0, buffer.Length);
updateMonitor(encoder.GetString(buffer), monitor);
}
catch
{
}
}
}
我这样使用这个帖子......
monitorThread = new Thread(new ThreadStart(monitorProc));
monitorThread.Start();
服务器是......
private void broadcast(string message)
{
foreach (User user in userlist)
{
NetworkStream clientStream;
clientStream = user.Userclient.GetStream();
clientStream.Write(encoder.GetBytes(message), 0, 4096);
clientStream.Flush();
}
}
当服务器收到来自客户端的消息时,它会调用此函数,然后所有用户都将
通过这种方式,客户端将在收到来自服务器的消息时放置消息。
我定义了一个User类。它包含以下信息......
[Serializable]
public class User
{
public enum stat
{
ALIVE,
DEAD
}
private string username;
private IPEndPoint userEP;
private TcpClient userclient;
private stat userstat;
public string Username { get; set; }
public IPEndPoint UserEP { get { return userEP; } }
public TcpClient Userclient { get { return userclient; } }
public stat Userstat { get; set; }
public User(TcpClient _userclient)
{
userclient = _userclient;
userstat = stat.ALIVE;
}
}
我使用列表来存储服务器中的每个用户。
问题1:如何将列表发送给每个客户? (我知道序列化可以提供帮助。但是当我使用以下代码序列化列表时发生错误...
foreach (User user in userlist) {
Stream statBroadcast = user.Userclient.GetStream();
var bin = new BinaryFormatter();
bin.Serialize(statBroadcast , userlist);
connlist.Items.Add(user.Username);
}
它说我没有将TcpClient标记为可序列化。
问题2:如果我可以向客户端发送自定义对象。如何同时发送连接列表和消息? (如果我在客户端中定义了一个名为“updateList”的函数,它通过流接收数据。如何区分数据(连接列表的消息)