【问题标题】:Socket Client answer套接字客户端回答
【发布时间】:2011-10-19 15:56:19
【问题描述】:

我正在创建一个客户端/服务器套接字应用程序。而且我无法解决这个问题,可能是因为缺乏这方面的知识。

客户端必须发送应答才能进行通信:

while(comunicate)
{
    if (chkCorrectAnswer.Checked)
                answer = encoder.GetBytes('\x02' + "82SP|" + '\x03');
            else
                answer = encoder.GetBytes("bla");
            ServerStream.Write(answer, 0, answer.Length);

            //or ??
            //tcp.Client.Send(answer);
}

服务器收到它:

while(comunicate)
{
    var validanswer= encoder.GetBytes("myvalidanswer");

    answer = new byte[validanswer.Length];
    stream.Read(answer, 0, validanswer.Length);

    //or ??
    //tcp.Client.Receive(answer);

    if (answer.SequenceEqual(validanswer))
        // continue communication
}

每个代码在不同的应用程序中,循环“通信线程”。

答案似乎已正确发送,但服务器似乎没有正确接收它。有时它会收到 blablab 或 lablabl 以及 7 个字符的变体。我认为接收只会用传入的数据填充缓冲区,并且不知何故它会用重复的数据填充缓冲区。

这里有两个问题:

  1. 我应该使用什么,stream.write/read 还是 client.send/recieve?
  2. 如何保证这个答案的验证?

【问题讨论】:

    标签: c# winforms sockets


    【解决方案1】:

    0x02 和 0x03 被称为文本开头 (STX) 和文本结尾 (ETX),它们是用于标识消息开始和结束位置的分隔符。真的没必要两者都用,做串口通信时常用的做法。

    您需要继续构建消息,直到收到 ETX。

    类似(最简单的解决方案,但如果您有很多客户则效率不高)

    string buffer = "";
    var readBuffer = new byte[1];
    int readBytes = 0;
    while ((readBytes = stream.Read(readBuffer, 0, 1))  == 1 && readBuffer[0] != 3)
    {
       buffer += readBuffer[0];
    }
    

    您当然可以阅读更大的块。但是随后您需要检查是否有多个消息到达并相应地处理缓冲区。不过,我就是这样做的。

    【讨论】:

      【解决方案2】:

      我认为接收只会用传入的数据填充缓冲区,并且不知何故它会用重复的数据填充缓冲区。

      嗯,您在循环中重复发送数据,所以这是意料之中的。

      如果您只想从流中读取一定数量的字节,您还需要在其前面发送逻辑数据包的大小,以便接收端可以首先读取大小(比如固定的 int 值)和然后是实际的响应。

      【讨论】:

      • 类似 tcp.Client.Send(answer, answer.Length, SocketFlags.None);还是两次“发送”?
      • 两次写入流 - 一次使用(固定)长度,然后一次使用数据。
      【解决方案3】:

      当你阅读时,你会得到你写的所有东西,包括你以前写的东西。

      实现一个长度标头或某种分隔符,以便您知道什么是什么--

      长度+消息

      消息+分隔符

      然后在读取时解析它。

      【讨论】:

        猜你喜欢
        • 2010-10-15
        • 2012-08-07
        • 1970-01-01
        • 2015-02-08
        • 2012-02-19
        • 2011-01-27
        • 2018-01-22
        • 1970-01-01
        • 2013-12-15
        相关资源
        最近更新 更多