点击或拖拽改变大小

NetComplexClient 类

一个基于异步高性能的客户端网络类,支持主动接收服务器的消息
继承层次
SystemObject
  HslCommunication.Core.NetNetworkBase
    HslCommunication.Core.NetNetworkXBase
      HslCommunication.EnthernetNetComplexClient

命名空间:  HslCommunication.Enthernet
程序集:  HslCommunication (在 HslCommunication.dll 中) 版本:8.1.3.0 (8.1.3.0)
语法
public class NetComplexClient : NetworkXBase

NetComplexClient 类型公开以下成员。

构造函数
  名称说明
公共方法NetComplexClient
实例化一个对象
Top
属性
  名称说明
公共属性ClientAlias
客户端登录的标识名称,可以为ID号,也可以为登录名
公共属性ConnectFailedCount
重连接失败的次数
公共属性DelayTime
系统与服务器的延时时间,单位毫秒
公共属性EndPointServer
远程服务器的IP地址和端口
公共属性IsClientStart
客户端系统是否启动
公共属性代码示例LogNet
组件的日志工具,支持日志记录
(继承自 NetworkBase。)
公共属性ServerTime
服务器的时间,自动实现和服务器同步
公共属性代码示例Token
网络类的身份令牌
(继承自 NetworkBase。)
公共属性UseSynchronousNet
是否使用同步的网络通讯
(继承自 NetworkBase。)
Top
方法
  名称说明
受保护的方法CheckRemoteToken
检查当前的头子节信息的令牌是否是正确的
(继承自 NetworkBase。)
公共方法ClientClose
关闭该客户端引擎
公共方法ClientStart
启动客户端引擎,连接服务器系统
受保护的方法代码示例CreateSocketAndConnect(IPEndPoint, Int32)
创建一个新的socket对象并连接到远程的地址
(继承自 NetworkBase。)
受保护的方法代码示例CreateSocketAndConnect(String, Int32)
创建一个新的socket对象并连接到远程的地址,默认超时时间为10秒钟
(继承自 NetworkBase。)
受保护的方法代码示例CreateSocketAndConnect(String, Int32, Int32)
创建一个新的socket对象并连接到远程的地址
(继承自 NetworkBase。)
受保护的方法DeleteFileByName
删除文件的操作
(继承自 NetworkXBase。)
公共方法Equals (继承自 Object。)
受保护的方法Finalize (继承自 Object。)
公共方法GetHashCode (继承自 Object。)
公共方法GetType (继承自 Object。)
受保护的方法HeadBytesReceiveCallback
指令头接收方法
(继承自 NetworkXBase。)
受保护的方法MemberwiseClone (继承自 Object。)
受保护的方法PreprocessFolderName
预处理文件夹的名称,除去文件夹名称最后一个'\',如果有的话
(继承自 NetworkXBase。)
受保护的方法ReadStream
读取流中的数据到缓存区
(继承自 NetworkBase。)
受保护的方法Receive
接收固定长度的字节数组
(继承自 NetworkBase。)
受保护的方法ReceiveAndCheckBytes
[自校验] 接收一条完整的同步数据,包含头子节和内容字节,基础的数据,如果结果异常,则结束通讯
(继承自 NetworkBase。)
受保护的方法ReceiveAsync
接收固定长度的字节数组
(继承自 NetworkBase。)
受保护的方法ReceiveByMessage
接收一条完整的 数据内容 -> Receive a complete data content
(继承自 NetworkBase。)
受保护的方法ReceiveBytesContentFromSocket(Socket)
[自校验] 从网络中接收一串字节数据,如果结果异常,则结束通讯
(继承自 NetworkBase。)
受保护的方法ReceiveBytesContentFromSocket(Socket, Int32)
[自校验] 从网络中接收一串字节数据,如果结果异常,则结束通讯
(继承自 NetworkBase。)
受保护的方法ReceiveFileFromSocket(Socket, Stream, ActionInt64, Int64)
[自校验] 从网络中接收一个文件,写入数据流,如果结果异常,则结束通讯,参数顺序文件名,文件大小,文件标识,上传人
(继承自 NetworkXBase。)
受保护的方法ReceiveFileFromSocket(Socket, String, ActionInt64, Int64)
[自校验] 从网络中接收一个文件,如果结果异常,则结束通讯
(继承自 NetworkXBase。)
受保护的方法ReceiveFileHeadFromSocket
[自校验] 从套接字中接收文件头信息
(继承自 NetworkXBase。)
受保护的方法ReceiveStringArrayContentFromSocket
[自校验] 从网络中接收一个字符串数组,如果结果异常,则结束通讯
(继承自 NetworkBase。)
受保护的方法ReceiveStringContentFromSocket
[自校验] 从网络中接收一个字符串数据,如果结果异常,则结束通讯
(继承自 NetworkBase。)
受保护的方法Send(Socket, Byte)
发送消息给套接字,直到完成的时候返回
(继承自 NetworkBase。)
公共方法Send(NetHandle, Byte)
服务器端用于发送字节的方法
公共方法Send(NetHandle, String)
服务器端用于数据发送文本的方法
受保护的方法SendAccountAndCheckReceive
[自校验] 直接发送字符串数组并确认对方接收完成数据,如果结果异常,则结束通讯
(继承自 NetworkBase。)
受保护的方法SendAsync
发送一个异步的数据信息,该方式在NET35里是不可用的。
(继承自 NetworkBase。)
受保护的方法SendBaseAndCheckReceive
[自校验] 发送字节数据并确认对方接收完成数据,如果结果异常,则结束通讯
(继承自 NetworkBase。)
受保护的方法SendBytesAndCheckReceive
[自校验] 发送字节数据并确认对方接收完成数据,如果结果异常,则结束通讯
(继承自 NetworkBase。)
受保护的方法SendFileAndCheckReceive(Socket, Stream, String, String, String, ActionInt64, Int64)
[自校验] 将流数据发送至套接字,具体发送细节将在继承类中实现,如果结果异常,则结束通讯
(继承自 NetworkXBase。)
受保护的方法SendFileAndCheckReceive(Socket, String, String, String, String, ActionInt64, Int64)
[自校验] 将文件数据发送至套接字,具体发送细节将在继承类中实现,如果结果异常,则结束通讯
(继承自 NetworkXBase。)
受保护的方法SendFileStreamToSocket
[自校验] 将文件数据发送至套接字,如果结果异常,则结束通讯
(继承自 NetworkXBase。)
受保护的方法SendStream
发送一个流的所有数据到网络套接字
(继承自 NetworkXBase。)
受保护的方法SendStringAndCheckReceive(Socket, Int32, String)
[自校验] 直接发送字符串数据并确认对方接收完成数据,如果结果异常,则结束通讯
(继承自 NetworkBase。)
受保护的方法SendStringAndCheckReceive(Socket, Int32, String)
[自校验] 直接发送字符串数组并确认对方接收完成数据,如果结果异常,则结束通讯
(继承自 NetworkBase。)
受保护的方法ThreadPoolCheckTimeOut
检查网络套接字是否操作超时,需要对套接字进行封装
(继承自 NetworkBase。)
公共方法ToString
返回对象的字符串表示形式
(重写 NetworkXBaseToString.)
受保护的方法WriteStream(Stream, Byte)
将缓冲区的数据写入到流里面去
(继承自 NetworkBase。)
受保护的方法WriteStream(Socket, Stream, Int64, ActionInt64, Int64, Boolean)
从套接字中接收所有的数据然后写入到流当中去
(继承自 NetworkXBase。)
Top
事件
  名称说明
公共事件AcceptByte
当接收到字节数据的时候,触发此事件
公共事件AcceptString
当接收到文本数据的时候,触发此事件
公共事件BeforReConnected
在客户端断开后并在重连服务器之前触发,用于清理系统资源
公共事件LoginFailed
连接失败时触发的事件
公共事件LoginSuccess
客户端启动成功的事件,重连成功也将触发此事件
公共事件MessageAlerts
服务器的异常,启动,等等一般消息产生的时候,出发此事件
Top
字段
  名称说明
受保护的字段CoreSocket
通讯类的核心套接字
(继承自 NetworkBase。)
Top
备注
详细的使用说明,请参照博客http://www.cnblogs.com/dathlin/p/7697782.html
示例
此处贴上了Demo项目的服务器配置的示例代码
NetComplexClient示例
public partial class FormComplexNet : HslFormContent
{
    public FormComplexNet( )
    {
        InitializeComponent( );
    }

    private void FormComplexNet_Load( object sender, EventArgs e )
    {
        button2.Enabled = false;
        textBox3.Text = Guid.Empty.ToString( );
        button5.Enabled = false;
    }


    private NetComplexClient complexClient = null;


