我正在制作一个c#messenger应用程序,只是为了好玩,但我想做得很好。 我希望有可能发送聊天消息,踢等命令等命令,但我不知道控制它的好方法。
我可以通过网络流发送一个对象,或者我可以发送一个字符串,如:stream.write(“command ##”);
也许你知道解决这个问题的另一种方法,但我在stackoverflow atm。 感谢。
答案 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在简历上看起来很不错。