⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 client.pas

📁 网络路径中信息发送的gobackn地实现
💻 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 + -