""没有注册等于" R"通过TCP连接发送时

时间:2014-03-13 15:11:17

标签: c# string tcp tcpclient tcplistener

我正在尝试让客户端向我的服务发送命令,该命令是" R"。 但是当我尝试制作一个IF语句时,它不会注册" R"通过TCP进入,因为它等于我在程序中创建的字符串R.这是我的一些代码。

    byte[] message = new byte[1024];
        byte[] command = Encoding.ASCII.GetBytes("R");
        stream.Read(message, 0, message.Length);
        string messageIn = Encoding.ASCII.GetString(message);
        //updateUI("New Message =  " + messageIn);
        string commandString = Encoding.ASCII.GetString(command);

         if (Encoding.ASCII.GetString(message) == Encoding.ASCII.GetString(command))

正如你所看到的,我的印象是“" R"到字节然后超出字节会导致这个问题,因此巨大的if语句。但是,由于我的if块从不运行,因此这些条件中没有一个返回true。

我知道它正在回归" R"因为当我将它输出到文本框时,这就是打印出来的内容。是通过某种方式改变字符串来转移它的行为吗?

1 个答案:

答案 0 :(得分:6)

除了你正在进行的大量毫无意义的比较之外,第一个问题是你忽略了Stream.Read的结果...而是在整个1024中创建一个字符串message内的字节数。如果您将其更改为:

int bytesRead = stream.Read(message, 0, message.Length);
string messageIn = Encoding.ASCII.GetString(message, 0, bytesRead);

...然后你处于更好的位置。但是,这可能还不够好,除非所有将要发送。 您正在处理流,但我怀疑您已经思考,就好像它是面向消息的 - 就像一个Write一样连接的结尾将映射到另一端的单个Read。这不是面向流的协议的工作方式。如果你有一个合乎逻辑的消息"然后,当从流中读取时,您可能最终得到一条消息,多条消息,任何内容。解决这个问题的常用方法是:

  • 在每封邮件之前加上长度前缀
  • 使用分隔符(例如基于文本的协议的换行符)

有关详细信息,请参阅Marc Gravell's blog post on this

此外,如果您的协议基于基于文本,那么最好在流周围创建一个StreamReader,这样您就可以只读取文本(例如,时间)而不是转换到整个地方。