tcpclient类

2024-09-06 14:38
文章标签 tcpclient

本文主要是介绍tcpclient类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

{*******************************************************}
{                                                       }
{       功能:socke获取本地IP                           }
{                                     }
{       版权所有 (C) 2015 郑州中矿申投大宗商品交易有限公司}
{                                                       }
{*******************************************************}


unit UTCP_socketip;


interface
  uses
  System.SysUtils, System.Classes, WinSock,windows,System.Win.ScktComp;
const
  REPORTNAME = 'socke获取本地IP';


type
  TgetipEvent = procedure (ip: AnsiString; get:Boolean) of object;  {定义一个时间类型}
  TgetipERREvent = procedure of object;  {定义一个时间类型}
  TTCP_socketip = class
  FClientSocket: array of TClientSocket;
  Fhost: AnsiString;       //TCP地址
  Fport: Integer;          //TCP端口
  FgetIP: AnsiString;       //获取到的本地IP
  Fget: Boolean;


  Fisgetip: Boolean;   {是否成功获取到IP}
  strict private
  FgetipEvent: TgetipEvent;  {消息发送数据接收完成字段}
  FgetipERREvent: TgetipERREvent; {连接发生错误事件}


  FTAG: Byte ;          {连接次数记录,如果所有连接都尝试过,都连接出错,就响应}
  procedure SETFTAG(const Value: Byte) ;
  procedure rungetipEvent; {运行消息发送数据接收完成字段}
  public
  { Public declarations }
  property OngetipEvent: TgetipEvent read FgetipEvent write FgetipEvent;  {消息发送属性}
  property OngetipERREvent: TgetipERREvent read FgetipERREvent write FgetipERREvent;  {消息发送属性}
  property OnSETFTAG: Byte read FTAG write SETFTAG;  {连接次数事件}
  constructor  Create;
  destructor Destroy; override;
  procedure ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket);{读取数据}
  procedure ClientSocketError(Sender: TObject; Socket: TCustomWinSocket;
    ErrorEvent: TErrorEvent; var ErrorCode: Integer);     {连接失败}


  procedure linkfinish; {开始连接获取IP}




  {判断IP是否合法}
  function IsLegalIp(Str: AnsiString): Boolean;
  end;
var
  VTCP_SOCKETIP: TTCP_socketip;


implementation
  uses
    Unetworkset;




function TTCP_socketip.IsLegalIp(Str: AnsiString): Boolean;
var
I,K,DotCnt: Integer;
Num: AnsiString;
Arr:  Array [1..4] of AnsiString;
begin
  Result := False;
  DotCnt := 0;         //由'0'..'9',   '.'组成
  For  I := 1 to Length(Str)  do
  begin
    if Not (Str[I] in ['0'..'9','.']) then
      Exit
    else
    if Str[I]  = '.'then
    inc(DotCnt);
  end;         //点分隔符号数量应该=3
  if DotCnt <> 3 then
  Exit;
  For K := 1 to 3 do
  begin
    I := Pos('.',Str);
    Num := Copy(Str,1,I-1);
    Delete(Str,1,I);
    Arr[K]:=Num;
  end;
  Arr[4]:=Str;
  try
    DotCnt := 0;
    For I:= 1 to 4 do
    begin
      K := StrToInt(Arr[I]);                 //每字节的值应介于0~255之间
      if ((K >= 0) and (K <= 255))   then
      Inc(DotCnt);
    end;             //四个字节都满足0~255之间,则搜索合法
    if(DotCnt = 4)   then
      Result := True;
  except
  end;
end;


procedure TTCP_socketip.SETFTAG(const Value: Byte) ;
begin
  FTAG := Value;
  if FTAG >= Length( VGnetworkset.FnetaddressList)*3 then
  begin
    //FgetipERREvent;
  end;
end;


constructor TTCP_socketip.create();
var
  i : Integer;
begin
  inherited Create;
  FTAG := 0;


  SetLength( FClientSocket , Length(VGnetworkset.FnetaddressList) );
  for I := 0 to Length(VGnetworkset.FnetaddressList) -1 do
  begin
    FClientSocket[i] := TClientSocket.Create(nil);
  end;
end;


destructor TTCP_socketip.Destroy;
var
  i : Integer;
begin
  for I := 0 to Length(VGnetworkset.FnetaddressList) -1 do
  begin
    FClientSocket[i].Active := False;
    FClientSocket[i].Free;
  end;
  inherited;
end;


procedure TTCP_socketip.rungetipEvent; {运行消息发送数据接收完成字段}
var
  i : Integer;
begin
  for I := 0 to Length(VGnetworkset.FnetaddressList) -1 do
  begin
    try
      FClientSocket[i].Active := False;
    except


    end;
  end;


  if Assigned(FgetipEvent) then
  FgetipEvent(FgetIP,Fget);
end;


procedure TTCP_socketip.linkfinish ; {开始连接获取IP}
var
  i: Integer;
begin
  try
    for I := 0 to Length(VGnetworkset.FnetaddressList)-1 do
    begin
      try
        FClientSocket[i].OnRead := ClientSocketRead;
        FClientSocket[i].OnError := ClientSocketError;
        FClientSocket[i].Close;
        FClientSocket[i].Host := VGnetworkset.FnetaddressList[i].ip;
        FClientSocket[i].Port := 4566;
        FClientSocket[i].Active := True;
      except


      end;
    end;
  except


  end;
