zoukankan      html  css  js  c++  java
  • delphi-TTcpServer与TTcpClient

    最简单的TTcpServer与TTcpClient通信实例-Delphi_海盗船长_新浪博客
    http://blog.sina.com.cn/s/blog_5383794d0100nt9u.html

    delphi TTcpClient TTcpServer分析 - 沧海一粟 - 博客频道 - CSDN.NET
    http://blog.csdn.net/andrew57/article/details/8767308

    用TTcpClient和TTcpServer进行文件的传输 - 好记性不如烂笔头 - 博客频道 - CSDN.NET
    http://blog.csdn.net/onebigday/article/details/5425028

    再说“用TTcpClient和TTcpServer进行文件的传输” - 好记性不如烂笔头 - 博客频道 - CSDN.NET
    http://blog.csdn.net/onebigday/article/details/5612612

    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, IdTCPConnection, IdTCPClient, Sockets, IdTCPServer, IdUDPServer, IdBaseComponent, IdComponent, IdUDPBase, IdUDPClient, StdCtrls;
    
    type
      TFrmMain = class(TForm)
        TcpServer1: TTcpServer;
        TcpClient1: TTcpClient;
        Button1: TButton;
        Button2: TButton;
        Mserver: TMemo;
        MClient: TMemo;
        Edit1: TEdit;
        btn1: TButton;
        btn2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure TcpServer1Accept(Sender: TObject; ClientSocket: TCustomIpClient);
        procedure btn1Click(Sender: TObject);
        procedure TcpClient1Receive(Sender: TObject; Buf: PAnsiChar; var DataLen: Integer);
        procedure btn2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
      
      //这个类实现TTcpClient接收TTcpserver回复的消息
      TClientReceiveThread = class(TThread)
        procedure Execute; override;
      end;
    
    var
      FrmMain: TFrmMain;
      ClientReceiveThread: TClientReceiveThread;
    
    implementation
    
    {$R *.dfm}
    procedure TClientReceiveThread.Execute;
    begin
      with FrmMain do
      begin
        while TcpClient1.Connected do  //死循环!必须的!!!
          if not Terminated then
            MClient.Lines.Add(TcpClient1.Receiveln) //一条条读进来
           // TcpClient1.Receiveln
          else
            Break;
      end;
    end;
    procedure TFrmMain.Button1Click(Sender: TObject);
    begin
      //连接服务器,如果成功创建客户端接收线程
      if TcpClient1.Connect and (not Assigned(ClientReceiveThread)) then
        ClientReceiveThread := TClientReceiveThread.Create(false);
    end;
    
    procedure TFrmMain.Button2Click(Sender: TObject);
    begin
      TcpClient1.Sendln(Edit1.Text);
    end;
    
    //TcpServer1的OnAccept事件
    procedure TFrmMain.TcpServer1Accept(Sender: TObject; ClientSocket: TCustomIpClient);
    var
      s1, s2: string;
    begin
      while ClientSocket.connected do  //死循环!必须的!!!    此函数貌似只触发一次,连接时
      begin
        s1 := ClientSocket.Receiveln;  //收  如果没有值不会返回来,相当于停在这里了; 阻塞
        MServer.Lines.Add('收到客户端的  ' + s1);
        //s2 := DateTimeToStr(Now);
        if ClientSocket.connected then
          ClientSocket.Sendln(DateTimeToStr(Now) + '服务端已经收到  ' + s1);  //
        //Application.ProcessMessages; 此处没有必要
      end;
    end;
    
    procedure TFrmMain.btn1Click(Sender: TObject);
    begin
      TcpClient1.Disconnect;
    end;
    
    procedure TFrmMain.TcpClient1Receive(Sender: TObject; Buf: PAnsiChar; var DataLen: Integer); //只有调用读操作时才会触发此函数
    begin
       // MClient.Lines.Add('fdafdfda');
      //MClient.Lines.
      // MClient.Lines.Add(Buf);
       //MClient.SetTextBuf(Buf);
       //MClient.Lines.SetText(Buf);
       //MClient.GetTextBuf(Buf,DataLen);
    end;
    
    procedure TFrmMain.btn2Click(Sender: TObject);
    begin
      ClientReceiveThread.Terminate;
    end;
    
    end.
    object FrmMain: TFrmMain
      Left = 192
      Top = 131
      Width = 842
      Height = 480
      Caption = 'FrmMain'
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'MS Sans Serif'
      Font.Style = []
      OldCreateOrder = False
      PixelsPerInch = 96
      TextHeight = 13
      object Button1: TButton
        Left = 8
        Top = 56
        Width = 75
        Height = 25
        Caption = '创建线程'
        TabOrder = 0
        OnClick = Button1Click
      end
      object Button2: TButton
        Left = 8
        Top = 96
        Width = 75
        Height = 25
        Caption = '发送信息'
        TabOrder = 1
        OnClick = Button2Click
      end
      object Mserver: TMemo
        Left = 16
        Top = 160
        Width = 385
        Height = 265
        Lines.Strings = (
          'Mserver')
        ScrollBars = ssBoth
        TabOrder = 2
      end
      object MClient: TMemo
        Left = 408
        Top = 160
        Width = 401
        Height = 273
        Lines.Strings = (
          'MClient')
        ScrollBars = ssBoth
        TabOrder = 3
      end
      object Edit1: TEdit
        Left = 96
        Top = 96
        Width = 169
        Height = 29
        TabOrder = 4
        Text = 'Edit1'
      end
      object btn1: TButton
        Left = 440
        Top = 88
        Width = 145
        Height = 25
        Caption = '停止客户端tcp'
        TabOrder = 5
        OnClick = btn1Click
      end
      object btn2: TButton
        Left = 440
        Top = 56
        Width = 145
        Height = 25
        Caption = '关闭线程'
        TabOrder = 6
        OnClick = btn2Click
      end
      object TcpServer1: TTcpServer
        Active = True
        LocalHost = '127.0.0.1'
        LocalPort = '2011'
        OnAccept = TcpServer1Accept
        Top = 8
      end
      object TcpClient1: TTcpClient
        Active = True
        RemoteHost = '127.0.0.1'
        RemotePort = '2011'
        OnReceive = TcpClient1Receive
        Left = 88
      end
    end
    窗体代码
  • 相关阅读:
    Asp.net Core依赖注入(Autofac替换IOC容器)
    .NET Core WEB API接口参数模型绑定
    .net core docker容器编排部署(linux)
    asp .net core发布订阅kafka
    asp.net Core依赖注入(自带的IOC容器)
    VS2017 GIT推送错误:Authentication failed解决办法
    《ASP.NET Core 开发实战》
    《Entity Framework 实用精要》
    《C# 敏捷开发实践》
    《ASP.NET 框架应用程序实战》
  • 原文地址:https://www.cnblogs.com/rogge7/p/6372945.html
Copyright © 2011-2022 走看看