📄 client.pas
字号:
unit Client;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ScktComp, ExtCtrls;
type
TForm1 = class(TForm)
ClientSocket1: TClientSocket;
Button1: TButton;
Memo1: TMemo;
Button2: TButton;
Button3: TButton;
Timer1: TTimer;
Label1: TLabel;
Label2: TLabel;
Button4: TButton;
Label3: TLabel;
Label4: TLabel;
procedure Button1Click(Sender: TObject);
procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
base:Integer;
nextseq:Integer;
windowsize:Integer;
TimeOut:Integer;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Address := '219.242.124.129';
ClientSocket1.Active := true;
end;
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
rec:String;
begin
rec:=ClientSocket1.socket.ReceiveText;
if system.Copy(rec,2,1)='N' then
begin
base:=(StrToInt(system.Copy(rec,1,1))+1)mod 10;
if nextseq<base+windowsize then
begin
Button2.Enabled:=true;
Button3.Enabled:=true;
Button4.Enabled:=true;
end;
Label1.Caption:='Base:'+IntToStr(base);
if base=nextseq then
begin
timer1.Enabled:=false;
TimeOut:=10;
Label3.Caption:='10';
Memo1.Lines.Append('计时停止');
end
else
begin
timer1.Enabled:=false;
TimeOut:=10;
Label3.Caption:='10';
timer1.Enabled:=true;
Memo1.Lines.Append('重新计时');
end;
end
else
begin
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if nextseq<base+windowsize then
begin
Memo1.Lines.Append('Packet'+IntToStr(nextseq)+' 正确发送');
ClientSocket1.Socket.SendText(IntToStr(nextseq mod 10)+'N');
if base=nextseq then
begin
Memo1.Lines.Append('启动计时');
Timer1.Enabled:=true;
end;
nextseq:=(nextseq+1)mod 10;
Label2.Caption:='Nextseq:'+IntToStr(nextseq);
end
else
begin
Button2.Enabled:=false;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
base := 0;
nextseq := 0;
windowsize:=5;
TimeOut:=10;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
if nextseq<base+windowsize then
begin
Memo1.Lines.Append('Packet'+IntToStr(nextseq)+' 发送但被破坏');
ClientSocket1.Socket.SendText(IntToStr(nextseq )+'Y');
if base=nextseq then
begin
Memo1.Lines.Append('启动计时');
Timer1.Enabled:=true;
end;
nextseq:=(nextseq+1)mod 10;
Label2.Caption:='Nextseq:'+IntToStr(nextseq);
end
else
begin
Button3.Enabled:=false;
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
i:Integer;
begin
TimeOut:=TimeOut-1;
Label3.Caption:=IntToStr(TimeOut);
if TimeOut<0 then
begin
TimeOut:=10;
for i:=base to nextseq-1 do
begin
Memo1.Lines.Append('重发 Packet'+IntToStr(i));
ClientSocket1.Socket.SendText(IntToStr(i)+'N');
end;
end;
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
if nextseq<base+windowsize then
begin
Memo1.Lines.Append('Packet'+IntToStr(nextseq)+' 发送但丢失');
if base=nextseq then
begin
Memo1.Lines.Append('启动计时');
Timer1.Enabled:=true;
end;
nextseq:=(nextseq+1) mod 10;
Label2.Caption:='Nextseq:'+IntToStr(nextseq);
end
else
begin
Button4.Enabled:=false;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -