【问题标题】:Sending data to server with NetworkStream使用 NetworkStream 向服务器发送数据
【发布时间】:2019-10-24 03:27:34
【问题描述】:

我的任务是创建一个向服务器发送 ToString-override 方法的客户端。我的老师给我发了一个Centralcomputer.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));
    }

我以前从未做过这种类型的编码,所以我真的很感谢一些帮助,只是开始!

【问题讨论】:

  • 服务器响应应该是什么?
  • 我不太清楚你的意思,但是服务器上的输出应该是字符串格式
  • 我想知道服务器是否在您向他发送消息后立即响应。
  • 哦,是的,响应是大约 5 个“东方”字母,然后客户冻结
  • 最后一个问题:如果客户端冻结,您如何知道 bytesRead 变量的值?它会在一段时间后解冻吗?

标签: c# asynchronous tcp tcpclient networkstream


【解决方案1】:

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

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

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

这又意味着以下之一:

  • 您发送的任何内容都没有按照服务器预期的协议定义完成
  • 数据仍在缓冲中,未发送

要排除第二个,请确保在 Write 之后调用 Flush()。如果这仍然不能解决问题:非常仔细地检查协议以了解您打算发送的内容。也许您错过了尾随换行符或类似内容。

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

【讨论】:

  • Flush() 没有修复它。两天来一直在努力解决这个问题。你读过我的编辑吗?也许这会改变一些事情
  • @AlexanderSwe 评论添加了您的编辑。但是,最终这听起来像是协议故障,即您误解了服务器希望您发送的内容。在不谦虚的情况下,我在套接字代码方面非常有经验,并且要进一步回答您的问题,确实需要有关服务器想要什么的信息。正如我在上面已经说过的,正如另一个人回答的那样,我首先要尝试的是查看服务器是否期望 CR、LF、CR+LF 甚至 LF+CR(非常罕见)来表示结束您的请求。
  • 好的,我会和我的老师谈谈,问他。感谢您的帮助!
  • @AlexanderSwe 注意:另一种可能性是服务器希望您在它回复之前结束 outbound 套接字 - 这种情况很少见,但有时确实会发生,单次每套接字消息协议;要尝试那个,请在套接字上使用Shutdown 方法来关闭出站(发送)套接字,而使入站(接收)套接字保持打开状态。
【解决方案2】:

在将某些内容写回客户端之前,您的服务器可能需要回车或/和换行。

尝试更改以下行

string sendToServer = "Testing testing";

进入

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-29
    • 2014-01-31
    • 1970-01-01
    • 2010-12-03
    • 2015-11-18
    相关资源
    最近更新 更多