使用NetworkStream将数据发送到服务器

时间:2019-06-09 11:54:24

标签: c# asynchronous tcp tcpclient networkstream

我的任务是创建一个向服务器发送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));
    }

我以前从未做过这种编码,所以我真的很感谢刚开始使用的帮助!

2 个答案:

答案 0 :(得分:0)

只有两种情况会在这里收到零:

  • 使用零长度缓冲区读取零长度可以用来检测何时可用数据
  • 入站套接字已关闭

假设您不要求读取零长度,因此我们可以假定第二个选项,并且套接字已关闭。那么:为什么关闭了?最有可能的原因是服务器放弃了等待消息回复的等待。这表明它不认为您发送了完整的消息。

这又意味着:

  • 您发送的所有内容都不符合服务器预期的协议定义
  • 数据仍处于缓冲状态,但未发送

要排除第二个错误,请确保在Flush()之后致电Write。如果仍然不能解决问题:请仔细检查协议,以查看您发送的消息。也许您错过了换行符或类似字符。

作为旁注:每次在套接字上执行单个Read时,您可能都犯了一个错误。 TCP不是面向消息的-它只是一个流。这意味着您始终需要一个读取循环来处理正在使用的任何帧协议。

答案 1 :(得分:0)

在将某些内容写回客户端之前,服务器可能期望回车或换行。

尝试更改以下行

string sendToServer = "Testing testing";

进入

string sendToServer = "Testing testing \r\n";

由于我们无权访问服务器的代码,因此很难为您提供确切的解决方案。