用delphi中的socket控件怎样实现多客户的数据交流(急!!请各位高手帮忙!谢谢!) 用delphi中的socket控件怎样实现多客户的数据交流,要在服务器端发送数据到指定客户端! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 去indy主页下载 的DEMO 其中含有一chat目录下代码,估计是你要的.实例是一个主机,多个客户 serverSocket 有個 connections[i] 就可以分辨當前的每個用戶clientSocket 一次只能邊一個端口 TIdTCPServer 等的 Indy 服务控件都是多线程的。每个客户端 Connect 上来知道,都再服务端触发 OnConnect 事件,并产生一个线程对象(TThread 的继承类 TIdPeerThread)。如下面代码就可以得到客户端的 IP 地址。procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);begin ShowMessage(AThread.Connection.Socket.Binding.PeerIP);end;每个 TIdTCPServer 会通过 Threads 属性维护一个 TThreadList,可以通过如下代码给每个客户端发送数据。(可以通过客户的 IP、Port 进行直接区分,或用 Data 属性)procedure TForm1.Button1Click(Sender: TObject);var Index: Integer; Threads: TList;begin Threads := IdTCPServer1.Threads.LockList; for Index := 0 to Threads.Count - 1 do begin TIdPeerThread(Threads.Items[Index]).Connection.WriteLn('Send To ' + IntToStr(Index)); end; IdTCPServer1.Threads.UnlockList;end;要维持每个客户的连接,则必须定期发送数据来保持连接(如 3 分钟),可以从客户端发起也可以从服务端发起。由于 Indy 的客户端采用阻塞方式设计的,所最好采用客户端主动的应答方式进行编程。 请问 zhengcg(楚楚): “客户端主动的应答方式进行编程”,能不能举个例! (等会给分,谢谢各位的帮忙。) 意思就是从客户发送出一个命令如:IdTCPClient1.SendCmd('search myname');这个函数就会等待服务起的应答的(或超时),接着就可以用类似:IdTCPClient1.ReadLn();去读取应答了,IdTCPClient 没有比较好的事件通知机制的(就是等待服务器主动发送这种方式)。Web Client 的编程思想都是这样的,只是 Client 端是多线程而已。如果全部是文本的传送,或许你可以看看这个 TIdIRC、TIdIRCServer(一套基于TCP的聊天室协议),他们有很多附带功能,但是你可以不用,可以很方便。 程序客户端连不上服务器 如何用DELPHI抓取JSP网页数据?我是新手. 简单的问题:如何修改记录中某个字段的值? 如何强行终止程序? 请问如何在listbox上快速找到匹配项? 请问怎样使DBGRID奇数行和偶数行显示不同的颜色?请给出源代码!!!!!急..... 麻烦各位看看,这样的问题怎样解决 怎样让程序运行,但在进程中不显示! Mastering Delphi 6 有中文版的吗 很菜的问题,大家帮忙看看 frReport的主从表问题,解决了有300分奉上。 班主请进,关于ado多表更新问题。 急..................
clientSocket 一次只能邊一個端口
如下面代码就可以得到客户端的 IP 地址。
procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
begin
ShowMessage(AThread.Connection.Socket.Binding.PeerIP);
end;每个 TIdTCPServer 会通过 Threads 属性维护一个 TThreadList,可以通过如下代码给每个客户端发送数据。(可以通过客户的 IP、Port 进行直接区分,或用 Data 属性)
procedure TForm1.Button1Click(Sender: TObject);
var
Index: Integer;
Threads: TList;
begin
Threads := IdTCPServer1.Threads.LockList;
for Index := 0 to Threads.Count - 1 do
begin
TIdPeerThread(Threads.Items[Index]).Connection.WriteLn('Send To ' + IntToStr(Index));
end;
IdTCPServer1.Threads.UnlockList;
end;要维持每个客户的连接,则必须定期发送数据来保持连接(如 3 分钟),可以从客户端发起也可以从服务端发起。
由于 Indy 的客户端采用阻塞方式设计的,所最好采用客户端主动的应答方式进行编程。
IdTCPClient1.SendCmd('search myname');
这个函数就会等待服务起的应答的(或超时),接着就可以用类似:
IdTCPClient1.ReadLn();
去读取应答了,IdTCPClient 没有比较好的事件通知机制的(就是等待服务器主动发送这种方式)。Web Client 的编程思想都是这样的,只是 Client 端是多线程而已。如果全部是文本的传送,或许你可以看看这个 TIdIRC、TIdIRCServer(一套基于TCP的聊天室协议),他们有很多附带功能,但是你可以不用,可以很方便。