我正在开发一个数据包系统(UDP或TCP,无论哪种方式都没问题),但我得出的结论是我当前的(TCP)系统确实非常好。
基本上,我发送的数据包看起来像这样:
string packet = "LOGIN_AUTH;TRUE"
IPAddress target = IPAddress.Parse(endPoint);
// Send packet
当我在客户端收到数据包时,我用它来确定数据包类型:
string[] splitPacket = packet.Split(';');
if (splitPacket[0] == "LOGIN_AUTH" && splitPacket[1] == "TRUE")
authLogin(packet); //Does stuff like loading the next screen
但我确信必须有更好的方法来做到这一点,因为这个帖子:
我只是想知道是否有人可以按照正确的方向推动我应该以一种更容易对眼睛进行分类的方式进行分类。
提前谢谢。
编辑:我做了一些研究,但我无法在WCF中找到解决问题的方法。那么,再一次,创建数据包结构的最佳方法是什么,以及如何利用它?我不想重新创建一个协议,就像这样:
public string sepChar = ";"
public static struct loginPacket
{
string type;
string username;
string password;
}
public void reqLogin()
{
lock (_locker) //Need to make it thread-safe in this case
{
loginPacket.type = "login";
loginPacket.username = "username";
loginPacket.password = "password;
sendPacket(loginPacket);
}
}
public void sendPacket(string packet)
{
// Script to send packet using the struct information
}
我希望它足够详细。
答案 0 :(得分:2)
我会推荐WCF;如果不是现在,决定将来学习它。它有一个巨大的学习曲线,因为它不仅涵盖了你想要做的事情,还涵盖了许多其他事情。
如果您只想要一个快速而肮脏的解决方案,那么您可以使用二进制序列化。要采用这种方法,您需要在客户端和服务器之间共享的dll中定义消息类型。然后,请记住使用message framing的形式,这样邮件就不会在传输中被提升。
考虑版本控制时,事情变得更加复杂。最终你会想要使用WCF。
答案 1 :(得分:1)
2年前,我在TCP上使用了自己的通信协议,关于基本数据包类:
public enum PacketType {Login, Hello, FooBar}
public class Packet
{
public long Size;
public PacketType PacketType;
}
public class LoginPacket : Packet
{
public string Login;
public string Password;
}
我不同意Size属性...因为只有在使用binaryFormater序列化后才会知道数据包大小。我已经使用了其他方法,首先我序列化了数据包对象然后在网络流中放入这个byte []之前我在每个数据包字节之前写了BitConverter.GetBytes(SerializedPacketMemoryStream.Length)。
要考虑的第二件事是,你需要为接收到的字节[]创建临时缓冲区,并等到你收到完整的数据包然后才想要它。
我可以发送给你我的客户端\服务器代码部分,当我刚刚开始学习C#时,我写的不是很干净,但它是100%稳定的,在生产环境中测试了3年。
答案 2 :(得分:0)
protobuf可能就是你想要的。
这是.NET端口:protobuf-net