tcpclient和tcpserver的通信(50分)

  • 主题发起人 主题发起人 小芽儿
  • 开始时间 开始时间

小芽儿

Unregistered / Unconfirmed
GUEST, unregistred user!
虽然看了很多对这两个控件的讨论,
但我还是不明白tcpclient如何从tcpserver接收数据,
反之tcpserver如何向tcpclient发送数据,
该如何设置他们的那些属性或是触发什么事件?
是否还必须用线程实现?
另外,它们和indy的tcpclient、tcpserver控件的用途有什么区别吗?
希望高手不吝赐教,有实例最好
 
必须用线程;
1. tcpclient从tcpserver接收数据:

TReceiveThread = class(TThread)
private
FMsg: string;
protected
procedure Execute; override;
end;

var
FThread: TReceiveThread;
procedure TReceiveThread.Execute;
begin
while not Terminated do
begin
if Form1.IdTCPClient1.Connected then
begin
FMsg := Form1.IdTCPClient1.ReadLn;
Sleep(100);
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FThread := TReceiveThread.Create(False);
IdTCPClient1.Host := Edit1.Text;
IdTCPClient1.Port := 10001;
if not IdTCPClient1.Connected then
IdTCPClient1.Connect;
end;

2. tcpserver向tcpclient发送数据
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
i : Integer;
AThread : TIdPeerThread;
begin
try
with IdTCPServer1.Threads.LockList do
for I := 0 to Count - 1 do
begin
AThread := Items;
if AThread.Connection.Socket.Binding.PeerIP = 'hostname' then
AThread.Connection.WriteLn(s);
end;
finally
IdTCPServer1.Threads.UnlockList;
end;
end;

 
client 能不能向server发送数据呢
 
tcpclient发送请直接IdTCPClient1.WriteLn()
 
楼上,neng能写一段client端发送,服务端接受的程序吗,给我看看,我快疯了
 
uses 中要+点什么啊,编译通不过阿
 
设置
IdTCPServer1.DefaultPort := 10001;
IdTCPServer1.Active := True;

IdTCPClient1.Host := '服务端地址'
IdTCPClient1.Port := 10001;
if not IdTCPClient1.Connected then
IdTCPClient1.Connect

1. 客户端发送:
procedure TForm1.Button1Click(Sender: TObject);
begin
IdTCPClient1.WriteLn('ok');
end;

2. 服务端接收:
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
s: string;
begin
s := AThread.Connection.ReadLn;
end;


3.. 客户端接收数据:(用线程;)

TReceiveThread = class(TThread)
private
FMsg: string;
protected
procedure Execute; override;
end;

var
FThread: TReceiveThread;
procedure TReceiveThread.Execute;
begin
while not Terminated do
begin
if Form1.IdTCPClient1.Connected then
begin
FMsg := Form1.IdTCPClient1.ReadLn;
Sleep(100);
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FThread := TReceiveThread.Create(False);
IdTCPClient1.Host := Edit1.Text;
IdTCPClient1.Port := 10001;
if not IdTCPClient1.Connected then
IdTCPClient1.Connect;
end;

2. 服务端发送数据
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
i : Integer;
AThread : TIdPeerThread;
begin
try
with IdTCPServer1.Threads.LockList do
for I := 0 to Count - 1 do
begin
AThread := Items;
if AThread.Connection.Socket.Binding.PeerIP = 'hostname' then
AThread.Connection.WriteLn(s);
end;
finally
IdTCPServer1.Threads.UnlockList;
end;
end;

 
idtcpclient和tcpclient 在这里有什么用法上的区别吗
 
idtcpclient和tcpclient是一个控件
 
告诉我EMAIL发你一份
 
恩,谢谢先;。
lei1214@163.com
 
tcpclient tcpserver和 idtcpclient idtcpserver不是同一个控件,再D7中,
他们分属在不同的模板(intenet,indy client,indy server),也有着不同的属性、方法和事件。
另外,intenet的tcpserver在接收数据是自动建立线程触发onAccept事件,因此必须要在此事件建立一个线程,可参考demo中的netchat例子。
我的主要问题就是intenet面板上的tcpclient和tcpserver之间相互通信的问题。
非常感谢gyh75,我希望大家继续关注此问题,谢谢!
我的油箱:xlp1112@163.com
 
同意小芽儿,
我搞错了。tcpclient tcpserver和 idtcpclient idtcpserver不是同一个控件
 
太棒了!我也正想问这个问题
帮助中讲 TTcpServer 的事件中也有 OnReceive 和 OnSend 的,但在 Object Inspector 里并没有这些事件,那么如何在收发数据的时候触发相应事件?
demo中netchat的例子是让 TTcpServer 响应 OnAccept 事件,但 OnAccept 事件响应的是TTcpClient 的连接请求,是的这样吧?
所以每当随机收发数据时,不能总让 TTcpServer 响应 OnAccept 事件吧? ^_^
请大家讨论啊,谢谢!
我的邮箱 register_bx@163.com
 
这个问题希望大家能够给予关注。
 
1.阻塞模式编程建议用INDY的IDTCPCLIENT IDTCPSERVER
2.非阻塞模式建议用D6中的CLIENTSOCKET SERVERSOCKET,D7中可以通过 COMPONENT->
INSTALL PACKAGES->add->DELPH7/BIN/DCLSOCKETS70.BPL来添加。
3。TCPCLIENT,TCPSERVER在D7中的DEMOS是用的阻塞模式,当客户端连接后建立了线程来处理和客户端的通讯问题。BLOCKMODE:=BMTHREADBLOCKING;
4。TCPCLIENT,TCPSERVER也可以工作在非阻塞模式,BLOCKMODE:=BMNOBLOCKING;这样就象CLIENTSOCKET SERVERSOCKET了,但是TCPCLIENT 可以象CLIENTSOCKET一样又ONREAD,ONWRITE,而TCPSERVER确没有看到象SERVERSOCKET那样的ONCLIENTREAD,ONCLIENTREAD.
5.查看TCPSERVER的源代码,发现他和TCPCLIENT一样最终是继承于TBaseSocket的,那么应该也可以有ONREAD,ONWRITE。
6。如果我们象TCPCLIENT那样作个procedure TcpServerReceive(Sender: TObject; Buf: PAnsiChar; var DataLen: Integer),你面写处理代码,然后TCPSERVER1.OnReceive:=TcpServerReceive; OnSend也如此类推,应该就可以了。
7。这个方法没有测试,但原理是这样的,只不过TCPSERVER的OnReceive,OnSend在设计时看不到而已,不等于他没有。
 
后退
顶部