TcpServer/TcpClient控件(Delphi6.0)Server向Client发送消息的问题 ( 积分: 50 )

  • 主题发起人 主题发起人 okgxsh
  • 开始时间 开始时间
O

okgxsh

Unregistered / Unconfirmed
GUEST, unregistred user!
TcpServer/TcpClient控件(Delphi6.0)Server向Client发送消息的问题
首先声明:我看过了Delphi7自带的chat的例子,那里只有TcpClient向TcpServer发送消息的功能,没有Server向Client发送消息
//=====================================================
procedure TForm1.TcpServer1Accept(sender: TObject;
ClientSocket: TCustomIpClient);
var
s,s_Addr: string;
DataThread: TClientDataThread;
//=====================
S_Str:string;
I_S,I_Len:integer;
Addr:TSockAddr;
//=====================
begin
// create thread
DataThread:= TClientDataThread.Create(true);
// set the TagetList to the gui list that you
// with to synch with.
DataThread.TargetList := memRecv.lines;

// Load the Threads ListBuffer
DataThread.ListBuffer.Add('*** Connection Accepted ***');
DataThread.ListBuffer.Add('Remote Host: ' + ClientSocket.LookupHostName(ClientSocket.RemoteHost) +
' (' + ClientSocket.RemoteHost + ')');
DataThread.ListBuffer.Add('===== Begin message =====');
//=============================================================
s_Addr:=ClientSocket.RemoteHost;
DataThread.ListBuffer.Add('From : '+s_Addr);
//=============================================================
s := ClientSocket.Receiveln;

while s <> '' do
begin
DataThread.ListBuffer.Add(s);
s := ClientSocket.Receiveln;
end;
DataThread.ListBuffer.Add('===== End of message =====');
S_Str:='ok';
Addr:= ClientSocket.GetSocketAddr(ClientSocket.RemoteHost,ClientSocket.RemotePort);
//用这个给客户端Client发送信息 但是,TcpClient端无法接受到,事件触发不了******???
TcpServer1.SendTo(S_Str,Sizeof(S_Str), Addr);
DataThread.Resume;
end;
//=================================
//无法触发这个事件
procedure TForm1.TcpClient1Receive(Sender: TObject; Buf: PChar;
var DataLen: Integer);
var
SSS:string;
begin

TcpClient1.ReceiveBuf(Buf,DataLen) ;
SSS:=(Buf);
memRecv.Lines.Add('Rece RECE:'+sss)
end;

procedure TForm1.TcpClient1Send(Sender: TObject; Buf: PChar;
var DataLen: Integer);
var
SSS:string;
begin
SSS:=(Buf);
// TcpClient1.ReceiveBuf(SSS,DataLen) ;

memRecv.Lines.Add('Send RECE:'+sss)
end;
 
TcpServer/TcpClient控件(Delphi6.0)Server向Client发送消息的问题
首先声明:我看过了Delphi7自带的chat的例子,那里只有TcpClient向TcpServer发送消息的功能,没有Server向Client发送消息
//=====================================================
procedure TForm1.TcpServer1Accept(sender: TObject;
ClientSocket: TCustomIpClient);
var
s,s_Addr: string;
DataThread: TClientDataThread;
//=====================
S_Str:string;
I_S,I_Len:integer;
Addr:TSockAddr;
//=====================
begin
// create thread
DataThread:= TClientDataThread.Create(true);
// set the TagetList to the gui list that you
// with to synch with.
DataThread.TargetList := memRecv.lines;

// Load the Threads ListBuffer
DataThread.ListBuffer.Add('*** Connection Accepted ***');
DataThread.ListBuffer.Add('Remote Host: ' + ClientSocket.LookupHostName(ClientSocket.RemoteHost) +
' (' + ClientSocket.RemoteHost + ')');
DataThread.ListBuffer.Add('===== Begin message =====');
//=============================================================
s_Addr:=ClientSocket.RemoteHost;
DataThread.ListBuffer.Add('From : '+s_Addr);
//=============================================================
s := ClientSocket.Receiveln;

