各位,在下准备做一个毕业设计,就是视频聊天软件。现在声音与数据的压缩已经处理好了,由于我想软件在公网上使用,所以在程序中全部使用的是UDP来实现数据传递,以下是我在做软件前的一些问题,请大家指点一下( 假定我全部使用服务器转发),先行谢过啦。
1、如果高网速的server向低网速的client发数据,client会不会被淹没啊?由于服务器转发的数据都是实时的,我不可能使用sleep的方式减缓发速度。有没有办法让client不会被淹“死(机)”啊?
2、多媒体数据(声音数据与视频数据)的传送部份。我让client不停地向Server发数据,server收到数据后将之放入一个大的缓冲区中,我在server中仅开一个线程,这个线程不停的检查缓冲区,有数据就转发给所有在线用户,转发一条多媒体数据后,将之从缓冲区中清除。这样一来,有些数据可能在缓冲区中等待时间过长,我就把它直接清除。因为多媒体数据我觉得掉帧也无所谓,这样做的方法有无不妥?这种方式的转发是否高效?有人说可以使用SEDA方式提高转发效率,是吗?
3、关键数据(登录、退出、管理信息)的传送。由于使用了UDP,我想通过模拟TCP的方式(主要是三次握手)来实现可靠UDP的功能,这种思路行否?
4、还有一个最关键的问题,我看了E话通、UC等多媒体聊天室,他们动辄支持上万个用户(多个聊天室的用户),这是怎么 实现的啊?一个用户在聊天时(开语音、视频),10K/s的数据流量肯定是有的,服务器需要对这些数据进行转发,100个用户在线,服务器需要的带宽是10K*100=1MB,如果是1000个用户在线,那么服务器需要的带宽就可想而知了?有同学告诉我,他们是使用多个服务器实现的,我想也应该这样。如果我想实现多个服务器的结构,我怎样在多个服务器之间进行联系、如何在后台确定用户应该登录哪个服务器?有没有相关的参考代码啊?另外,我想在网上找些与服务器高效转发有关的代码, 在什么地方有现成代码可以借鉴啊?

解决方案 »

  1.   

    传送的是媒体数据,怎么延迟发送啊, 最多先查询对方网络情况,然后决定视频数据的压缩比或者帧数,用UDP模拟TCP当然可行,但为什么不直接建立一个TCP呢,不是很方便吗?
    有些这样的服务器使用的是集群,会自己调度。
      

  2.   

    回答如下:
    1. 你说的问题对client不太可能存在,因为是网速慢,而不是处理速度慢,不过client最好也设置一个缓冲区。
    2.如果需要服务器转发的话,一般是这样做的了。
    3.关键数据(登录、退出、管理信息)的传送可以直接使用TCP连接了,无须所谓的模拟。
    4.对音频和视频数据,我想他们的做法是:如果2个用户之间能直通的话,就不经过服务器转发了,这样可以减轻负担。
      

  3.   

    采用UDP穿透NAT, 全部P2P管道传输,不要采用服务器中转,否则服务器永远承受不了
    所以E话通等软件才能够处理这么多用户,
    还有你的Server仅开一线程怎么够?我原来设计的是1个连接1个线程,使用线程池管理