Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么';通过TCP套接字发送命令的最佳方式是什么?_C#_.net_Sockets_Tcp_Command - Fatal编程技术网

C# 什么';通过TCP套接字发送命令的最佳方式是什么?

C# 什么';通过TCP套接字发送命令的最佳方式是什么?,c#,.net,sockets,tcp,command,C#,.net,Sockets,Tcp,Command,我目前正在使用服务器和客户端,使用简单的字符串将命令发送到字节。归根结底是这样的(例如向服务器发送消息): 接收端编码回一个字符串。它通过执行以下操作来识别命令: recievedstring.Split(':')[0] 假设receivedstring.Split(':')[1]是参数。如果用户在消息中输入冒号,则该冒号将在消息中被截断。我觉得这是一种在两个端点之间发送数据的黑客方式。有没有更标准的方法?对不起,如果我没有提供足够的信息,我是新手 您不一定需要将所有通信的数据作为字符串处理,

我目前正在使用服务器和客户端,使用简单的字符串将命令发送到字节。归根结底是这样的(例如向服务器发送消息):

接收端编码回一个字符串。它通过执行以下操作来识别命令:

recievedstring.Split(':')[0]

假设
receivedstring.Split(':')[1]
是参数。如果用户在消息中输入冒号,则该冒号将在消息中被截断。我觉得这是一种在两个端点之间发送数据的黑客方式。有没有更标准的方法?对不起,如果我没有提供足够的信息,我是新手

您不一定需要将所有通信的数据作为字符串处理,您可以将数据作为字节进行通信,然后将字节转换为任何数据类型(由发送方发送)

更好的方法是为每个消息定义服务器和客户端之间的协议(例如,数据包格式)。例如,您可以定义一个数据包,使前4个字节包含消息的长度,然后是指定长度的消息。您的数据包格式为[长度:数据]

在发送端,您需要先在流中写入消息的长度,然后写入实际数据,在接收端,您将首先接收一个int(数据长度),然后再接收那个大字节


此外,如果可以在端点之间通信多种类型的数据包,例如$command、$notification等,则您还可以在数据包中定义消息类型字段,而不仅仅是$msg(如您的情况)。您的数据包格式将变成[length:type:data]

如何将长度int转换为字节数组?长度字节数组的长度是否始终相同?客户端如何知道如何分离类型和数据?您可以使用
BitConverter.GetBytes(length)
将int转换为c#中的字节数组,是的,它的长度将始终相同,即4个字节。为了分离类型和数据,类型也可以是int,所以总是有4个字节的长度?客户端如何知道要读取多少字节?我现在拥有的是:
byte[]buffer=新字节[4096];int length=serverStream.Read(buffer,0,buffer.length);字节[]newbuffer=buffer.Take(长度).ToArray();string returndata=Encoding.UTF8.GetString(newbuffer)您可以使用int作为类型,即0表示消息,1表示命令,2表示通知等,就像枚举一样,因此您不需要写入类型长度,客户机将首先读取4个字节(长度,并转换为int),4个字节(类型,并转换为int),而不是“长度”字节的数据(因为现在您将拥有数据长度),当您收到serverStream的数据长度时,可以创建缓冲区。Read方法要求我指定一个长度作为参数。我是否会指定长度为8(以获取类型和长度),然后根据长度生成缓冲区并再次读取调用?非常感谢您的帮助,非常感谢!
recievedstring.Split(':')[0]