我的任务是创建一个向服务器发送ToString-override方法的客户端。老师给我发了一个Centralserver.exe服务器程序,该程序可以接收单个字符串并使用我的本地IP。
我连接没有问题,尝试执行此行Int32 bytesRead = stream.Read(bytesToRead, 0, klient.ReceiveBufferSize);
时,我的客户端死机了,bytesRead的值为0。
编辑:忘了提到服务器程序在客户端冻结之前以一些“东方”字母作为响应。
TcpClient client = new TcpClient();
public async Task Connecting()
{
try
{
await client.ConnectAsync("127.0.0.1", 12345);
}
catch (ArgumentNullException e)
{
MessageBox.Show("ArgumentNullException: {0}" + e);
}
catch (SocketException e)
{
MessageBox.Show("SocketException: {0}" + e);
}
public void Sending()
{
string sendToServer = "Testing testing";
byte[] data = System.Text.Encoding.ASCII.GetBytes(sendToServer);
NetworkStream stream = client.GetStream();
stream.Write(data, 0, data.Length);
byte[] bytesToRead = new byte[client.ReceiveBufferSize];
Int32 bytesRead = stream.Read(bytesToRead, 0, client.ReceiveBufferSize);
//This is where the client freezes
MessageBox.Show("Received : " + Encoding.ASCII.GetString(bytesToRead, 0, bytesRead));
}
我以前从未做过这种编码,所以我真的很感谢刚开始使用的帮助!
答案 0 :(得分:0)
只有两种情况会在这里收到零:
假设您不要求读取零长度,因此我们可以假定第二个选项,并且套接字已关闭。那么:为什么关闭了?最有可能的原因是服务器放弃了等待消息回复的等待。这表明它不认为您发送了完整的消息。
这又意味着:
要排除第二个错误,请确保在Flush()
之后致电Write
。如果仍然不能解决问题:请仔细检查协议,以查看您发送的消息。也许您错过了换行符或类似字符。
作为旁注:每次在套接字上执行单个Read
时,您可能都犯了一个错误。 TCP不是面向消息的-它只是一个流。这意味着您始终需要一个读取循环来处理正在使用的任何帧协议。
答案 1 :(得分:0)
在将某些内容写回客户端之前,服务器可能期望回车或换行。
尝试更改以下行
string sendToServer = "Testing testing";
进入
string sendToServer = "Testing testing \r\n";
由于我们无权访问服务器的代码,因此很难为您提供确切的解决方案。