最近开始做socket方面的研究,帖子发了一个又一个!问题通过各位高手的帮助也基本解决!首先感谢csdn给我们提供了这个交流平台,其次感谢帮助我的人!
感谢说完开始说正事:原来我的考虑是我只做个服务端程序,利用多线程无论客户端有多少,我都给他分配个线程,也无论你是长连接还是短连接,只要你发送数据我照单全收。。
呵呵~~
不知道我说的对不对,因为还处在测试阶段加上用户数量不能达到很多!所以目前看不出什么毛病!唯一毛病就是只要客户端来个无限发送,cpu使用率马上达到100%!这应该就是缺点了!
于是我想找到解决办法?先说下领导告诉我的方法(也许就是他在误导我),首先他告诉我说客户端不固定,有可能只是一个有可能多个!于是我用的方法是死循环等待客户连接!然后他告诉我说客户端要实时(时时)回传数据,所以我就写了个判断!收到数据回复“收到”,然后客户继续传,客户端的程序是用其他语言来写入信息采集设备中,我还没接触,所以自己模拟的客户端是收到确认继续发这样无限发下去。。我想知道是不是不用这样?我可以控制时间段发送?或是其他方法不立即发送?也就是说长连接没错,但频率不要很快的!

解决方案 »

  1.   

    上面只是说了接收和发送!那个所谓发送频率如果是客户端控制话就暂时放下,以后学习用,毕竟现在不用我做!然后就是想解决下数据包的定义问题了!我现在模拟做的很简单,字符串写入数组,转码发送!但是看的越多需要掌握的也就越多,首先我想了解下我们传输的数据是什么?就是我们用NetworkStream写入数据流或是用socket.send发送的数据就是数据包?
    那所谓的包结构是说自己给自己的数组加上定义吗?比如网上所说的包头包体是自己定义的吧?
    数据包嵌套?也就是数组嵌套数组?
    呵呵不知道我的理解对不对?
      

  2.   

    学习一下:
    http://www.cnblogs.com/goodcandle/archive/2005/12/10/socket.html
      

  3.   

    还有个问题,比如我们上qq,我们登陆账号后,服务端给我们分配了个线程,但是我上了qq以后我不想说话,只是挂着。。但是别人还可以和我说话,这个挂号时用的什么原理?是sleep吗?要是的话我要怎么控制这个时间呢?因为我也不知道我什么时候有事要说!就是我想让线程休眠,但是还不想他浪费资源!
      

  4.   

    http://vbnet.5d6d.com/thread-7-1-1.html
    异步的Socket,高手做的
    不需要进程
    全部通过事件完成……
      

  5.   

    这个CPU使用率 随着时间增加不断的增加 这个应该是  内存没有被释放问题吧  只要在接受的时候释放内存就行了.
      

  6.   

    别学网上那种几乎只是一对一的所谓“聊天”程序!那种程序“分配了个线程”是错误的。如果有1000万用户不定时地访问服务器,往往也只需要几十个线程就足够了。你才有几个CPU?通常每一个CPU使用30或者50个线程足够了,如果线程多了反而浪费大量时间在干线程管理的事情。保持通讯,就是保持socket对象,即使只有一个线程也不妨碍你的服务器程序保持1000个socket。这可不能变成在一个一个线程中弄了个什么循环。
      

  7.   

    再具体一点,当一个socket有数据可以读取,那么.net框架就会使用一个系统线程调用你的回调方法,于是你就可以读取数据、解析数据、返回结果,然后return。这不是什么你的程序去new一个线程然后循环。假设系统线程池中有1000个线程,其中有50个专门用于通讯,.net框架会自动复用它们来执行你定义的回调方法,然后当执行完方法之后线程被归还到系统线程池,用于其它的异步回调。
      

  8.   

    接受数据使用一个线程足矣。如果每个客户端一个线程的话,自然是不行的,CPU过高,运行效率过低。为什么要开多个线程呢?
    使用一个线程,每个客户端数据中格式化下,在头部加上自己的标号即可。或者根据ip过来。
    QQ的是定时通信,比如说:3秒钟通信一次,然后没三秒去请求下服务器,问下是否有人发过来信息
      

  9.   

    看了你的回复我有种豁然开朗的感觉!确实是在网上学那种一对一的误导了我!如果是每一个客户请求我就给分配一个线程确实浪费资源效率低,而每当有一个客户请求就把这个请求扔进线程池是不是就好点了?
    “ThreadPool类会在线程的托管池中重用已有的线程,使用完线程后,线程就会返回线程池,供以后使用;”这句话是刚查的!不知道是不是解决了多余线程的问题?
    至于你说的一个线程保持1000个socket的方法我真的不太懂!