【问题标题】:How to send memory stream using C# sockets?如何使用 C# 套接字发送内存流?
【发布时间】:2019-02-11 18:27:38
【问题描述】:

我正在尝试为服务器套接字编写代码,它使用System.Net.Sockets 通过网络发送MemoryStream 的内容。我已经尝试了下面的代码来发送内存流的内容,它不为空,但程序没有工作。代码有什么问题,我该如何解决,如果还有其他方法可以帮助我吗?

客户端的C#代码:

    using (var ms = new MemoryStream())
        {
            byte[] buffer = new byte[1024];
            int read = 0;
            while ((read = NetStream.Read(buffer, 0, 1024)) != 0)
            {
                ms.Write(buffer, 0, read);
            }
            ms.Position = 0;
            stream.Close();
            client.Close();
            return ms;
        }

服务器的C#代码:

            byte[] buffer = new byte[1024];
            MemoryStream ms = new MemoryStream();
            ms = response; //response is also NOT null MemoryStream
            ms.Position = 0;

            int read = 0;
            while ((read = ms.Read(buffer, 0, 1024)) != 0)
            {
                stream.Write(buffer, 0, read);
            }
            ms.Close();
            response.Close();
            stream.Flush();
            Console.WriteLine("DONE.");

调试器的结果:服务器立即在程序中继续,客户端卡住了。

注意:此答案的代码 id:DataSet & NetworkStream in C#

【问题讨论】:

  • 您在将 MemoryStream 填充到客户端之后但在将其返回给调用者之前对其进行处理。您可能想删除 using 语句。
  • 首先,我们不知道您的服务器中的stream 和客户端中的NetStream 是什么以及它们是如何创建/设置的。 (它可能与您的问题有关,也可能与您的问题无关,谁知道呢)。其次,这里的服务器的小代码示例显示了一些奇怪的东西,比如你似乎将 ms 和 response 视为不同的东西,比如分别关闭它们(尽管它们是一回事,因为ms = response)。另外,那些带有显式 .Close() 调用的恶作剧是什么?如果您使用流,请始终使用 using 而不是显式调用 .Close()...
  • 首先,内存流是使用二进制反序列化转换的字符串或数据集。其次,我知道,我只是从上面帖子中的问题链接中复制了源代码,所以我不知道。你能帮我写一个正常工作的代码吗?我只需要修复自己并学习如何做得更好。我在这里发帖不是为了修复代码,我发帖是为了解决问题.. 不过还是谢谢..
  • 在服务器上,您正在从某个大小未知的response 流中读取数据,然后将与您从该流中读取的字节数一样多的字节发送到客户端。比如说,response 包含少于 1024 个字节,在客户端,阻塞网络 Read 将等待恰好 1024 个字节,在这种情况下永远不会发生这将导致客户端被阻塞。
  • 所以我应该使用另一个编码器或使用绝对大于 1024 的对象编码少于 1024 个响应

标签: c# .net sockets


【解决方案1】:

我已经通过这里的答案弄清楚了:

首先,等待来自发送方的数据(适用于两个循环), 其次,在阅读后检查是否有更多可用数据。这样它就不会等待。

while (true)
{
    if (clientStream.DataAvailable)
            {
                while ((i = clientStream.Read(bytesBuffer, 0, bytesBuffer.Length)) != 0)
                {
                    memoryStream.Write(bytesBuffer, 0, bytesBuffer.Length);
                    if (clientStream.DataAvailable)
                        continue;
                    else
                        break;

                }
                Console.WriteLine("Received from server {0}", Encoding.ASCII.GetString(memoryStream.ToArray()));
                break;
            }
            else
            {
                continue;
            }
    }

谢谢!

【讨论】:

    猜你喜欢
    • 2020-11-20
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    • 2014-04-29
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多