读书人

帮小弟我看看代码关于TCP/IP的

发布时间: 2012-09-08 10:48:07 作者: rapoo

帮我看看代码,关于TCP/IP的


下面的代码客户端为什么接收不到数据包?


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ComCtrls, Menus, Sockets;

type
TForm1 = class(TForm)
TcpClient1: TTcpClient;
TcpServer1: TTcpServer;
StatusBar1: TStatusBar;
Timer1: TTimer;
Panel1: TPanel;
Label2: TLabel;
Edit1: TEdit;
Label1: TLabel;
Edit2: TEdit;
Label3: TLabel;
Edit3: TEdit;
Label4: TLabel;
Edit4: TEdit;
connect: TButton;
break: TButton;
Panel5: TPanel;
Panel2: TPanel;
Memo1: TMemo;
Panel3: TPanel;
Memo2: TMemo;
Panel6: TPanel;
Button1: TButton;
procedure connectClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure TcpServer1Accept(Sender: TObject;
ClientSocket: TCustomIpClient);
procedure breakClick(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
private
dddd:string;
{Thread1:TMyFirstThread; }
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
//清理内存
procedure ClearMemory;
begin
if Win32Platform = VER_PLATFORM_WIN32_NT then
begin
SetProcessWorkingSetSize(GetCurrentProcess, $FFFFFFFF, $FFFFFFFF);
Application.ProcessMessages;
end;
end;

procedure TForm1.connectClick(Sender: TObject);
begin
form1.TcpServer1.Active:=false;
//本地IP参数
form1.TcpServer1.LocalHost:='192.168.1.11';
form1.TcpServer1.LocalPort:='1000';
form1.TcpServer1.Active:=true;
form1.statusbar1.Panels[1].Text:= '已连接';
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
memo1.text:='';
memo2.text:='';
end;

procedure TForm1.TcpServer1Accept(Sender: TObject;
ClientSocket: TCustomIpClient);
var s:string;
begin
s:=clientsocket.Receiveln;
memo1.Lines.Add(clientSocket.RemoteHost);
memo1.Lines.Add(s);

//远程IP参数
form1.TcpClient1.RemoteHost:=clientSocket.RemoteHost;
form1.TcpClient1.RemotePort:=clientSocket.RemotePort;
form1.tcpclient1.Connect;
if form1.tcpclient1.Connected then
begin
form1.tcpclient1.Sendln(datetimetostr(now));
end;
form1.memo2.Lines.Add(datetimetostr(now));
form1.tcpclient1.Disconnect;
end;

procedure TForm1.breakClick(Sender: TObject);
begin
if messagedlg('是否真的要断开连接?',mtinformation,[mbyes,mbNo,mbcancel],0)=mryes then
begin
tcpclient1.Active:=false;
tcpserver1.Active:=false;
statusbar1.Panels[1].Text:= '已断开';
end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var aa:tdatetime;
Hour,Min,Sec:String;
S:String;
begin
aa:=now;
statusbar1.Panels[0].Text:=' 当前时间:'+datetimetostr(aa);
//清理内存
S:=timetostr(aa);
Hour:=Copy(S, 1, 2);
Min:=Copy(s, 4, 2);
Sec:=Copy(S, 7, 2);
if (Min='30') and (Sec='00') then


begin
Memo1.Lines.Clear;
Memo2.Lines.Clear;
ClearMemory;
end;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
dddd:='';
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
//远程IP参数
form1.TcpClient1.RemoteHost:='192.168.1.10';
form1.TcpClient1.RemotePort:='1000';
form1.tcpclient1.Connect;
if form1.tcpclient1.Connected then
begin
form1.tcpclient1.Sendln(datetimetostr(now));
end;
form1.memo2.Lines.Add(datetimetostr(now));
form1.tcpclient1.Disconnect;
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
tcpclient1.Active:=false;
tcpserver1.Active:=false;
end;

end.

[解决办法]
你应该在服务器端的那个Accpet事件中对当前连接的客户端来写,貌似你里面还用了indy的idtcpcleint
[解决办法]
另外,想给client端发数据,用TcpServer1Accept事件的ClientSocket参数
而不是用form1.TcpClient1,因为Server/Client基本是在不同的exe上的,没机会在一form上
当然测试你可以这么写

读书人网 >.NET

热点推荐