end;


procedure TTCP_socketip.ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket);
begin
  if Fisgetip then
  Exit;


  FgetIP := Socket.ReceiveText;
  if not IsLegalIP( FgetIP ) then
  begin
    Fget := false;
  end
  else
  begin
    Fget := True;
    Fisgetip := True;
    rungetipEvent;
  end;


end;


procedure TTCP_socketip.ClientSocketError(Sender: TObject; Socket: TCustomWinSocket;
  ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
  Inc( FTAG );
  if FTAG >= Length(VGnetworkset.FnetaddressList) * 3 then
  begin


    FgetIP := '1.1.1.1';
    Fget := True;
    Fisgetip := True;
    rungetipEvent;


    Exit;
  end;


  if (Fisgetip=False) then
   TClientSocket(sender).Active := True;
end;


initialization
  VTCP_SOCKETIP := TTCP_socketip.Create;
finalization
  VTCP_SOCKETIP.Free;


end.

这篇关于tcpclient类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1142287

相关文章

如何解决 MATLAB 中 `tcpclient` 卡住的问题:端口占用问题详解

问题描述 在 MATLAB 中使用 tcpclient('localhost', port) 进行网络编程时,有时会遇到程序卡住的情况。这种情况很可能是由于端口被其他程序占用导致的。本文将详细介绍如何检查和释放被占用的端口,以解决 MATLAB 的 tcpclient 卡住问题。 解决方法:检查和释放被占用的端口 当 tcpclient 在连接指定端口时卡住,首先要检查该端口是否已经被其

TcpClient 服务器、客户端连接

TcpClient 服务器 TcpListener 搭建tcp服务器的类,基于socket套接字通信的 1 创建服务器对象 TcpListener server = new TcpListener(IPAddress.Parse("127.0.0.1"), 3000);  2 开启服务器 设置最大连接数 server.Start(1000); 3 接收客户端的链接,只能接收一个 并且会

C# TcpClient

TcpClient 自己封装的话,还是比较麻烦的,可以基于线程,也可以基于异步写,最好的办法是网上找个插件,我发现一个插件还是非常好用的:STTech.BytesIO.Tcp 下面是这个插件作者的帖子,有兴趣的可以去看看 TcpClient BytesIO | 零基础轻松看懂 C# TCP客户端(完整源码+视频教程)_sttech.bytesio.tcp-CSDN博客 TcpServer

TcpClient和TcpListener

TcpClient 类为 TCP 网络服务提供客户端连接。TcpClient 类提供了一些简单的方法,用于在同步阻塞模式下通过网络来连接、发送和接收流数据。 为使 TcpClient 连接并交换数据,使用 TCP ProtocolType 创建的 TcpListener 或 Socket 必须侦听是否有传入的连接请求。可以使用下面两种方法之一连接到该侦听器: 创建一个 TcpClient,并

网络通信(17)-C#TcpClient 和 TcpListener的详解

目录 一、概述 二、TcpClient 三、NetworkStream流处理技术 四、 TcpListener 一、概述 支持Http、Tcp和Udp的类组成了TCP/IP三层模型(请求响应层、应用协议层、传输层)的中间层-应用协议层,该层的类比位于最底层的Socket类提供了更高层次的抽象

QT TCP通信:用QT制作一个TCPServer与TCPClient的通信

文章目录 前言1. TCP通信原理和流程阐述1.1 TCP 通信原理简述1.2 TCP服务端建立与通信流程1.3 TCP客户端通信流程 2. 关键源码阐述2.1 服务端代码2.2 客户端代码 总结 前言 之前项目上用到了TCP通信,作为TCP的服务端上位机与下位机进行控制信号传输。 这篇博客就对QT中使用TCP通信理一个简单的demo,做一个简单的TCP服务端和客户端的通信。 因

Tcpclient对象文件传送

建立连接前,客户端和服务器端各创建一个Tcpclient 对象:client 和newclient,然后利用该对象接收和发送数据,具体的c/s连接过程省略,以下是利用Tcpclient创建的对象传送文件的部分代码。//发送窗体private void send_Click(object sender, EventArgs e)        {         NetworkStream tcp

C#网络编程TCP程序设计(Socket类、TcpClient类和 TcpListener类)

目录 一、Socket类 1.Socket类的常用属性及说明 2.Socket类的常用方法及说明 二、TcpClient类 三、TcpListener类  四、示例 1.源码 2.生成效果         TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在C#中,TCP程序设计是指利用Socket类

muduo源码剖析之TcpClient客户端类

简介 muduo用TcpClient发起连接,TcpClient有一个Connector连接器,TCPClient使用Conneccor发起连接, 连接建立成功后, 用socket创建TcpConnection来管理连接, 每个TcpClient class只管理一个TcpConnecction,连接建立成功后设置相应的回调函数。很显然,TcpClient用来管理客户端连接,真正连接交给Conn

TcpClient类异步接收数据

构造函数属性主要方法流程 TcpClient读取数据过程 TcpClient连接TcpClient已经连接上NetworkStream读取NetworkStream已经读取完毕取出数据TcpClient发送数据流程 TcpClient线程NetworkStream异步发送线程实例 TcpClient连接NetworkStream异步读取NetworkStream读取处理NetworkStream