我在C#中编写了一个小套接字应用程序,在每次启动时检查我程序的当前版本,现在在我的测试程序中,一切正常,我可以从服务器发送字符串,它将正确显示在客户端上,但是当我尝试使用带有该字符串的if语句时,它只是不起作用。例如:
public void rcv(NetworkStream ns, TcpClient clientSocket)
{
on = false;
//sending some random string so the server will respond
Byte[] sendBytes = Encoding.ASCII.GetBytes("bla");
ns.Write(sendBytes, 0, sendBytes.Length);
//receiving server response
byte[] bytes = new byte[clientSocket.ReceiveBufferSize];
int bytesread = clientSocket.ReceiveBufferSize;
ns.Read(bytes, 0, bytesread);
//received response, now encoding it to a string from a byte array
string returndata =Encoding.ASCII.GetString(bytes);
ver = Convert.ToString(returndata);
//MessageBox.Show("ver\n" + ver);
//MessageBox.Show("return\n" + returndata);
on = true;
if (ver== "2.0.1")
{
MessageBox.Show("iahsd");
}
}
正如您所看到的,服务器正在使用的测试字符串是“2.0.1”,它确实在标签,消息框和文本框中正确显示以供测试。但是类末尾的if分支不接受它并跳过它,如果我把一个else语句,它会跳过它。
我已经尝试过我和我的朋友们想到的一切,尝试更改编码,发送不同的字符串等。
客户的完整代码: http://pastebin.com/bQPghvAH
答案 0 :(得分:1)
代码中编译的“2.0.1”存储为Unicode。 http://msdn.microsoft.com/en-us/library/362314fe(v=vs.110).aspx
您将服务器中的值视为ASCII编码文本,然后将其与Unicode字符串进行比较。
观察:
static void Main(string[] args)
{
string a = "hello";
byte[] b = UnicodeEncoding.Unicode.GetBytes(a);
string c = ASCIIEncoding.ASCII.GetString(b);
Console.WriteLine(a == c);
}
解决方案是使用String.Compare ...
Console.WriteLine(String.Compare(a,c)==0);
答案 1 :(得分:1)
Stream.Read(...)
返回读取的字节数。您需要使用此值来确定字符串结束的位置,方法是使用Encoding.GetString(Byte[] bytes, Int32 index, Int32 count)
重载。
Byte[] buffer = ...;
var bytesRead = stream.Read(buffer, 0, buffer.Length);
var returnedData = Encoding.ASCII.GetString(buffer, 0, bytesRead);