none
求一个同步的好方法 RRS feed

  • 问题

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

答案

  • 您的客户端和服务器的通讯方式是什么?

    如果是 NetworkStream 的话,您可以像那个外部程序一样,收到数据后直接转发到客户端,它可以选择同步/异步去读这个 Stream。

    排队的问题是个好问题。用序号标注收到的数据先后顺序虽然“土”,但是它是比较有效地方法。很多情况下需要利用这个序号标识数据的处理顺序,并可以被进一步改进得到更加健壮的方法。

    楼主可以研究一下 NetworkStream,我觉得用它自己就可以解决问题。不过我没有试过。


    Mark Zhou
    2010年10月4日 9:46

全部回复

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

    有个土办法就是b从a处读取处理时给他一个自加的序号,发送的时候不管哪个线程先执行完都按这个序号来发,但是这样肯定不是正确的办法,估计应该有这种同步的方法。
    2010年10月1日 10:53
  • 您的客户端和服务器的通讯方式是什么?

    如果是 NetworkStream 的话,您可以像那个外部程序一样,收到数据后直接转发到客户端,它可以选择同步/异步去读这个 Stream。

    排队的问题是个好问题。用序号标注收到的数据先后顺序虽然“土”,但是它是比较有效地方法。很多情况下需要利用这个序号标识数据的处理顺序,并可以被进一步改进得到更加健壮的方法。

    楼主可以研究一下 NetworkStream,我觉得用它自己就可以解决问题。不过我没有试过。


    Mark Zhou
    2010年10月4日 9:46