求一个同步的好方法

sswwee 2010-10-01 04:08:39
客户机和服务器
客户请求后
服务器从本机另一个别人的程序接受连续数据,但是因为不知道那个程序会发多大的数据只能这样
byte[] bt=new byte[1024];
int count=ns.read(bt,0,bt.length);
while(count>0)
{
//处理后给客户
count=ns.read(bt,0,bt.length);//再读
}
问题就在这里,如果服务器把那个程序的所有数据都得到后再给客户就好办了,但是不行,如果那个程序要发3分钟呢,客户端不可能等3分钟才开始接受数据,所以只能像上面这样,那个程序发一点,就处理一点,给客户一点。

这样有一个问题,就是//处理后给客户这一步比较慢一点,这样就很出现一种情况,就是执行完处理后给客户这一步,再读的时候,发现那个程序已经断开了,但其实那个程序在断开前还发送了1/2次数据,但是由于处理后给客户那一步比较慢嘛,读的时候,那个程序最后发送的一两次数据没有得到,只得到了已断开的异常。

所以就只能把处理后给客户这一步放在另一个线程去执行而不阻塞while循环,让这个while循环不停地读,以保证可以读到那个程序的所有数据。

但是这样的话,处理后发送给客户就有一个排队问题了,可能第n+1次执行的处理后给客户这一步,比上一次(第n次),处理完要早,但是不能让他首先发给客户,必须按顺序第n次发完第n+1次才能发。有什么好办法吗?

保证马上给分。
...全文
131 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
sswwee 2010-10-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wuyq11 的回复:]
数据量大的话,Socket会自动把数据分成多个包传输
数据最前面不是内容,而是内容的长度。
让客户端发送已接受完毕应答给服务端
http://www.codeproject.com/KB/IP/AsyncSocketServerandClien.aspx
[/Quote]

好像不是这个意思,简单说就是
b从a处循环读取,每次读取异步处理(慢,为了不阻塞读取线程),但是处理结果要按b从a处读取的顺序排队发给c。怎么排这个顺序比较好。

有个土办法就是b从a处读取处理时给他一个自加的序号,发送的时候不管哪个线程先执行完都按这个序号来发,但是这样肯定不是正确的办法,估计应该有这种同步的方法。
wuyq11 2010-10-01
  • 打赏
  • 举报
回复
数据量大的话,Socket会自动把数据分成多个包传输
数据最前面不是内容,而是内容的长度。
让客户端发送已接受完毕应答给服务端
http://www.codeproject.com/KB/IP/AsyncSocketServerandClien.aspx

110,577

社区成员

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

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

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