客户机和服务器
客户请求后
服务器从本机另一个别人的程序接受连续数据,但是因为不知道那个程序会发多大的数据只能这样
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次才能发。有什么好办法吗?保证马上给分。

解决方案 »

  1.   

    数据量大的话,Socket会自动把数据分成多个包传输
    数据最前面不是内容,而是内容的长度。
    让客户端发送已接受完毕应答给服务端
    http://www.codeproject.com/KB/IP/AsyncSocketServerandClien.aspx
      

  2.   


    好像不是这个意思,简单说就是
    b从a处循环读取,每次读取异步处理(慢,为了不阻塞读取线程),但是处理结果要按b从a处读取的顺序排队发给c。怎么排这个顺序比较好。有个土办法就是b从a处读取处理时给他一个自加的序号,发送的时候不管哪个线程先执行完都按这个序号来发,但是这样肯定不是正确的办法,估计应该有这种同步的方法。