多线程中创建客户端socket以及该线程中socket等待超时问题(300)

  • 主题发起人 主题发起人 arundong
  • 开始时间 开始时间
A

arundong

Unregistered / Unconfirmed
GUEST, unregistred user!
目前需要同时与1000个ServerSocket通讯,因此需要采用多线程创建1000个ClientSocket,由Client端发送命令,等待Server端返回,并判断返回超时。怎么线程中控制ClientSocket和时钟?如果能解决另有高分奉送。
 
想问你等待Server端返回时间是多少?一千个线程,每个线程控制一个ClientSocket与一个ServerSocket通讯,一个线程CPU时间片切换在WINDOWS中是几十ms。你这样的通讯适合吗?估计你的通讯方案有问题。
 
等待Server端返回时间是3秒,如果没有返回,就发下一条指令。这个方案是用于监控系统,被监控的IP地址和端口是固定的。需要对被监控设备进行实时通讯。
 
每个线程等待的延时方法中要频繁把资源释放出来,这样每个线程才能获取CPU,并且每个线程中的通讯数据不能多。
 
哈哈,别人一个系统上就只能运行你一个程序的,端口都被你占完了。。。[:D][:D][:D][:D]
 
可以分几个机器,不一定放一台机器上。
 
难道Delphi的高手都转向其他开发语言了???
 
依然没有人来帮忙解决?
 
一个ClientSocket一个线程是愚蠢的。你的问题太泛泛而谈了。线程中控制ClientSocket你应该去查VCL的手册。超时问题,给你2种办法。1. 把ClientSocket设置成non-blocking模式。发送数据后Sleep超时值,然后recv。如果服务端没有返回。那么recv会得到错误值WSAEWOULDBLOCK。2.blocking模式。发送数据后调用select,等待一定时间看是否有数据可读。ClientSocket不熟。用api的话可以帮帮你。
 
这是什么应用呀,要1000个线程来做?虽然你可以分多台计算机来运行,但这种设计的应用还是相当少的,主要是从设计角度来看不合理,要我看顶多就是用个线程池。把socket设置为非阻塞模式,用Timer或线程定时循环检查,具体的判断逻辑在检查的过程中写就可以实现了。
 
晕,再简单不过啊,以时间换广度。用一队列对1000个任务作排队,搞16—64个线程作任务处理即可。学校里的数据结构不知你怎么学的,1000个线程都搞出来了!嘿嘿。
 
估计是我没说清除:有1000个设备分别安装在1000个不同地方,设备上安装有硬件封装的Server端,地址和端口都写入硬件(别人的设备);软件安装在中心机房,软件必须与这些设备保持长连接,并实时从设备上获取数据。这样的情况,请问如何处置?
 
1.如果是采用TClientSocket,多线程并不会起到实际的作用,它的事件还是在主线程里触发的,但是,调用它的OPEN方法是阻塞的,所以,才有人萌发了用多线程处理的想法2.对于长连接的TCP通信的设备,可靠的连接检测方法是心跳协议,而不是经常地断开重连,请检查一下设备的说明这个软件的设计,建议采用这样的方式:1、采用单线程,降低软件的实现难度,实现以后再找问题,比如连接时造成界面失去响应2、采用简单的办法解决问题,如在时钟里分批连接、修改SocketOption自定义连接超时、发送超时等,可以参考 http://www.delphibbs.com/keylife/iblog.asp?author=wu_yanan2003,注意setsockopt应该放在ClientSocket1Lookup事件里3、如果仍然不满意,想采用多线程,那就彻底放弃TClientSocket,采用其他的组件,这期间又会有更多的组件问题,想清清楚楚明明白白自主控制,那就用API吧
 
[red]在百度搜索下:暗组远控1.5源码它的远控Server是用API写的.建议楼主下载了分析分析.如找不到请联系我,QQ:123292295[/red]
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部