如何序列化自定义对象,包括Tcpclient(用于聊天室用户列表)

时间:2014-03-05 14:31:54

标签: c# serialization

我创建了一个简单的聊天室程序。

基本消息发送和接收在客户端和服务器上也很有效。

但我想在任何用户离开时向所有用户广播连接列表。

我使用一个线程来处理这个任务。

    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”的函数,它通过流接收数据。如何区分数据(连接列表的消息)

0 个答案:

没有答案