关于ServerSocket的问题(100分)

  • 主题发起人 主题发起人 winvxd
  • 开始时间 开始时间
W

winvxd

Unregistered / Unconfirmed
GUEST, unregistred user!
我用ServerSocket写了一个服务器端的程序,假如现在有
10个Client与此ServerSocket连接,如果我想在Server端
断开(比如说是202.101.10.123)一个与服务器端的连接
请问在Server端是怎么实现的?
 
faint
papaya 什么都问,难怪没人回答.
find
 
winvxd:如果你还要继续讨论请定期提前你的帖子,如果不想继续讨论请结束帖子。
 
我来灌:
当你想断开的时候server端什么也不会实现.
//因为这只是一个构思,还没成为事实嘛~_*

BTW:不明白你的意思,断开和IP有什么关系?干嘛要比如?
 
当有10个连接时,serverSocket.socket.activeConnections=10,
同时在连接时,有serverSocket.socket.Connections属性
对应每个连接(i=1 or ..10)。
断开时,只要将serverSocket.socket.Connections.close
即可。
 
同意hxg,用socket.Connections.close关闭
 
关键是我想知道这个i的值:
如果有一个客户端发来一段文本,怎样可以方便地得到这个connections中的i的值?
 
>>关键是我想知道这个i的值:
是winvxd人么?
既然收到客户端数据,干嘛还要找I?直接到Socket得了。

for I:=0 to ServerSocket1.Socket.ActiveConnections-1 do
if Socket.Handle=ServerSocket1.Socket.Connections.Handle then
//得到i。
 
我有一个办法:
ServerSocket1.Socket.Connections[n]中的n是系统自动维护的,
也就是说,当客户端连接时自动在Connections中增加一个,当断开时自动减少一个,
那么问题的关键就是具体是哪一个n?因此我利用一个TStringList与Connections同步:
(1)当客户端连接时,在OnConnect事件中向TStringList中添加一个客户端的IP地址,
那么添加的TStringList的Index刚好与Connections中的n相对应;
(2)当客户端断开时,在OnDisConnect事件中从TStringList中删除一个客户端的IP地址,
也就去掉了Connections中的对应的n
(3)这样只要知道客户端的IP地址(可用Socket.RemoteAddress获知),就可以用
ID:=ClientList.IndexOf(Socket.RemoteAddress)获知该Connections的n
(4)用ServerSocket1.Socket.Connections[ID]调用所需的Socket的所有方法、属性了!

这个方法已经通过实验(五个客户端),的确可行!

大家认为这样有何不妥?请指正!谢谢!
 
我同意shangcm的办法。
TList的Indexof方法同SeverSocket.socket.Connections
正好匹配,都是指向一个数组的位置。当新增加一个连接时,i:=i+1,
新增的连接添加到activeConnections数组的最后,Tlist的Indexof
也增加1。Connections数组项(对应TList的Indexof)由0到i;当断开
一个连接时(无论i=0 or 最后一个[i=ActiveConnections-1],or 中间的
某个连接[0<i<ActiveConnections-1]),数组项的位置(index)将按原顺序
自动重排。当选择Tlist的某一项时,得到其i=indexof的值,其对应的连
接就是Connections
知道了这个原理后,也可以通过其它办法来实现。
我最近做一套C/S系统,涉及对在线用户的监控问题,用以上的办法只能在
服务器端实现。现在我要实现服务安装在服务器端,监控允许安装在一个
客户端。显然服务器的TList的内容从服务端实时传递的客户端较难实现,
因此用数据表(Sql server)代替TList,其中每次登陆的ID为标识,整数
型,自动增加1,在使用前清空数据。通过AdoQuery查询该表,由于AdoQuery
.recordcount对应Tlist.cout和Socket.ActivesConnections,所以完全可以
实现同样的功能,实践证明也是可行的。
 
如果知道ip,可以使用
for I:=0 to ServerSocket1.Socket.ActiveConnections-1 do
if ServerSocket1.Socket.Connections.remoteaddress='x.x.x.x' then
 
1,几位老兄都只用IP,如果同一个IP有多个连接呢?
所以要这样做就必须比较IP+Port.
2,Indexof也是用循环实现的,如果有其他需要,用数据库,只用个TStringList记录IP似乎完全没有必要嘛。
 
为什么只传来一半?
我同意shangcm的办法。
TList的Indexof方法同SeverSocket.socket.Connections正好匹配,都是指向一个
数组的位置。当新增加一个连接时,i:=i+1,新增的连接添加到activeConnections
数组的最后,Tlist的Indexof也增加1。Connections数组项(对应TList的Indexof)
由0到i;当断开一个连接时(无论i=0 or 最后一个[i=ActiveConnections-1],or 中
间的某个连接[0<i<ActiveConnections-1]),数组项的位置(index)将按原顺序自动重排。
当选择Tlist的某一项时,得到其i=indexof的值,其对应的连接就是Connections

知道了这个原理后,也可以通过其它办法来实现。我最近做一套C/S系统,涉及对
在线用户的监控问题,用以上的办法只能在服务器端实现。现在我要实现服务安装在
服务器端,监控允许安装在一个客户端。显然服务器的TList的内容从服务端实时传递
的客户端较难实现,因此用数据表(Sql server)代替TList,其中每次登陆的ID为标
识,整数型,自动增加1,在使用前清空数据。通过AdoQuery查询该表,由于AdoQuery
.recordcount对应Tlist.cout和Socket.ActivesConnections,AdoQuery.RecNo对应
TList.indexof和Socket.Connection,所以完全可以实现同样的功能,实践证明也是
可行的。
 
为什么只传来一半?有没有字节限制?
(1)TList的Indexof方法同SeverSocket.socket.Connections正好匹配,都是指向一个
数组的位置。当新增加一个连接时,i:=i+1,新增的连接添加到activeConnections
数组的最后,Tlist的Indexof也增加1。Connections数组项(对应TList的Indexof)
由0到i;当断开一个连接时(无论i=0 or 最后一个[i=ActiveConnections-1],or 中间
的某个连接[0<i<ActiveConnections-1]),数组项的位置(index)将按原顺序自动重排。
当选择Tlist的某一项时,得到其i=indexof的值,其对应的连接就是Connections
知道了这个原理后,也可以通过其它办法来实现。
 
为什么只传来一半?
TList的Indexof方法同SeverSocket.socket.Connections正好匹配,都是指向一个
数组的位置。当新增加一个连接时,i:=i+1,新增的连接添加到activeConnections
数组的最后,Tlist的Indexof也增加1。Connections数组项(对应TList的Indexof)
由0到i;当断开一个连接时(无论i=0 or 最后一个,or 中间的某个连接,数组项的位置
(index)将按原顺序自动重排。当选择Tlist的某一项时,得到其i=indexof的值,其对应
的连接就是Connections
知道了这个原理后,也可以通过其它办法来实现。
我最近做一套C/S系统,涉及对在线用户的监控问题,用以上的办法只能在服务器端实现。
现在我要实现服务安装在服务器端,监控允许安装在一个客户端。显然服务器的TList的
内容从服务端实时传递的客户端较难实现,因此用数据表(Sql server)代替TList,其
中每次登陆的ID为标识,整数型,自动增加1,在使用前清空数据。通过AdoQuery查询该
表,由于AdoQuery.recordcount对应Tlist.cout和Socket.ActivesConnections,AdoQuery
.RecNo对应TList.indexof和Socket.Connection,所以完全可以实现同样的功能,实践
证明也是可行的。
 
多人接受答案了。
 
后退
顶部