【问题标题】:C# How to send more than one byte streams using TCPClient?C# 如何使用 TCPClient 发送多个字节流?
【发布时间】:2012-08-16 22:58:28
【问题描述】:

我正在尝试使用 TCP 客户端制作 登录功能。我有两种形式:客户端和服务器端。

客户端处理用户输入,而服务器端连接数据库。

问题在于阅读器结果,它总是将两个输入组合成一个长字符串,如下所示:

   myusernamemypassword

这是客户端发送者的一部分:

    byte[] byteUsername = Encoding.Unicode.GetBytes(username);
    byte[] bytePassword = Encoding.Unicode.GetBytes(password);

    NetworkStream stream = client.GetStream();

    stream.Write(username, 0, byteUsername.Length);
    stream.Write(password, 0, bytePassword.Length); 
        //if offset != 0, the code always return ArgumentOutOfRangeException

以及服务器端的阅读器

    return Encoding.Unicode.GetString(buffer, 0, buffer.Length)

经过长时间的搜索,我找到了解决方案,但它只能处理两个字符串;第三个+字符串将与第二个字符串组合在一起。我需要为其他功能发送至少 4 个字符串。

这是更新的阅读器代码:

List<string> list = new List<string>();
int totalRead = 0;
do
{
    int read = client.GetStream().Read(buffer, totalRead, buffer.Length - totalRead);

    totalRead += read;

    list.Add(Encoding.Unicode.GetString(buffer, 0, totalRead));

} while (client.GetStream().DataAvailable);

我不太明白这段代码。它如何知道哪些字节是第一个字符串的一部分? Read()参数的sizelength-totalRead,也就是length - 0,应该返回整个缓冲区吧?

有什么解决办法吗?

感谢之前

【问题讨论】:

  • "它如何知道哪些字节是第一个字符串的一部分?" - 它不知道这是你不应该使用你不理解的代码的原因之一。我要做的是将 List 转换为 byte[] 并发送它。您还可以做的是构建组合四个字符串,并将每个字符串的长度发送到服务器,然后以这种方式对其进行解码。如果你想了解你“找到”的代码是做什么的,你需要告诉我们你在哪里找到它,或者至少提供更多信息。
  • @Ramhound 我们是否需要使用另一个 TCPClient 来发送每个字符串的长度?顺便说一句,我在朋友给我的电子书中找到了它。标题是 Ben Watson 的“C# 4.0 How To”。我可以上传并分享链接,但我认为我不应该进一步传播盗版

标签: c# tcpclient networkstream


【解决方案1】:

您应该在每个字符串前面加上其长度(以字节为单位,而不是字符)作为 4 字节整数。
这样,服务器就会知道要读入每个字符串的字节数。

【讨论】:

  • 但是如何将每个字符串的长度发送到服务器端呢?
  • BitConverter.GetBytes(byteArray.Length)
  • 谢谢,我终于明白这个问题的逻辑了。
猜你喜欢
  • 1970-01-01
  • 2011-04-07
  • 2022-01-12
  • 2021-11-14
  • 1970-01-01
  • 2020-02-17
  • 1970-01-01
  • 1970-01-01
  • 2015-11-14
相关资源
最近更新 更多