C# 通过TCP发送枚举值

C# 通过TCP发送枚举值,c#,tcp,enums,bytearray,byte,C#,Tcp,Enums,Bytearray,Byte,作为“协议”的一部分,我有一个Enum,它在客户端和服务器之间共享,它指示如何处理其余的数据 客户: byte[] outStream = Encoding.UTF8.GetBytes((int)Shared.CommandType.ClientJoin + "sometext"); serverStream.Write(outStream, 0, outStream.Length); serverStream.Flush(); 在服务器端: string dataFromClient = n

作为“协议”的一部分,我有一个
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;
然而,收到的“值”(测试中为16342896)与实际值(0)相差很大

我肯定我做了一些非常错误的事情,一些与字节数组分裂有关的事情,但我一辈子都看不出是什么

有什么想法吗

(一如既往,如果有比上述更好的实施方法,我愿意接受建议:)

变成

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

byte[] outStream = Encoding.UTF8.GetBytes("0sometext");
在接收到
commandBytes
后,将有
{0'、's'、'o'、'm'的字节表示形式

BitConverter.ToInt32(commandBytes,0)
将只生成一个4字节数组的整数表示,该数组的所有成员都具有非零值(因为所有成员都是ascii文本)

变成

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

byte[] outStream = Encoding.UTF8.GetBytes("0sometext");
在接收到
commandBytes
后,将有
{0'、's'、'o'、'm'的字节表示形式


BitConverter.ToInt32(commandBytes,0)
将只对4字节数组进行整数表示,其所有成员都有一个非零值(因为所有成员都是ascii文本)。

您将枚举作为十进制字符串发送,而不是4字节。如果适用,您是否考虑过使用soap或RESTful API来实现这一点?通过这种方式,您可以在一端序列化对象,在另一端反序列化,而无需付出太多努力。harold是正确的。刚查过。例如,尝试检查byte[]outStream=Encoding.UTF8.GetBytes(1234567890+“”)的长度,以了解我的意思。@Patrik right。还要注意的是,您的代码比这更不正确。TCP是一种流协议,不是基于数据包的,因此读取多达1024个数据块既不能保证它全部属于一个命令,也不能保证它是一个完整的命令。因此,作为解决方案,我建议使用BinaryWriter和BinaryReader。那么你就不必自己做所有的复制和位转换了。谢谢大家(特别是harold:))我将很快研究二进制[Reader | Writer]…你将以十进制字符串的形式发送枚举,而不是以4字节的形式。如果适用,你是否考虑过使用soap或RESTful API来实现这一点?通过这种方式,您可以在一端序列化对象,在另一端反序列化,而无需付出太多努力。harold是正确的。刚查过。例如,尝试检查byte[]outStream=Encoding.UTF8.GetBytes(1234567890+“”)的长度,以了解我的意思。@Patrik right。还要注意的是,您的代码比这更不正确。TCP是一种流协议,不是基于数据包的,因此读取多达1024个数据块既不能保证它全部属于一个命令,也不能保证它是一个完整的命令。因此,作为解决方案,我建议使用BinaryWriter和BinaryReader。那么你就不必自己做所有的复制和位转换了。谢谢各位(特别是哈罗德:))我将很快研究二进制[Reader | Writer]…但是我如何确保枚举值以2字节int的形式“传输”?但是我如何确保枚举值以2字节int的形式“传输”?