TcpClient类异步接收数据

2023-11-01 02:38

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

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

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获取或设置一个值,该值指示是否已建立连接。
Client获取或设置基础 Socket。
Connected获取一个值,该值指示 TcpClient 的基础 Socket 是否已连接到远程主机。

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,可绑定本地端口异步连接到目标IP和端口(BeginConnect)结束

TcpClient已经连接上,NetworkStream读取

TcpClient异步连接线程还原TcpClient获取NetworkStreamNetworkStream可读NetworkStream异步读取Buffer异步结束yesno

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

NetworkStream异步读取线程还原异步读取Buffer获取Buffer数据下一次异步读取开启异步读取结束

TcpClient发送数据流程

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

TcpClient线程

TcpClient发送取得NetworkStream获得数据,异步发送BeginWrite发送结束

NetworkStream异步发送线程

NetworkStream异步发送还原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;}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

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);}}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

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;}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

NetworkStream发送

if (TcpIsOpen)
{if (ns != null){//ns.Write(buffer, 0, buffer.Length);ns.BeginWrite(buffer, 0, buffer.Length, new AsyncCallback(StreamWriteCallBack), ns);}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
private void StreamWriteCallBack(IAsyncResult iar)
{NetworkStream ns = (NetworkStream)iar.AsyncState;ns.EndWrite(iar);
}

这篇关于TcpClient类异步接收数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

js异步提交form表单的解决方案

1.定义异步提交表单的方法 (通用方法) /*** 异步提交form表单* @param options {form:form表单元素,success:执行成功后处理函数}* <span style="color:#ff0000;"><strong>@注意 后台接收参数要解码否则中文会导致乱码 如:URLDecoder.decode(param,"UTF-8")</strong></span>

AsyncTask 异步任务解析

1:构建AsyncTask 子类的回调方法: A:doInBackground:   必须重写,所有的耗时操作都在这个里面进行; B: onPreExecute:     用户操作数据前的调用; 例如:显示一个进度条 等 ; C: onPostExecute:    当doInBackground 执行完成后;会自动把数据传给onPostExecute方法;也就是说:这个方法是处理返回的数据的方法

使用Node-API进行异步任务开发

一、Node-API异步任务机制概述         Node-API异步任务开发主要用于执行耗时操作的场景中使用,以避免阻塞主线程,确保应用程序的性能和响应效率。         1、应用场景: 文件操作:读取大型文件或执行复杂的文件操作时,可以使用异步工作项来避免阻塞主线程。网络请求:当需要进行网络请求并等待响应时,可以使用异步工作项来避免阻塞主线程,从而提高应用程序的响应性能。数据库操

【JavaScript】异步操作:Promise对象

文章目录 1 概述2 Promise 对象的状态3 Promise 构造函数4 Promise.prototype.then()5 then() 用法辨析6 微任务 1 概述 Promise 对象是 JavaScript 的异步操作解决方案,为异步操作提供统一接口。它起到代理作用,充当异步操作与回调函数之间的中介,使得异步操作具备同步操作的接口。 Promise 的设计思想是,

线程池创建线程实现异步执行

创建线程池 private final ThreadPoolExecutor executorService = new ThreadPoolExecutor(10, 100, 1L, TimeUnit.MINUTES, new ArrayBlockingQueue<>(100)); Runnable runnable = () -> { //线程体 }; //执行线程 executorSer

ajax xmlhttprequest异步获取后台数据(二)

前台代码: <%@ Page Title="主页" Language="C#"  AutoEventWireup="true"     CodeBehind="Default.aspx.cs" Inherits="ajax测试二._Default" %> <html> <head> <script type="text/javascript">     function getHttpObj(

io本质+io效率本质,5种io模型(介绍,异步/同步区别,阻塞/非阻塞区别)

目录 5种io模型 io引入 io的本质 io效率的本质 模型引入 以钓鱼为例 效率最高的方式 异步io和同步io的区别 阻塞式和非阻塞式io的区别 介绍 阻塞式io ​编辑 非阻塞式io ​编辑 信号驱动式io ​编辑 多路转接/复用 ​编辑 异步io 5种io模型 io引入 io的本质 以read ,write为例: 如果底层缓冲区没有数据

微软C#套接字异步通信代码

Asynchronous Server Socket Example.NET Framework 4 其他版本 The following example program creates a server that receives connection requests from clients. The server is built with an asynchronous socket,

基于PI控制算法的异步感应电机转速控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述        基于PI控制算法的异步感应电机转速控制系统simulink建模与仿真。PI控制器是一种经典的线性控制器,它通过将控制量的比例部分和积分部分相结合来实现对系统输出的调节。比例部分用于快速响应偏差,而积分部分则用于消除稳态误差。 2.系统仿真结果 (完整程

关于Qt在子线程中使用通讯时发生无法接收数据的情况

在多线程应用中,串口通讯或TCP通讯的场景常常涉及到持续的读写操作,如果子线程处理不当,可能会导致信号阻塞问题。本文将通过串口通讯或TCP通讯为例,详细解释如何在多线程环境中避免信号阻塞,并提供代码示例。 1. 问题背景 假设我们在一个应用程序中使用多线程处理串口或TCP通讯,通常会在子线程中实现持续的数据读取。为了确保实时处理数据,常见的做法是在子线程的 run() 方法中使用 while