服务器端如何放弃了一个已建立的连接--SOCKET?(50分)

  • 主题发起人 主题发起人 solonet
  • 开始时间 开始时间
S

solonet

Unregistered / Unconfirmed
GUEST, unregistred user!
[:)][red][/red]DELPHI6做一个TCP/IP主客户端程序(用TSERVERSOCKET/Tclentsocket),服务器端如何放弃了一个已建立的连接--SOCKET?
就好像QQ通信软件一样,如果有人不可知道中断,那么,它下一次还会上来,这时你要先删除原来的的列表,对不对?
 
你要用的协议是什么?TCP,还是UDP?
QQ用的是UDP,协议不同处理也不一样
 
我用的是TCP/IP协义。
 
谁能帮忙?
 
高手哪里去了。[:)]
 
在socket连接中,一个客户端可能频繁多次连接相同的服务器,造成serversocket的资源占用,且连接无法释放,一个方法是判断serversocket.connections.actived属性,使用
tserversocket.connections.close 强制关闭连接
一个是在客户端再次连接时扫描serversocket连接,关闭此前存在的相同IP和端口的连接
还有就是在serversocket.onerror事件中,添加:socket.close; errorcode:=0,但此事件并不一定都能够检测到clientsocket端的socket断开事件:)
 
tserversocket.connections.close
请问这个 i在这里是从哪取值?
 
i 是从座位号
listview1.selete.index
中取来的吗?

因为我用listview1 控件

 
>>>>好像QQ通信软件一样,如果有人不可知道中断,那么,它下一次还会上来,这时你要先删除原来的的列表
不用删除呀,找到客户机标识,更新一下就可以了。
老是删除,影响处理速度
 
用个列表保存客户端的一个唯一标识,登陆时先从列表中查找,
找到就更新一个连接的HANDLE
找不到就增加这个标识
客户正常退出时应发送一个退出信息给服务器端,服务器端从列表中删除这个标识,并释放相应的HANDLE。
 
我采用的是非阻塞方式。
我想问的是:serversocket.socket.connection 是由serversocket 自己来维护的吗?
也就是说,I 的值是从0 到 正常连接的数目减1,对不对?还有,在server端我要如何主动
释放一个socket连接,是不是 serversocket.socket.connections.close ; ?如果是的
话,那我要如何把它和listview1.items.item 对应起来呢?
还有,我在和其它GPRS 子站通信时,要如何换另一个SOCKET,是不是用:
ServerSocket1.Socket.Connect(i);也就是先和另一个线程连接上后再进行通信?
 
[h2][blue]如果一分钟都还收不到某客户的数据包,服务端关掉此连接,就是那个 i,并且从已连接的客户中剔除她。[/blue][/h2]
 
回:金卡绣球jk8.com,

我要如何BU 捉那个I 呢?
 
根据服务器所允许的连接数量,用列表记录这些连接信息。
在有连接退出时,不用删除,将列表中的该项置为空就可以了,有新连接上来,先找到第一次列表中为空的位置,更新一下就行。
频繁的删除、释放,有时会导致内存释放不完全的情况,故干脆不要删除。
这对系统的稳定有好处
 
用一个Timer一分钟定时,事件里判断这些包的上一次时间,....

我说的是关掉连接、剔除客户列表,
并不是删除控件,怎么会不稳定哦。
哈哈
 
还有,我要如何去捕捉一个错误的消息。是关于删除 listview1的项目时的错误消息。
 
COME ON AND HELP ME
 
如何捕捉listview1的错误信息?当我选择一个不存在的项目时:

try
int_index:=listview1.Selected.index; //选择列表中的项目号;
except
on E:Elisterror do ShowMessage(E.Message)
end;

这样对吗?
但是为什么捕捉不到它的错误消息?
 
后退
顶部