delphi7 tcpclient和server有个问题。麻烦!
我用tcpclient连接tcpserver的时候
当client连接到server的时候server提示了连接成功但是马上又显示了连接结束了。。。这个是tcp这个控件的问题吗?
我设置了connet和disconnet。。。server这个直接运行了连接和断开的输出。但是按照常理来说连接的时候才提示连接断开的时候才提示断开嘛。。。。
[color=#FFFFFF]传奇服务端[/color]
[解决办法]
我昨天测试的一个例子你参考一下
客户端
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
IdTCPClient, IdAntiFreezeBase, IdAntiFreeze;
type
TForm1 = class(TForm)
IdTCPClient1: TIdTCPClient;
Label1: TLabel;
edtIP: TEdit;
Label2: TLabel;
edtPort: TEdit;
Label3: TLabel;
edtSendData: TEdit;
btSend: TButton;
Label4: TLabel;
Memo1: TMemo;
btDisConn: TButton;
IdAntiFreeze1: TIdAntiFreeze;
btConn: TButton;
procedure btConnClick(Sender: TObject);
procedure btSendClick(Sender: TObject);
procedure btDisConnClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.btConnClick(Sender: TObject);
begin
IdTCPClient1.Host:=edtIP.Text;
IdTCPClient1.Port:=StrtoInt(edtPort.Text);
Memo1.Lines.Add('正在连接'+edtIP.Text+'...');
with IdTCPClient1 do begin
try
connect(5000);
try
Memo1.Lines.Add(ReadLn());
btConn.Enabled:=false;
btDisConn.Enabled:=true;
btSend.Enabled:=true;
except
Memo1.Lines.Add('远程主机无响应!');
IdTCPClient1.Disconnect;
end;
except
Memo1.Lines.Add('无法建立到'+edtIP.Text+'的连接!');
end;
end;
end;
procedure TForm1.btSendClick(Sender: TObject);
begin
Memo1.Lines.Add('DATA '+edtSendData.Text) ;
with IdTCPClient1 do
begin
try
IdTCPClient1.WriteLn('DATA'+edtSendData.Text);
Memo1.Lines.Add(ReadLn())
except
Memo1.Lines.Add('发送数据失败!');
IdTCPClient1.Disconnect;
Memo1.Lines.Add('同主机'+edtIP.Text+'的连接已断开。');
btConn.Enabled:=true;
btSend.Enabled:=false;
btDisConn.Enabled:=false;
end;
end;
end;
procedure TForm1.btDisConnClick(Sender: TObject);
var
Received:string;
begin
Memo1.Lines.Add('QUIT');
try
IdTCPClient1.WriteLn('QUIT');
finally
IdTCPClient1.Disconnect;
Memo1.Lines.Add('同主机'+edtIP.Text+'的连接已断开。') ;
btConn.Enabled:=true;
btSend.Enabled:=false;
btDisConn.Enabled:=false;
end;
end;
end.
服务器端
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPServer;
type
TForm1 = class(TForm)
Label1: TLabel;
edtPort: TEdit;
Label2: TLabel;
edtRecvData: TEdit;
Label3: TLabel;
Memo1: TMemo;
btStart: TButton;
btStop: TButton;
IdTCPServer1: TIdTCPServer;
procedure btStartClick(Sender: TObject);
procedure btStopClick(Sender: TObject);
procedure IdTCPServer1Connect(AThread: TIdPeerThread);
procedure IdTCPServer1Execute(AThread: TIdPeerThread);
private
{ Private declarations }
FlogEntry,FReceived:string;
procedure AddLogEntry ;
procedure DisplayData ;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.AddLogEntry;
begin
Memo1.Lines.Add(FlogEntry);
end;
procedure TForm1.DisplayData;
begin
edtRecvData.Text:=FReceived;
end;
procedure TForm1.btStartClick(Sender: TObject);
begin
IdTCPServer1.DefaultPort:=StrtoInt(edtPort.Text);
IdTCPServer1.Active:=true;
btStart.Enabled:=false;
btStop.Enabled:=true;
Memo1.Lines.Add('服务器已经成功启动!');
end;
procedure TForm1.btStopClick(Sender: TObject);
begin
IdTCPServer1.Active:=false;
btStart.Enabled:=true;
btStop.Enabled:=false;
Memo1.Lines.Add('服务器已成功停止!');
end;
procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
begin
Memo1.Lines.Add('来自主机'+AThread.Connection.Socket.Binding.PeerIP+
'的连接请求已被接纳!');
AThread.Connection.WriteLn('100:欢迎访问TCP服务器!');
end;
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
sCommand:String;
begin
with AThread.Connection do
begin
sCommand:=ReadLn() ;
FlogEntry:= sCommand+'来自主机'+AThread.Connection.Socket.Binding.PeerIP;
AThread.Synchronize(AddLogEntry );
if pos('DATA',sCommand)>0 then begin
FReceived:=copy(sCommand,5,length(sCommand)-5);
AThread.Synchronize(DisplayData);
end else if pos('QUIT',sCommand)>0 then begin
FlogEntry:= '断开同主机'+AThread.Connection.Socket.Binding.PeerIP+'的连接';
AThread.Synchronize(AddLogEntry);
AThread.Connection.Disconnect;
end else begin
FlogEntry:= '无法识别的命令!';
AThread.Synchronize(AddLogEntry);
end;
end;
end;
end.