Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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 write和read命令给出不同的结果_C#_Asp.net Core_Tcp_Async Await_Networkstream - Fatal编程技术网

C# 当我放置断点时,TCP write和read命令给出不同的结果

C# 当我放置断点时,TCP write和read命令给出不同的结果,c#,asp.net-core,tcp,async-await,networkstream,C#,Asp.net Core,Tcp,Async Await,Networkstream,我想从C#中的秤上得到一个重量,所以我使用TCP连接 这是我的密码 private TcpClient _client; public NetworkStream Stream { get; private set; } public ScalesService() { _client = new TcpClient(); } async public Task<string> TestRead() { var responseLength = 1024;

我想从C#中的秤上得到一个重量,所以我使用TCP连接

这是我的密码

private TcpClient _client;
public NetworkStream Stream { get; private set; }

public ScalesService()
{
    _client = new TcpClient();
}

async public Task<string> TestRead()
{
    var responseLength = 1024;
    var readResponse = new byte[responseLength];

    string result = "";

    Console.WriteLine("connecting...");
    await _client.ConnectAsync("10.100.200.70", 1182);
    Console.WriteLine("connected!");

    Stream = _client.GetStream();

    var cmdUser = Encoding.ASCII.GetBytes("user admin\n");
    await Stream.WriteAsync(cmdUser, 0, cmdUser.Length);

    var countCmdUser = await Stream.ReadAsync(readResponse, 0, readResponse.Length);
    var responseCmdUser = Encoding.ASCII.GetString(readResponse, 0, countCmdUser);

    var cmdRead = Encoding.ASCII.GetBytes("read wt0501\n");

    await Stream.WriteAsync(cmdRead, 0, cmdRead.Length);

    var countCmdRead = await Stream.ReadAsync(readResponse, 0, readResponse.Length);
    var responseCmdRead = Encoding.ASCII.GetString(readResponse, 0, countCmdRead);

    //result = responseCmdRead;

    if (!string.IsNullOrEmpty(responseCmdRead))
    {
        // Expected Return: [00R001~       10300~]
        var responseArray = responseCmdRead.Split('~');
        if (responseArray.Length >= 2)
        {
            var weightString = responseArray[1];

            float grossNetWt;
            result = weightString;
            //if (float.TryParse(weightString, out grossNetWt))
            //{
            //    result = grossNetWt;
            //}
        }
    }

    var cmdQuit = Encoding.ASCII.GetBytes("quit\n");
    await Stream.WriteAsync(cmdQuit, 0, cmdQuit.Length);

    return result;
}
专用TcpClient\u客户端;
公共网络流{get;private set;}
公共规模服务()
{
_client=新的TcpClient();
}
异步公共任务TestRead()
{
var responseLength=1024;
var readResponse=新字节[responseLength];
字符串结果=”;
控制台。写入线(“连接…”);
wait_client.ConnectAsync(“10.100.200.70”,1182);
控制台。WriteLine(“已连接!”);
Stream=_client.GetStream();
var cmdUser=Encoding.ASCII.GetBytes(“用户管理员”);
wait Stream.WriteAsync(cmdUser,0,cmdUser.Length);
var countCmdUser=wait Stream.ReadAsync(readResponse,0,readResponse.Length);
var responseCmdUser=Encoding.ASCII.GetString(readResponse,0,countCmdUser);
var cmdRead=Encoding.ASCII.GetBytes(“读取wt0501\n”);
wait Stream.WriteAsync(cmdRead,0,cmdRead.Length);
var countCmdRead=wait Stream.ReadAsync(readResponse,0,readResponse.Length);
var responseCmdRead=Encoding.ASCII.GetString(readResponse,0,countCmdRead);
//结果=响应CmdRead;
如果(!string.IsNullOrEmpty(responseCmdRead))
{
//预期收益:[00R001~10300~]
var responseArray=responseCmdRead.Split(“~”);
如果(responseArray.Length>=2)
{
var-weightString=responseArray[1];
浮动总长度;
结果=权重字符串;
//if(float.TryParse(weightString,out grossnewt))
//{
//结果=总净功率;
//}
}
}
var cmdQuit=Encoding.ASCII.GetBytes(“quit\n”);
wait Stream.WriteAsync(cmdQuit,0,cmdQuit.Length);
返回结果;
}

这条小溪似乎等不及给我完整的答案了。当我放置断点与否时,我得到了不同的结果。有更好的方法吗?我认为等待将是一个很好的解决方案。

如评论中所述,TCP/IP套接字是字节流,而不是数据包。如果你想读/写一整封邮件,你需要使用某种类型的


因为您已经有了一个设备,所以应该在设备的协议规范中记录消息帧的类型。从您发布的示例代码来看,它似乎使用了
\n
的消息分隔符。因此,您需要有一个读取循环,将字节添加到缓冲区,直到您看到注释中指出的
\n

,TCP/IP套接字是字节流,而不是数据包。如果你想读/写一整封邮件,你需要使用某种类型的


因为您已经有了一个设备,所以应该在设备的协议规范中记录消息帧的类型。从您发布的示例代码来看,它似乎使用了
\n
的消息分隔符。因此,您需要有一个读取循环,将字节添加到缓冲区,直到您看到
\n

TCP只是一个字节流。无法保证在一端的一个写调用中发送的内容将传递给另一端的一个读调用。它可以被切碎成小块,或者被分成更大的组。字节的顺序将是相同的,但这是您所能期望的。您需要分析得到的字节,以找到正在使用的协议的边界。在本例中,根据您发送的内容,它似乎是
\n
(字节0x0A)。TCP只是一个字节流。无法保证在一端的一个写调用中发送的内容将传递给另一端的一个读调用。它可以被切碎成小块,或者被分成更大的组。字节的顺序将是相同的,但这是您所能期望的。您需要分析得到的字节,以找到正在使用的协议的边界。这似乎是
\n
(字节0x0A)在本例中,基于您发送的内容。感谢您的回答,但我必须承认我有点迷路了,这并没有真正的帮助:/您能更准确地说明我应该做什么吗?您阅读了链接吗?你试过读入缓冲区吗?是的,我读过,但在这个概念上没有太多的经验,要理解所有东西并不容易。通过读取缓冲区,你的意思是使用System.IO.BinaryReader吗?我的意思是你需要创建一个类似于
列表的缓冲区,并在读取时附加每个字节数组,直到找到一个
\n
。好的,例如,这是我在连接后收到的答案:
\n\r53准备好供用户使用了\n\r>
我猜分隔符是
(所有答案都是这样结束的
\n\r>
)。我还知道我应该得到的答案的大小(22字节)(除了最后一个包含权重且可能有不同值的答案外,答案总是相同的)。循环直到缓冲区的长度为22是安全的吗?谢谢你的回答,但我不得不承认我有点迷路了,这并没有真正的帮助:/你能更准确地说明我应该做什么吗?你读了链接吗?你试过读缓冲区吗?是的,我读过,但在这个概念上没有太多经验,这真的不容易o了解所有内容。通过读取缓冲区,您是指使用System.IO.BinaryReader吗?我的意思是您需要创建一个类似于
列表的缓冲区,并在读取时附加每个字节数组,直到找到
\n
。好的,例如,这就是连接后我收到的答案:
\n\r53准备好供用户使用\n\r>
分隔符是
(所有答案都是这样结束的
\n\r>
)。我还知道我应该得到的答案大小(22字节)(除了最后一个包含权重且可能有不同值的答案外,答案总是相同)。在缓冲区长度为22之前循环是否安全?