while s <> '' do
begin
DataThread.ListBuffer.Add(s);
s := ClientSocket.Receiveln;
end;
DataThread.ListBuffer.Add('===== End of message =====');
S_Str:='ok';
Addr:= ClientSocket.GetSocketAddr(ClientSocket.RemoteHost,ClientSocket.RemotePort);
//用这个给客户端Client发送信息 但是,TcpClient端无法接受到,事件触发不了******???
TcpServer1.SendTo(S_Str,Sizeof(S_Str), Addr);
DataThread.Resume;
end;
//=================================
//无法触发这个事件
procedure TForm1.TcpClient1Receive(Sender: TObject; Buf: PChar;
var DataLen: Integer);
var
SSS:string;
begin

TcpClient1.ReceiveBuf(Buf,DataLen) ;
SSS:=(Buf);
memRecv.Lines.Add('Rece RECE:'+sss)
end;

procedure TForm1.TcpClient1Send(Sender: TObject; Buf: PChar;
var DataLen: Integer);
var
SSS:string;
begin
SSS:=(Buf);
// TcpClient1.ReceiveBuf(SSS,DataLen) ;

memRecv.Lines.Add('Send RECE:'+sss)
end;
 
应该两台机器安装了D7 的NetChat 软件, 有对方IP 设Port 就可以了....
 
我也在注意这方面的东西, 不如你留下MSN 我们一起试一试 NetChat
 
TcpServer1.SendTo(S_Str,Sizeof(S_Str), Addr);

我想问题是否出自这里?应该找到连接客户端的镖识号,如
TcpServer1.Socket.Connections[RemoteTag].sendto(....);
 
两台机器当然没有问题了!我是说 我现在 无法用 TcpServer这个控件向TcpClient发送信息
 
我个人理解是:tcpclient必须连接到tcpserver,然后取出连接的socket
 
jamcky:
TcpServer1没有Socekt这个属性阿!我找了很长时间也找不到阿
 
jamcky:
我也是这样理解的阿,可是我找不到 怎么来写代码阿!
 
ClientSocket.SendTo(...)
 
ClientSocket.SendTo(...) 这个一样是不行的
 
没有用过Tcpserver,你试一试
Clientsocket.SendBuf(....) ??
 
Clientsocket.SendBuf(....) ??
这个也不行的!
 
服务器端使用AThread.connectThread.Connection.WriteLn('发送的消息');

客户端还需进行相应处理
正常情况下,客户端并不存在监听进程,所以服务器如何发送信息,客户亦收不到。这样就需在客户端程序建立一监听进程,以监听服务端发送过来的信息。
在interface节
TReceiveThread = class(TThread)
private
FMsg : String;
FForm : TfrmTcpClientMain;
procedure ShowMessage;
protected
procedure Execute; override;
public
constructor Create(F : TfrmTcpClientMain); reintroduce;
end;

implementation
{$R *.dfm}
////////////////////////////////////////////////////////////////////////////////
{ TReceiveThread 接收线程的创建}
constructor TReceiveThread.Create(F: TfrmTcpClientMain);
begin
FForm := F;
inherited Create(False);
end;

procedure TReceiveThread.Execute;
begin
while not Terminated do
begin
if FForm.TCPclient.Connected then
begin
FMsg := FForm.TCPclient.ReadLn(#10#10, 100);
if FMsg <> '' then
Synchronize(ShowMessage);
Sleep(100);
end;
end;
end;

procedure TReceiveThread.ShowMessage;
begin
FForm.memReceive.Lines.Add( Trim(FMsg) ) ;
end;

////////////////////////////////////////////////////////////////////////////////
在你的客户端程序中加入试试。。
 
AThread.connectThread.Connection.WriteLn
我找不到connectThread这个属性。
 
当客户端连接服务端时,在服务端监听属性
procedure TForm1.TCPserverConnect(AThread: TIdPeerThread);
可以自定义一数组或变量,记录连接上的客户端AThread。。
当要向客户端发送消息时,即可使用。。
 
server就好象数据库一样,主要是连接起不同的client,除非你发送失败,它才会反馈信息给你;其实你也可以在server所在的机器上开一个client程序啊,那样也可以和其他的client互相发消息的。
 
hxhx: 写了这个线程后 如何让系统激活它呢?我加上了,可是如何让运行呢?
 
send(POnlineinf(Onlines.Items).soc,buf[0],len,0);
 
觉得 tcpServer 和 tcpClient 太不好用了
serverSocket 和 clientScoket 这两个好用
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
810
import
I
S
回复
0
查看
928
SUNSTONE的Delphi笔记
S
后退
顶部