关于socket.onReceive的菜菜问题(50分)

  • 主题发起人 主题发起人 iceiceberg
  • 开始时间 开始时间
I

iceiceberg

Unregistered / Unconfirmed
GUEST, unregistred user!
我刚刚接触socket编程,最近想编个小例子试试,没想到就遇到了麻烦:我用tcpClient和tcpServer各建了一个程序,想互发消息。用
procedure Tserver.TcpServer1Accept(Sender: TObject;
ClientSocket: TCustomIpClient);
begin
while label1.caption<>'' do
label1.caption :=ClientSocket.Receiveln();
end;
可以收到Client发出的消息。
但当我在上一事件中用clientSocket.sendLn('ok')时,在Client的OnReceive却无法被触发。还有用udpSocket也是如此。为什么呢?
还有:
procedure Tclient.TcpClient1Receive(Sender: TObject; Buf: PAnsiChar;var DataLen: Integer);
中的Buf是什么意思呢?可以把它直接当作string来显示吗?
 
Client端的OnReceive确实没有事件触发。所以建议写个Timer来收(Indy的Demo也是这么处理,Delphi6有Indy的Demo,D7没有)

 
那么开个线程,里面用
while true do
s:=tcpClient1.ReceiveLn();
行吗?
 
不过这个事件竟然不能被触发??
这也太奇怪了吧?
 
什么事件没有被触发?
说清楚一点!
 
TcpClient.OnReceive 事件呀,您不是这个意思吗?
》Client端的OnReceive确实没有事件触发。
 
对!不像ClientSocket和serverSocket
有数据收到时有OnRead事件触发!
 
我刚才试了一下,原来这个事件是在你主动使用:receiveData后才触发的。原来是这样
 
那你什么时候把你的代码发给我看看!
一起学习一下!
 
其实也没什么,就是用了个
while true do
s:=tcpClient1.ReceiveLn();
就发现onReceive被触发了。
我现在在试着把上边的句子加到线程里,不知道行不行。有问题还请多多指教
 
接受答案了.
 
unit1如下:
procedure TForm1.TcpServer1Accept(Sender: TObject;
ClientSocket: TCustomIpClient);
begin
showMessage('connected');
label1.Caption:=ClientSocket.receiveln();
MyListen:=TSerListen.create(ClientSocket) ;//开线程
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
tcpClient1.active:=true;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
TcpClient1.Sendln('hello');
end;

unit2如下:
type
TSerListen = class(TThread)
private
cs:TCustomIpClient;
protected
procedure Execute; override;
procedure main1;
public
constructor create(tcs:TCustomIpClient);

end;


implementation

uses unit1;
{ TSerListen }

constructor TserListen.create(tcs:TCustomIpClient);
begin
cs:=tcs;
FreeOnTerminate:=true;
inherited create(false);
end;

procedure TSerListen.Execute;
Synchronize(main1);
end;

procedure TserListen.main1();
var
s:string;
i:integer;
begin
while true do
begin
s:=cs.receiveln();
if s<>'' then unit1.Form1.Label1.Caption :=s ;
end;
end;
一在unit1中用send就不行,有异常.唉
 
unit1:
procedure TForm1.TcpServer1Accept(Sender: TObject;
ClientSocket: TCustomIpClient);
begin
showMessage('connected');
label1.Caption:=ClientSocket.receiveln();
MyListen:=TSerListen.create(ClientSocket) ;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
tcpClient1.active:=true;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
TcpClient1.Sendln('hello');
end;

unit2:
constructor TserListen.create(tcs:TCustomIpClient);
begin
cs:=tcs;
FreeOnTerminate:=true;
inherited create(false);
end;

procedure TSerListen.Execute;
begin
Synchronize(main1);
end;

procedure TserListen.main1();
var
s:string;
i:integer;
begin
while true do
begin
s:=cs.receiveln();
if s<>'' then unit1.Form1.Label1.Caption :=s ;
end;
end;

 
后退
顶部