【发布时间】:2012-08-28 15:04:19
【问题描述】:
作为“协议”的一部分,我有一个 Enum,它在客户端和服务器之间共享,它指示如何处理其余数据
客户:
byte[] outStream = Encoding.UTF8.GetBytes((int)Shared.CommandType.ClientJoin + "sometext");
serverStream.Write(outStream, 0, outStream.Length);
serverStream.Flush();
而在服务器端:
string dataFromClient = null;
byte[] bytesFrom = new byte[1024];
NetworkStream networkStream = tcpclient.GetStream();
int bytesread = networkStream.Read(bytesFrom, 0, bytesFrom.Length);
Byte[] commandBytes = new Byte[4];
Array.Copy(bytesFrom, commandBytes, 4);
dataFromClient = Encoding.UTF8.GetString(bytesFrom, 4, bytesread - 4);
//test values
int receivedcommand = BitConverter.ToInt32(commandBytes, 0);
int actualcommand = (int)Shared.CommandType.ClientJoin;
但是,接收到的“值”(测试中为 1634222896)与实际值 (0) 大不相同
我确定我做错了什么,与字节数组拆分有关,但我一辈子都看不到是什么
有什么想法吗?
(一如既往,如果有比上述更好的实现方法,我愿意接受建议:))
【问题讨论】:
-
您将枚举作为十进制字符串发送,而不是 4 个字节。
-
如果适用,您是否考虑过使用肥皂之类的东西或 RESTful API 来实现这一目标?这样,您可以在一端序列化对象,并在另一端反序列化,而无需太多努力。
-
哈罗德是正确的。刚检查。尝试检查 byte[] outStream = Encoding.UTF8.GetBytes(1234567890 + "") 的长度以了解我的意思。
-
@Patrik 对。另请注意,您的代码比这更不正确。 TCP 是一种流协议,不是基于数据包的,因此读取最多 1024 个块既不能保证它全部属于一个命令,也不能保证它甚至是一个完整的命令。因此,作为一种解决方案,我建议使用 BinaryWriter 和 BinaryReader。然后你就不必自己做所有的复制和BitConverting。
-
谢谢大家(特别是 harold :))我很快就会研究 Binary[Reader|Writer]...
标签: c# tcp enums bytearray byte