c#messenger,通过网络发送命令,协议?

时间:2010-12-14 21:01:52

标签: c#

我正在制作一个c#messenger应用程序,只是为了好玩,但我想做得很好。 我希望有可能发送聊天消息,踢等命令等命令,但我不知道控制它的好方法。

我可以通过网络流发送一个对象,或者我可以发送一个字符串,如:stream.write(“command ##”);

也许你知道解决这个问题的另一种方法,但我在stackoverflow atm。 感谢。

3 个答案:

答案 0 :(得分:1)

在您的问题中,您似乎已经掌握了使用Stream.Write()构建套接字的方法。

您可能想尝试使用消息类型和某种校验和来构建字节数组。例如:

        string message = "this is your message";
        byte packetType = 1;
        byte checksum = 0;

        // calculate a simple checksum
        foreach (char c in message)
        {
            checksum ^= (byte)c;
        }


        // type, message, checksum into buffer
        // (uses list instead of playing with arrays for expeditious example code)
        List<byte> buffer = new List<byte>();
        buffer.Add(packetType);
        buffer.AddRange(ASCIIEncoding.UTF8.GetBytes(message));
        buffer.Add(checksum);

        // write out to the socket
        CommStream.Write(buffer.ToArray(), 0, buffer.Count);

一旦你觉得不仅仅是发送简单的字符串,你可以尝试使用运行时命名空间将对象序列化为字节数组:

    using System.IO;
    using System.Runtime.Serialization.Formatters.Binary;

    public class Message : ISerializable
    {
        DateTime timestamp;
        byte type;
        string message;
    }

    public byte[] BuildBuffer(Message input)
    {
        // Serialize the message
        Stream s = new MemoryStream();
        BinaryFormatter binaryFormatter = new BinaryFormatter();
        binaryFormatter.Serialize(s, input);
        buffer = s.ToArray();

        return buffer;
    }

    public Message BuildMessage(byte[] input)
    {
        Stream s = new MemoryStream(input);
        s.Position = 0;

        BinaryFormatter binaryFormatter = new BinaryFormatter();
        return (Message)binaryFormatter.Deserialize(s);
    }

答案 1 :(得分:0)

只是有某种控制字符(比如)......当服务器看到那个字符时,它会开始记录,直到它收到一个空格字符。一旦它到达空间,它会查看字符串并将其与可用命令列表(\ kick等)进行比较。

这只是解决这个问题的一种技巧。老实说,如果你是为了好玩,那么无论如何都要以最有趣的方式实现它: - )

答案 2 :(得分:0)

如果你想把你的“为了好玩”项目变成一个“专业发展”项目(如,开发你的技能,而不是专业品质),试试WCF。它将为您处理整个消息传递体系结构,让您专注于您的功能。另外,WCF在简历上看起来很不错。