    private void button1_Click( object sender, EventArgs e )
    {

        if (!IPAddress.TryParse( textBox1.Text, out IPAddress address ))
        {
            MessageBox.Show( "IP地址填写不正确" );
            return;
        }

        if (!int.TryParse( textBox2.Text, out int port ))
        {
            MessageBox.Show( "port填写不正确" );
            return;
        }

        try
        {
            // 连接 connect
            complexClient = new NetComplexClient( );
            complexClient.ClientAlias = textBox9.Text;
            complexClient.EndPointServer = new IPEndPoint( address, port );
            complexClient.Token = new Guid( textBox3.Text );
            complexClient.AcceptString += ComplexClient_AcceptString;
            complexClient.AcceptByte += ComplexClient_AcceptByte;
            complexClient.MessageAlerts += ComplexClient_MessageAlerts;
            complexClient.ClientStart( );

            button1.Enabled = false;
            button2.Enabled = true;
            panel2.Enabled = true;
        }
        catch (Exception ex)
        {
            HslCommunication.BasicFramework.SoftBasic.ShowExceptionMessage( ex );
        }
    }

    private void ComplexClient_MessageAlerts( string text )
    {
        if (InvokeRequired)
        {
            Invoke( new Action<string>( ComplexClient_MessageAlerts ), text );
            return;
        }

        label11.Text =  text;
    }

    private void ComplexClient_AcceptByte( HslCommunication.Core.Net.AppSession session, NetHandle handle, byte[] data )
    {
        // 接收字节数据,
        ShowTextInfo( $"[{session.IpEndPoint}] [{handle}] {HslCommunication.BasicFramework.SoftBasic.ByteToHexString( data )}" );
    }

    private void ComplexClient_AcceptString( HslCommunication.Core.Net.AppSession session, NetHandle handle, string data )
    {
        // 接收字符串
        ShowTextInfo( $"[{session.IpEndPoint}] [{handle}] {data}" );
    }

    private void button2_Click( object sender, EventArgs e )
    {
        // 断开连接 disconnect
        complexClient.ClientClose( );
        button1.Enabled = true;
        button2.Enabled = false;
    }

    private void ShowTextInfo( string text )
    {
        if (InvokeRequired)
        {
            Invoke( new Action<string>( ShowTextInfo ), text );
            return;
        }

        textBox8.AppendText( text + Environment.NewLine );
    }

    private void button3_Click( object sender, EventArgs e )
    {
        // 数据发送
        NetHandle handle = new NetHandle( );
        if (textBox5.Text.IndexOf( '.' ) >= 0)
        {
            string[] values = textBox5.Text.Split( '.' );
            handle = new NetHandle( byte.Parse( values[0] ), byte.Parse( values[1] ), ushort.Parse( values[2] ) );
        }
        else
        {
            handle = int.Parse( textBox5.Text );
        }


        if (!int.TryParse( textBox6.Text, out int count ))
        {
            MessageBox.Show( "数据发送次数输入异常" );
            return;
        }

        for (int i = 0; i < count; i++)
        {
            complexClient.Send( handle, textBox4.Text );
        }
    }

    private void button6_Click( object sender, EventArgs e )
    {
        // 多客户端压力测试
        System.Threading.Thread thread = new System.Threading.Thread( ServerPressureTest );
        thread.IsBackground = true;
        thread.Start( );
        button6.Enabled = false;
        button5.Enabled = true;
    }

    private System.Threading.AutoResetEvent autoResetWait = new System.Threading.AutoResetEvent( false );

    private void ServerPressureTest( )
    {
        NetComplexClient[] netComplices = new NetComplexClient[100];
        for (int i = 0; i < 100; i++)
        {
            netComplices[i] = new NetComplexClient( );
            netComplices[i].EndPointServer = new IPEndPoint( IPAddress.Parse( textBox1.Text ), int.Parse( textBox2.Text ) );
            netComplices[i].ClientAlias = "Client" + (i + 1);
            netComplices[i].ClientStart( );
        }

        // 等待连接完成
        System.Threading.Thread.Sleep( 2000 );
        int index = 0;

        for (int j = 0; j < 100; j++)
        {
            for (int i = 0; i < 100; i++)
            {
                netComplices[i].Send( 1, "测试消息" + (index++) );
            }
        }

        // 等待所有的都发送完成
        // System.Threading.Thread.Sleep( 2000 );
        autoResetWait.WaitOne( );


        for (int i = 0; i < 100; i++)
        {
            netComplices[i].ClientClose( );
        }


        Invoke( new Action( ( ) =>
         {
             button6.Enabled = true;
         } ) );
    }

    private void button5_Click( object sender, EventArgs e )
    {
        autoResetWait.Set( );
        button5.Enabled = false;
    }

}
参见