我正在尝试让客户端向我的服务发送命令,该命令是" 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"因为当我将它输出到文本框时,这就是打印出来的内容。是通过某种方式改变字符串来转移它的行为吗?
答案 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
,这样您就可以只读取文本(例如,时间)而不是转换到整个地方。