关于ServerSocket与ClientSocket事件先后问题,请指教!(100分)

  • 主题发起人 fancy105
  • 开始时间
F

fancy105

Unregistered / Unconfirmed
GUEST, unregistred user!
我想在客户端连接服务端时,发出一个字段(包括用户信息和密码),在得到服务器
允许时才建立连接,否则拒绝连接。但不知道它们的事件发生的先后顺序和是否可以
收发信息,以下是我的想法,不知道对不对:
Client.OnConnecting 不能收发
Server.OnAccept 能收发
Client.OnConnect 能收发
Server.OnClientConnect 能收发
但不知道具体在哪个事件发出信息,哪个事件接收信息并且作出判断?[:)]
 
X

xzh2000

Unregistered / Unconfirmed
GUEST, unregistred user!
看来你得找本TCP/IP的书来看,TCP/IP的握手机制,
没法把图形弄上来。
 
Z

zw84611

Unregistered / Unconfirmed
GUEST, unregistred user!
顺序我觉得是对的。但收发消息(指用户数据,而非用于建立TCP连接的控制消息)要在TCP
连接建立之后。即在Connect完成之后。

TCP有所谓的“三次握手”,TCP/IP的书上一般都会有。
 
F

fancy105

Unregistered / Unconfirmed
GUEST, unregistred user!
在Socket.Connections的对应上,存在一个算法问题:
Q:怎么知道哪个Connections对应哪个客户端(客户端以用户ID标识)?
A1.在Socket.Connections.Data上加入对应客户端的用户ID,在Server发信息给
Client时,顺序遍历Socket.Connections,直到Socket.Connections.Data=
用户ID;
A2.另外建立一个二维表,保存用户ID及对应的Socket.Connections.Handle,在发
信息时,先找到用户ID,再在二维表中找到对应的Handle,再遍历Socket.Connections
直至找到对应的Socket.Connections.Handle;
A3.还是建立一个额外的二维表,用来保存用户ID和Socket.Connections中的i,在
发信息时,找到对应的用户ID,则直接用对应的i访问Socket.Connections就可
以了。
Q2.不过问题就是,有Client断开时,所对应的i也就变了,要重新设置i:
A31.在断开一个Socket.Connections时,其后面的向前推,即i-1;
A32.若Socket.Connections中的i是无序的,则A31就错了,那只好再遍历Socket
.Connections,重新设置二维表中的i值。

以上是本人设想的算法,请各位给点意见,哪个算法好或有更好的算法?
 
4

41426277

Unregistered / Unconfirmed
GUEST, unregistred user!
if ServerSocket1.Socket.ActiveConnections>0 then
for i:=0 to ServerSocket1.Socket.ActiveConnections-1 do
if ServerSocket1.Socket.Connections.RemoteHost='我的电脑' then///是否有连接的电脑名
////////////ServerSocket1.Socket.Connections.RemoteAddress;///也可以用是否有连接的IP
begin
ServerSocket1.Socket.Connections.SendText('信息');
break;
end;
//////////////////////////////
马上响应的断开事件
procedure tform1.ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
showmessage('有电脑:'+socket.RemoteHost+'断开');
end;
 
F

fancy105

Unregistered / Unconfirmed
GUEST, unregistred user!
在ServerSocket.OnClientConnect中,新增一个连接,则在数据表中新增一笔记录,
并且,Socket.Data:=Table1.GetBookmark;
而在ServerSocket.OnClientDisConnect中, 用for循环将整个数据表这样比较:
if Table1.GetBookmark=Socket.Data then
去不成立!查看得知,Table1.GetBookmark没有值,而Socket.Data则有值?
怎么办?
 
F

fancy105

Unregistered / Unconfirmed
GUEST, unregistred user!
多人接受答案了。
 
顶部