【发布时间】: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 个响应