日期:2014-05-18  浏览次数:20972 次

Socket tcp通信,多线程实现的高级问题
基于socket的tcp通信服务器程序,该程序用于GPS车辆监控系统的数据传输。
定位信息传输通过udp实现,这个没问题。

现在设置,控制命令需要通过tcp通道来发送确保车台终端能正确,及时响应。

  s.Bind(ipe);
  s.Listen(5);
  while (true)
  {
  socket temp = s.Accept();
  ........
  }
s.Accept();在接受到车台终端的连接后会返回一个新的socket temp来建立与该车台的通信通道
我现在的思路是,为每一个新的连接socket temp,都开辟一个线程来维护该终端的数据收发。
但是,如果有50个终端同时连接就要创建50个线程,如果更多呢,这样应该会有问题吧。这个问题有什么好的解决
办法,。一般,同时几十个连接时是怎么进行维护的。

请知道朋友提供个设计思路。

还有个小问题,连接断开怎么进行判断。

------解决方案--------------------
异步就好了。
同步量一大是不现实的。
------解决方案--------------------
通信大全参考
------解决方案--------------------
如果有50个终端同时连接就要创建50个线程,如果更多呢,这样应该会有问题吧。这个问题有什么好的解决 
别说50,就是500也行,效率问题不用担心,普通的单核电脑都能抗上百的连接...
最好使用多线程模式,其他模式的,我还没有使用过,不好评价.
------解决方案--------------------
去看看IOCP的内容,这个是少量线程应付多连接
------解决方案--------------------
代码太简洁,有点不太明白
------解决方案--------------------
再弄个线程池。
------解决方案--------------------
同步的。数据收时创建,发完数据就销毁并不影响你连接啊?只处理并发数据
不知道这样能不能减少你的线程数。。。
------解决方案--------------------
探讨
引用:
如果有50个终端同时连接就要创建50个线程,如果更多呢,这样应该会有问题吧。这个问题有什么好的解决
别说50,就是500也行,效率问题不用担心,普通的单核电脑都能抗上百的连接...
最好使用多线程模式,其他模式的,我还没有使用过,不好评价.


如果真像你说的,没问题的话,我还是想用同步来做,毕竟异步有点小复杂,没太多时间研究。

现在又有个问题就是,在程序结构的设计上。
没一个连接对应一个线程,那么线程的过程函数(处理该连接通道上数据收发)是用一个,还是多少个连接就多少个(应该不会这样吧)。。
如果只有一个过程函数,怎么做到同步处理呢。

不知道我说明白没有。。这个问题很关键,希望得到解答!!!!

------解决方案--------------------
看需求是需要使用长连接
这样的话,一个连接过来理解为一个用户,这样需要队列来管理这些用户
每个用户可以进行收发数据,使用同步异步,各有千秋
同步对线程和数据收发超时控制起来方便些
异步编程容易。


------解决方案--------------------
最后一个问题,使用心跳包解决
客户端发送心跳,服务端检测,一定时间没有收到,则认为连接断掉,主动断开连接
------解决方案--------------------
如果担心线程数量太多,则可以通过提高硬件配置,比如使用8核的服务器,也不贵了,IBM都才1-2万多.
另外一个就是采用短连接方式,每个线程只接收一次消息处理,完成应答后就立即销毁.
------解决方案--------------------
学习了,不过我感觉楼主这种情况用异步还是比同步好
------解决方案--------------------
感觉还是同步比较适合楼主的应用
------解决方案--------------------
服务器端如果并发量大用c#是不合适的,用C++ Builder编写完成端口是好方法。
------解决方案--------------------
并几百个线程,没有问题,再多,就不好了,可以考虑一下,完成端口
------解决方案--------------------
只要代码写得质量还行,几十个线程对于现有主机来说,根本算不上什么大的压力
一般来说,只有达到上千个线程的规模,才会必须考虑使用线程池来提高性能,否则从编程简单化的角度来说,是可以开多个线程得