TcpClient类异步接收数据

本文深入解析了TcpClient类的功能与使用,包括其构造函数、属性及主要方法,重点介绍了如何利用TcpClient和NetworkStream实现TCP客户端的连接、数据收发流程,以及异步读写操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TcpClient为基于Socket构建的用来进行TCP通信的简单类,主要用于TCP客户端的编写,可以使用同步或者异步。发送接收数据用NetworkStream。很多东西摘录自MSDN

构造函数

名称说明
TcpClient()初始化 TcpClient 类的新实例。
TcpClient(AddressFamily)使用指定的族初始化 TcpClient 类的新实例。
TcpClient(IPEndPoint)初始化 TcpClient 类的新实例,并将其绑定到指定的本地终结点。
TcpClient(String, Int32)初始化 TcpClient 类的新实例并连接到指定主机上的指定端口。

以上是摘自MSDN上的,其中AddressFamily指的是使用指定的协议族,例如IPv4或者IPv6 如果要指定本地端口,用IPEndPoint来进行绑定。

属性

TcpCient

名称说明
Active获取或设置一个值,它指示是否已建立连接。
Available获取已经从网络接收且可供读取的数据量。
Client获取或设置基础 Socket。
Connected获取一个值,该值指示 Socket 的基础 TcpClient 是否已连接到远程主机。
ExclusiveAddressUse获取或设置 Boolean 值,指定 TcpClient 是否只允许一个客户端使用端口。
LingerState获取或设置有关关联的套接字的延迟状态的信息。
NoDelay获取或设置一个值,该值在发送或接收缓冲区未满时禁用延迟。
ReceiveBufferSize获取或设置接收缓冲区的大小。
ReceiveTimeout获取或设置在初始化一个读取操作以后 TcpClient 等待接收数据的时间量。
SendBufferSize获取或设置发送缓冲区的大小。
SendTimeout获取或设置 TcpClient 等待发送操作成功完成的时间量。

NetworkStream

名称说明
CanRead获取一个值,该值指示 NetworkStream 是否支持读取
CanWrite获取一个值,该值指示 NetworkStream 是否支持写入

主要方法

TcpClient

名称说明
BeginConnect(IPAddress, Int32, AsyncCallback, Object)开始一个对远程主机连接的异步请求。远程主机由 IPAddress 和端口号 (Int32) 指定。
Close()释放此 TcpClient 实例,并请求关闭基础 TCP 连接。

NetworkStream

名称说明
BeginRead(Byte[], Int32, Int32, AsyncCallback, Object)从 NetworkStream 开始异步读取。
Close()关闭当前流并释放与之关联的所有资源
BeginWrite(Byte[], Int32, Int32, AsyncCallback, Object)开始向流异步写入

流程

TcpClient读取数据过程

TcpClient连接

在这里插入图片描述

TcpClient已经连接上,NetworkStream读取

在这里插入图片描述

NetworkStream已经读取完毕,取出数据

在这里插入图片描述

TcpClient发送数据流程

确保TcpClient已经连接的情况下执行

TcpClient线程

在这里插入图片描述

NetworkStream异步发送线程

在这里插入图片描述

实例

TcpClient连接

private void TcpButton_Click(object sender, EventArgs e)
{
    if (TcpButton.Text == "TCP打开")
    {
        TcpButton.Text = "TCP关闭";
        IPEndPoint targetPoint = new IPEndPoint(TcpUdp.VerifyInputIP(IPTextBox.Text), TcpUdp.VerifyInputPort(TcpTargetPortTextBox.Text));
        int localTcpPort = Int32.Parse(TcpSourcePortTextBox.Text);
        if (localTcpPort > 0)
        {
            IPEndPoint localEP = new IPEndPoint(IPAddress.Parse("127.0.0.1"), localTcpPort);
            tcp = new TcpClient(localEP);

        }
        else
        {
            tcp = new TcpClient();
        }
        tcp.ReceiveTimeout = 10;
        //异步连接
        tcp.BeginConnect(IPAddress.Parse(IPTextBox.Text), TcpUdp.VerifyInputPort(TcpTargetPortTextBox.Text), Connected, tcp);
    }
    else
    {
        TcpButton.Text = "TCP打开";
        if ((tcp != null) && (tcp.Connected))
        {
            ns.Close();
            tcp.Close();
        }
        SetTcpPic(tcp.Connected);
        TcpIsOpen = tcp.Connected;
    }
}

NetworkStream异步读取

private void Connected(IAsyncResult iar)
{
    tcp = (TcpClient)iar.AsyncState;
    tcp.EndConnect(iar);
    //MessageBox.Show("connected");
    SetTcpPic(tcp.Connected);
    TcpIsOpen = tcp.Connected;
    if ((tcp != null) && (tcp.Connected))
    {
        ns = tcp.GetStream();

        StateObject state = new StateObject();
        state.client = tcp;
        NetworkStream stream = state.client.GetStream();
        if (stream.CanRead)
        {
            byte[] buffer = new byte[tcp.ReceiveBufferSize];
            stream.BeginRead(state.buffer, 0, StateObject.BufferSize, new AsyncCallback(AsyncReadCallBack), state);
        }
    }
}

NetworkStream读取处理

private void AsyncReadCallBack(IAsyncResult iar)
{
    StateObject state = (StateObject)iar.AsyncState;
    if ((state.client == null) || (!state.client.Connected)) return;
    int NumOfBytesRead;
    NetworkStream ns = state.client.GetStream();
    NumOfBytesRead = ns.EndRead(iar);
    if (NumOfBytesRead > 0)
    {
        byte[] buffer = new byte[NumOfBytesRead];
        Array.Copy(state.buffer, 0, buffer, 0, NumOfBytesRead);
        ReceiveAppend(buffer, TcpUdp.StringType.String);
        ns.BeginRead(state.buffer, 0, StateObject.BufferSize, new AsyncCallback(AsyncReadCallBack), state);
    }
    else
    {
        ns.Close();
        state.client.Close();
        ns = null;
        state = null;
    }
}

NetworkStream发送

if (TcpIsOpen)
{
    if (ns != null)
    {
        //ns.Write(buffer, 0, buffer.Length);
        ns.BeginWrite(buffer, 0, buffer.Length, new AsyncCallback(StreamWriteCallBack), ns);
    }
}

private void StreamWriteCallBack(IAsyncResult iar)
{
    NetworkStream ns = (NetworkStream)iar.AsyncState;
    ns.EndWrite(iar);
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值