1、背景介绍
需要写一个socket客户端小程序,用他不停的往服务器端发送数据(大概1ms一个数据包,小包)
2、我的解决办法
为了效率,和服务器创建多个socket连接,每个socket循环发送数据。。。
3、碰到的问题
偶尔服务器处理不过来,或者网络卡的时候,我的某个socket 发送一个包的时间比较长,别的socket就要等他发完了
才能发。也曾想用多线程的方式来,各个socket之间互不干扰,但是达不到大概1ms一个包的目的了。
请教:
想请大家看看,有什么好的解决办法不。最终目的:以指定时间间隔,循环不断的给服务器发送数据包,控制得不多不少。
当然适当偏差可以接受。另外有没有可能,只要我的网络不卡,不管对方服务器是否处理得过来,都发送数据出去。
------解决思路----------------------
多个socket和一个socket有区别吗?
------解决思路----------------------
同上,有任何区别吗?
而且,对于windows这种多线程机制,你想精确定时是不可能的
------解决思路----------------------
多线程就解决了,不用那么多SOCKET,浪费内和CPU!
------解决思路----------------------
不知道你是tcp还是udp,如果是udp就可以持续发送不管接收方了,tcp还要等确认。
感觉你这个应用完全没必要多个socket和多线程,只会增加cpu负载,如果接收方单线程处理不过来那多线程应该更处理不完,除非跟多核调用机制有关?
如果想定时到1ms级别还是别用windows了,vxworks啥的还凑合,一般也需要硬件中断
另外不知道楼主是不是就想测试服务器,如果是那下个tcpudp调试工具就好了,可以定时1ms发送,不过肯定不准
------解决思路----------------------
你所谓的“多线程”的意思,就是弄几十个线程在那里分别“死循环”着吧?我在通讯方面的程序从来都是异步并发方式的,但是从来也不循环的。因此你所谓的多线程在我看来,根本就不应该是那样写并发多线程通讯程序的。
如果是正确的异步并发send操作,写一条(比如说)BeginSend(....) 语句就结束了,纠结(非得自己的代码)new一个 thread 对象干什么呢?
对于tcp来说,你不知道它的底层什么时候真正发出去,他有一个“优化网络,避免带宽拥挤”的君子协定。服务器端完全可能“成堆”消息同时到达,但是顺序是有保证的,并且可以保证可靠地到达。
而对于udp来说,你写Send(....)语句本身也就是相当于异步并发发送了,因为这个send语句不等真正发送信息就立刻结束了。底层会去争抢网络带宽,同时udp也特别容易被路由器等设备给丢掉数据包。服务器端完全可能成堆消息同时到达,而且顺序是混乱的,并且许多消息都会丢失。
------解决思路----------------------
除了发送方异步发送以外,(虽然你的间隔发送问题已经解决了)如果你还担心“接收方”处理不过来这些消息,那就是另外一个问题。通常接收方应该瞬间将I/O线程还给线程池,而改由系统线程池分配的Worker线程来处理消息处理工作。因此你的接收方在收到最近的某个消息之后,可能总共有1个线程来处理、也可能有5个线程在处理(因为之前的4个消息还没有处理完),占用多少个线程的数量那是动态的。
如果按照按照什么“弄10个消费者线程在那里死循环”的坑爹的多线程编程方法,你的cpu、线程资源就都被浪费了,而且并发处理效率也会很低。
不要学java,或者至少不要轻信最近3、4年的一些使用java来开发后台服务系统的电商公司里的某些人的鬼话。开发一个高性能的并发多线程通讯网关的思路,不是简单地套用个“生产者-消费者模式”的那种思路。
------解决思路----------------------
你的问题是“异步发送”问题。
而服务器端可能需要避免的问题就是,你的服务器端的I/O底层效率很低(例如不支持IOCP的socket),或者并发能力很低(例如你使用顺序处理而不是异步并发处理),或者中间环节太坑爹(例如额外地用一个队列保存消息然后过一会儿再次分发,而不是直接把消息分配给处理线程),或者浪费了过多的线程资源(例如用固定数量的n个线程去死循环,而不是由系统线程池瞬间分配和回收复用),等等,这些都是服务器端编程可能出现的问题。
------解决思路----------------------
如果考虑服务负荷的问题,那样不如干脆把这个想法转过来。
服务端每隔一秒就找客户端要数据;要是服务端忙不过来,主动降低频率就是。
用长链接做就可以搞掂。
------解决思路----------------------
在队列没满的情况是,,如果前一个还没有发送完,新数据继续发送,不用等
------解决思路----------------------
用异步做时间限制,超过多久就终止,重新发送