【问题标题】:issue with getting TcpClient server response as string将 TcpClient 服务器响应作为字符串获取的问题
【发布时间】:2015-10-21 00:42:43
【问题描述】:

长话短说,我正在尝试开发一个需要与服务器建立 Tcp 连接的应用程序。在这个领域没有以前的经验,我最终没有我的功能工作。所以我决定制作一个简单的控制台应用程序来检查我的命令及其响应。关于建立连接的部分进展顺利,关于写入网络流的部分也很顺利(我认为),但是在尝试显示服务器响应时我碰壁了: 每次我的 porgram 到达它必须对服务器响应和 WriteLine 进行编码的行时,我的控制台应用程序都会变黑,所有文本都会消失。你能告诉我正在使用的代码有什么问题吗?直到控制台尝试显示响应的部分顺利进行,我检查了。我想将服务器的响应作为普通字符串(如果可能的话我猜......)

static void ServerTalk(TcpClient tcpClient,NetworkStream networkStream, StreamWriter streamWriter, StreamReader streamReader)
    {
        //Messaging methods:
        Console.WriteLine("Client: ");
        string message = Console.ReadLine();
        streamWriter.WriteLine(message);
        streamWriter.Flush();
        //Response methode:
        byte[] data = new byte[tcpClient.ReceiveBufferSize];
        int ret = networkStream.Read(data, 0, data.Length);
        string respond = Encoding.ASCII.GetString(data).TrimEnd();
        Console.WriteLine("Server: ");
        Console.WriteLine(respond);
        ServerTalk(tcpClient, networkStream, streamWriter, streamReader);
    }

【问题讨论】:

  • 我怀疑您在显示为黑色的数据末尾发送空值。我会在发送方用返回 ('\n') 终止数据,然后在接收端只打印字符直到返回。
  • 方法结束时的递归调用呢?这应该如何工作?
  • @HughJones 我只是把它放在了整个开始的事情上,因为应用程序要做的一切都在那个块代码中,其余的代码都在工作,一个时间使用,我认为我不需要这个应用程序做更多的事情。
  • @jdweng 你能解释一下吗?
  • @HughJones 是的,我认为这是一个更好的主意,谢谢

标签: c# tcpclient


【解决方案1】:

你只需要处理 ret 字节,你正在翻译数组中的所有字节。

复制到一个'ret'长的新数组,然后解码。

var retarr = new byte[ret];
Array.Copy(data,retarr,ret);
string respond = Encoding.ASCII.GetString(retarr);

更重要的是请注意,这种 tcp 通信方法是行不通的。您假设当您在一个块中发送 x 字节时,您将在一个块中接收 x 字节,事实并非如此,您可以发送 1 100 字节消息并接收 100 条 1 字节消息

这意味着您的任务要复杂得多。您需要设计一种发送自我描述数据的方法 - 以便您知道它已完全接收。传统上,您发送一个长度,然后是数据。然后你继续循环接收代码,直到你收到那么多字节

【讨论】:

  • 非常感谢您的更新,您的权利,我正在做的是,,,复杂,但我们都必须从某个地方开始。
  • 如果您再次卡住,请发布另一个问题。学习使用 vs 调试器
猜你喜欢
  • 1970-01-01
  • 2021-07-20
  • 1970-01-01
  • 2015-01-14
  • 1970-01-01
  • 2019-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多