还是关于socket的问题 可能是很简单的 100分吧(100分)

  • 主题发起人 主题发起人 qiaohj
  • 开始时间 开始时间
Q

qiaohj

Unregistered / Unconfirmed
GUEST, unregistred user!
是有关于server.socket.ActiveThreads与server.socket.activeconnections的问题
从字面上讲activethreads与activeconnections前者是指当前活跃的线程,
而后者是总共连接的线程,那究竟有没有一个参数表示当前客户端是哪一个线程的属性呀?
具体应用于LAN聊天室,server端向某一个用户发信息,server.connections[x].sendtext
中的x究竟怎么得到呀?之前我看过有的回答说可由remoteaddress得到客户端ip,但是
我还是不能将onconnect中得到的ip与线程号联系起来呀?因为我不会得到线程号!
我写了一个测试的小程序,用来测试server.socket.ActiveThreads与
server.socket.activeconnections,得到的结果是,无论我有多少个客户端,server端
显示的server.socket.ActiveThreads始终是0,而server.socket.activeconnections
是正确的,是当前线程的数目(总共的数目),断开一个线程也是正常的,
server.socket.activeconnections减少1,但是,无论怎样,server.socket.ActiveThreads
始终是0,我真是没有办法了,delphi的帮助我也看了,它只是向一个线程发信息(connections[0])
究竟该怎么办呀?请各位大侠帮助!!!!!!
 
是呀,我也遇到了同样的问题。
关注
 
这好像跟serversocket的servertype有关
当servertyp=stnonblocking时,连接数用的activeconnections
当servertyp=stthreadblocking时,连接数用activethreads
 
jackfeng is right.
activethread 是用于阻塞方式的,采用线程工作方式。服务器创建多个线程,每个线程读自己的数据。没有数据就阻塞。你实现时必须
采用THREADSAFE的编程方式,也就是对临界资源要做PV操作拉。
activeconnection是用于非阻塞方式工作的。系统并没有创建多个线程。而只是多个SOCKET 连接。服务器还是只有一个线程工作。
如果做聊天室的话,我想用不着thread 工作方式。
至于connections如何与对端客户对应,我也没有好方法,我的解决方法是检查每个连接的remotehost,通过远端的主机名作为指针,去寻找
当前处理的连接在整个CONNECTIONS数组中的位置。当然用IP地址我想更好一些。但是在一个有管理员的LAN中,主机名反正也不会重复地拉!:)
 
另外,在采用THREAD方式,由于各线程管理各自的连接,你就不用管谁对应谁啦,主要的问题
还是在非阻塞方式下。
 
在ServerSocket的OnClientConnect中对传入的参数Socket,
保存信息到 Socket.Data ,这是一个指针,你可以创建你自己的结构记录类型
(record),
来保存信息,把指针保存到 Socket.Data 。
在socket关闭时(OnClientDisconnect)对传入的参数socket,
将 Socket.Data 指向的内存释放

 
qiaohj:如果你还要继续讨论请定期提前你的帖子,如果不想继续讨论请结束帖子。
 
多人接受答案了。
 
后退
顶部