当前位置:主页>销售管理软件> 列表

TIdTcpServer的问题

销售管理软件版1楼: 我想用idtcpserver实现2个功能
1:记录所有登陆的客户端
2:可以从列表中选择特定的客户端,发送消息过去

有没有这样的例子,谁有的给贴点代码,谢谢

2楼: 客户列表都保存在
clist:tlist;
try
clist := IdTCPServer.Threads.LockList;
finally
IdTCPServer.Threads.UnlockList;
最好这样取客户线程信息,不然有时造成新的连接登不上,不知道是不是死锁的原因
每个客户有自己的ip:athread.Connection.Socket.Binding.PeerIP,你也可以在客户登陆的时候发个唯一的标识,在列表里面找到这个标识,对应相应的线程发消息。服装销售软件有哪些

3楼: 服务端能向客户端发信息么?这点一定要弄清楚……

4楼: 举例:
1.定义一个结构保存连接参数, 保存到线程的Data
TBSNetThreadParam = packed record //定义网络通信线程所需要的参数结构
eCommType : TBSThreadType; //协议类型(tcp/udp)
sRemoteIP : string[15]; //对方的ip地址
pThread : Pointer; //Pointer to thread
end;
PBSNetThreadParam = ^TBSNetThreadParam;
2.
procedure TBSCustomComm.TCPServerConnect(AThread: TIdPeerThread);
var
NewParam: PBSNetThreadParam;
begin
GetMem(NewParam, SizeOf(TBSNetThreadParam));
NewParam.eCommType := ttTCPServer;
NewParam.sRemoteIP := AThread.Connection.Socket.Binding.PeerIP;
NewParam.hMsgHandle := mMsgHandle;

NewParam.eWorkStatus := nsNormal;
NewParam.hThreadID := AThread.ThreadID;
NewParam.pThread := AThread;
AThread.Data:=TObject(NewParam);
try
FThreadList.LockList.Add(NewParam);
finally
FThreadList.UnlockList;
end;
//告诉Client,线程已启动
AThread.Connection.WriteLn(GStack.LocalAddress);
end;

procedure TBSCustomComm.TCPServerDisconnect(AThread: TIdPeerThread);
var
ActThreadParam: PBSNetThreadParam;
begin
ActThreadParam := PBSNetThreadParam(AThread.Data);
try
FThreadList.LockList.Remove(ActThreadParam);
finally
FThreadList.UnlockList;


end;
FreeMem(ActThreadParam);
AThread.Data := nil;
end;

5楼: http://www.js.lss.gov.cn:7001/jsyb/SIHis/Indy9Demos_26Oct04.zip

6楼: 去下一个 indy9 的 demo
里面的 IndyDemos\dTCPDemo 目录就是你想要的

销售管理软件版7楼: clientsocket 连到服务器上的时候serversocket会建立线程,每个线程的客户端用索引表示
要给第一个连接的客户发信息就是 serversocket.socket.connections[0].sendtext();
给第二个连接的客户就是serversocket.socket.connections[1].sendtext();

客户给服务器发信息就是ClientSocket1.Socket.SendText()
如果需要客户给客户发的话就需要服务器中转了,原理是将要发送的数据和对方IP一起发送给服务器,然后在服务器分离数据和IP,再将这个数据发给对方
随笔而谈,有错的地方请指出哈
经常加个LISTBOX组件,然后在ServerSocket上的ClientConnect事件写
Listbix1.Items.add(Socket.RemoteAddress)
在ClientDisConnect事件里写
Listbix1.Items.Delete(Listbox1.Items.IndexOf(Socket.RemoteAddress));

意思就是客户连接的把客户IP加到LISTBOX中,客户断开的时候把断开的客户的IP删掉
这样LISIBOX的索引就和connections[]的索引一样了

8楼: 是indy的

9楼: 揭帖

10楼: 多人接受答案了。