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);
}
TcpClient类异步接收数据相关推荐
- C# 的TCPClient异步连接与异步读数据
Socket的TCP通讯 一. socket的通讯原理 服务器端的步骤如下. (1)建立服务器端的Socket,开始侦听整个网络中的连接请求. (2)当检测到来自客户端的连接请求时,向客户端发送收到连 ...
- 使用DatagramSocket发送、接收数据(Socket之UDP套接字)
2019独角兽企业重金招聘Python工程师标准>>> 创建一个DatagramSocket实例,并将该对象绑定到指定IP地址.指定端口. 通过上面三个构造器中的任意一个构造器即可创 ...
- Java中的Listener监听器与Ajax技术和Axios异步框架以及JSON传递接收数据
Listener监听器与Ajax Listener 概念 Listener 表示监听器,是 JavaWeb 三大组件(Servlet.Filter.Listener)之一. 监听器可以监听就是在 ap ...
- 多串口接收数据并显示-自定义串口通信类-调用委托显示数据-保存数据-实例:10串口接收数据并显示加保存
当时搜了很久,没咋都到合适的思路,就自己整理一份吧 大致实现的功能: 通过串口接收数据,进行解析,然后显示,或者保存数据: 主要:多个串口接收显示都能用: 大致思路: 1.新建一个类SerialPor ...
- C#利用SerialPort类对串口发送接收数据
1.连接串口方法 SerialPort ser = new SerialPort();//也可以在工具箱中直接拖SerialPort控件 public void OpenCom() {try{//波特 ...
- 使用c#实现tcp的连接和发送接收数据
最近有个小项目,需要调用装置的录波数据,使用tcp模式,在这里整理了下如何使用c#实现tcp连接并实现发送接收数据,分享出来. 我这里使用的tcpclient ,终端是tcpserver模式. 首先自 ...
- linux can总线接收数据串口打包上传_关于串口,你需要知道这些!!
嵌入式设备在电路中交换信息的时候必须通过共享一个通用的协议.现在嵌入式系统中已经定义了数百种通信协议来实现数据交换,一般来说可以将其分为两类:并行或串行. 并行传输数据是指同时传输多个数据位,它们通常 ...
- 揭秘 React 异步获取数据的进化历程
点击上方 前端瓶子君,关注公众号 回复算法,加入前端编程面试算法每日一题群 本篇文章,以模拟从『Hacker News API[1]』获取热门文章为例,通过一步步地代码优化和封装,阐述 React 异 ...
- iOS网络--同步,异步下载数据
一. 这一节我们来学习几种下载数据的方式,目的在于学习同步,异步下载数据的知识. 二. 1.直接同步下载数据 //直接下载 同步下载 阻塞主线程 NSURL * url = [NSURL URLWit ...
- TcpClient类和TcpListener类
TcpClient类和TcpListener类属于.NET框架下网络通信中的应用层类,为Socket通信提供了更简单,对用户更为友好的接口.应用层类比位于底层的Socket类提供了更高层次的抽象,封装 ...
最新文章
- 汇编语言中寻址方式[bx + idata]
- 微服务架构设计模式读书笔记
- UA MATH563 概率论的数学基础 中心极限定理17 0-1律的应用
- 使用MetaPost绘制流程图
- 这个“达芬奇”不一般!它是美国医生的好帮手
- Allegro 导装配图
- ACTS:首屈一指的软件测试策略是什么?
- python语言表白语句简单_简短的表白情话
- 公司注销又有新变化! 财务人要知道的公司注销新规定
- Ant Design Icon图标使用
- brctl 配置网桥
- PHASEN: A Phase-and-Harmonics-Aware Speech Enhancement Network
- 设计模式十四(中介者模式)
- ubuntu 16.04 成功安装网卡驱动
- logback 日志脱敏 隐藏PII信息
- 清空KindEditor编辑器内容
- 防止XSS漏洞攻击常用解决方案
- 第一次写策划书的感想
- mysql temporary_MySQL中临时表(TEMPORARY)
- 在线教育的内容研发和技术的迭代创新