TcpClient类异步接收数据

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
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
C#中的异步TCPClient是一种用于进行网络通信的。它允许你在进行网络连接、发送和接收数据时,使用异步操作来提高应用程序的性能和响应性。 要使用异步TCPClient,你需要使用C#的异步编程模型(Async/Await)。以下是使用异步TCPClient的一些基本步骤: 1. 创建一个TCPClient对象,并指定要连接的远程主机和端口号。 2. 使用TCPClient对象的ConnectAsync方法,以异步方式连接到远程主机。 3. 一旦连接成功,你可以使用TCPClient对象的GetStream方法获取与远程主机进行通信的网络流。 4. 对于发送数据,你可以使用网络流的WriteAsync方法以异步方式发送字节数据或字符串。 5. 对于接收数据,你可以使用网络流的ReadAsync方法以异步方式接收字节数据或字符串。 下面是一个简单的示例代码,展示了如何使用异步TCPClient发送和接收数据: ```csharp using System; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; public class AsyncTcpClient { public static async Task Main() { // 远程主机的IP地址和端口号 string ipAddress = "127.0.0.1"; int port = 12345; // 创建TCPClient对象并连接到远程主机 TcpClient client = new TcpClient(); await client.ConnectAsync(IPAddress.Parse(ipAddress), port); // 获取与远程主机进行通信的网络流 NetworkStream stream = client.GetStream(); // 发送数据 string messageToSend = "Hello, server!"; byte[] sendData = Encoding.UTF8.GetBytes(messageToSend); await stream.WriteAsync(sendData, 0, sendData.Length); // 接收数据 byte[] receiveData = new byte
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值