我都是按经典教材上说的来做的,可是为什么我做出来的聊天工具只能通过本机测试,却不能和其它机子聊天呢,哪位达人来指点一下下啊!!代码如下:
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Sockets;type
TForm1 = class(TForm)
TcpClient1: TTcpClient;
TcpServer1: TTcpServer;
edtremotehost: TEdit;
edtremoteport: TEdit;
edtlocalport: TEdit;
btnactivateserver: TButton;
btnsend: TButton;
Memrecv: TMemo;
memsend: TMemo;
procedure tcpserver1accept(sender: tobject;clientsocket: tcustomipclient);
procedure btnsendClick(Sender: TObject);
procedure btnactivateserverClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end; tclientdatathread=class(tthread)
private
public
listbuffer:tstringlist;
targetlist:tstrings;
procedure synchadddatatocontrol;
constructor create(createsuspended:boolean);
procedure execute;override;
procedure terminate;
end;var
Form1: TForm1;implementation{$R *.dfm}
constructor tclientdatathread.create(createsuspended:boolean);
begin
inherited create(createsuspended);
freeonterminate:=true;
listbuffer:=tstringlist.Create;
end;procedure tclientdatathread.terminate;
begin
listbuffer.Free;
inherited;
end;procedure tclientdatathread.execute;
begin
synchronize(synchadddatatocontrol);
end;procedure tclientdatathread.synchadddatatocontrol;
begin
targetlist.AddStrings(listbuffer);
end;procedure TForm1.btnactivateserverClick(Sender: TObject);
begin
tcpserver1.LocalPort:=edtlocalport.Text;
tcpserver1.Active:=true;
end;procedure TForm1.btnsendClick(Sender: TObject);
var
l:integer;
begin
tcpclient1.RemoteHost:=edtremotehost.Text;
tcpclient1.RemotePort:=edtremoteport.Text;
try
if tcpclient1.Connect then
for l:=0 to memsend.Lines.Count-1 do
begin
tcpclient1.Sendln(memsend.Lines[l]);
tcpserver1.Open;
end;
finally
tcpclient1.Disconnect;
end;
end;procedure tform1.tcpserver1accept(sender: tobject;clientsocket: tcustomipclient);
var
s:string;
datathread:tclientdatathread;
begin
datathread:=tclientdatathread.create(true);
datathread.targetlist:=memrecv.Lines;
datathread.listbuffer.Add('***connection accepted***');
datathread.listbuffer.Add('remote host: '+clientsocket.LookupHostName(clientsocket.RemoteHost)+'('+clientsocket.RemoteHost+')');
datathread.listbuffer.Add('=====begin message=====');
s:=clientsocket.Receiveln;
while s<>'' do
begin
datathread.listbuffer.Add(s);
s:=clientsocket.Receiveln;
end;
datathread.listbuffer.Add('===== end of message =====');
datathread.Resume;
end;
end.
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Sockets;type
TForm1 = class(TForm)
TcpClient1: TTcpClient;
TcpServer1: TTcpServer;
edtremotehost: TEdit;
edtremoteport: TEdit;
edtlocalport: TEdit;
btnactivateserver: TButton;
btnsend: TButton;
Memrecv: TMemo;
memsend: TMemo;
procedure tcpserver1accept(sender: tobject;clientsocket: tcustomipclient);
procedure btnsendClick(Sender: TObject);
procedure btnactivateserverClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end; tclientdatathread=class(tthread)
private
public
listbuffer:tstringlist;
targetlist:tstrings;
procedure synchadddatatocontrol;
constructor create(createsuspended:boolean);
procedure execute;override;
procedure terminate;
end;var
Form1: TForm1;implementation{$R *.dfm}
constructor tclientdatathread.create(createsuspended:boolean);
begin
inherited create(createsuspended);
freeonterminate:=true;
listbuffer:=tstringlist.Create;
end;procedure tclientdatathread.terminate;
begin
listbuffer.Free;
inherited;
end;procedure tclientdatathread.execute;
begin
synchronize(synchadddatatocontrol);
end;procedure tclientdatathread.synchadddatatocontrol;
begin
targetlist.AddStrings(listbuffer);
end;procedure TForm1.btnactivateserverClick(Sender: TObject);
begin
tcpserver1.LocalPort:=edtlocalport.Text;
tcpserver1.Active:=true;
end;procedure TForm1.btnsendClick(Sender: TObject);
var
l:integer;
begin
tcpclient1.RemoteHost:=edtremotehost.Text;
tcpclient1.RemotePort:=edtremoteport.Text;
try
if tcpclient1.Connect then
for l:=0 to memsend.Lines.Count-1 do
begin
tcpclient1.Sendln(memsend.Lines[l]);
tcpserver1.Open;
end;
finally
tcpclient1.Disconnect;
end;
end;procedure tform1.tcpserver1accept(sender: tobject;clientsocket: tcustomipclient);
var
s:string;
datathread:tclientdatathread;
begin
datathread:=tclientdatathread.create(true);
datathread.targetlist:=memrecv.Lines;
datathread.listbuffer.Add('***connection accepted***');
datathread.listbuffer.Add('remote host: '+clientsocket.LookupHostName(clientsocket.RemoteHost)+'('+clientsocket.RemoteHost+')');
datathread.listbuffer.Add('=====begin message=====');
s:=clientsocket.Receiveln;
while s<>'' do
begin
datathread.listbuffer.Add(s);
s:=clientsocket.Receiveln;
end;
datathread.listbuffer.Add('===== end of message =====');
datathread.Resume;
end;
end.
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货