关于NetworkStream类 write方法

yanhahamade 2011-06-21 02:52:31
代码如下:

public static void GetBinaryFormatDataset(NetworkStream ns, DataTable ds)//序列化dataset
{
MemoryStream memStream = new MemoryStream();
IFormatter formatter = new BinaryFormatter();
ds.RemotingFormat = SerializationFormat.Binary;
formatter.Serialize(memStream, ds);
byte[] data = memStream.GetBuffer();
int len = (int)memStream.Length;
byte[] size = BitConverter.GetBytes(len);
ns.Write(size, 0, 4);
ns.Write(data, 0, len);
ns.Flush();
ns.Close();
}

做一个聊天工具,用NetworkStream类写入及读取数据。上面代码为服务器向客户端传一个实体类的对象,选把对象序列化,然后把对象的大小及内容写入NetworkStream
当执行到ns.Write(data, 0, len);这个语句是出现异常
无法将数据写入传输连接: 远程主机强迫关闭了一个现有的连接。。

请高手帮忙解决
...全文
399 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yanhahamade 2011-06-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 qldsrx 的回复:]

难道说你用NetworkStream就好判断了?这是你的异想天开,如果你最后没有那么一句ns.Close(),那个流是无法获取长度的,你也根本不知道是否到达最后一个字节了,而对方接收数据时会卡住,直到你发送方关闭流。但是这流一旦关闭就无法重利用了,也就会出现“远程主机强迫关闭了一个现有的连接”的错误。
[/Quote]
我已经把字流的长度传给客户端了........异想天开谈不上吧
现在已经解决了,不过还是谢谢你
qldsrx 2011-06-21
  • 打赏
  • 举报
回复
难道说你用NetworkStream就好判断了?这是你的异想天开,如果你最后没有那么一句ns.Close(),那个流是无法获取长度的,你也根本不知道是否到达最后一个字节了,而对方接收数据时会卡住,直到你发送方关闭流。但是这流一旦关闭就无法重利用了,也就会出现“远程主机强迫关闭了一个现有的连接”的错误。
yanhahamade 2011-06-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 qldsrx 的回复:]

建议使用Socket来传输,容易理解,你把网络理解为一个流,就会忽略很多问题,例如连接,明明未建立连接,却往那个流写入,而且出错了不好控制。
[/Quote]
socket 接受,不好判断是否是流的最一个字节
yanhahamade 2011-06-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 cllchenlulu 的回复:]

没有跟服务器进行连接 必须先连到服务器
[/Quote]

没有连接的话就不会提示关闭现有连接了
qldsrx 2011-06-21
  • 打赏
  • 举报
回复
建议使用Socket来传输,容易理解,你把网络理解为一个流,就会忽略很多问题,例如连接,明明未建立连接,却往那个流写入,而且出错了不好控制。
cllchenlulu 2011-06-21
  • 打赏
  • 举报
回复
没有跟服务器进行连接 必须先连到服务器
yanhahamade 2011-06-21
  • 打赏
  • 举报
回复
up~~~~

111,125

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