【问题标题】:Sending Enum Values via TCP通过 TCP 发送枚举值
【发布时间】: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


【解决方案1】:
byte[] outStream = Encoding.UTF8.GetBytes((int)Shared.CommandType.ClientJoin + "sometext");

变成

byte[] outStream = Encoding.UTF8.GetBytes(0+ "sometext");

byte[] outStream = Encoding.UTF8.GetBytes("0sometext");

收到commandBytes后会有{'0','s','o','m'}的字节表示

BitConverter.ToInt32(commandBytes, 0); 只会制作一个 4 字节数组的整数表示,其所有成员都具有非零值(因为都是 ascii 文本)。

【讨论】:

  • 但我将如何确保 Enum 值作为 2byte int 被“传输”?
猜你喜欢
  • 2013-10-08
  • 1970-01-01
  • 1970-01-01
  • 2014-03-13
  • 1970-01-01
  • 2018-06-28
  • 2016-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多