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类异步接收数据相关推荐

  1. C# 的TCPClient异步连接与异步读数据

    Socket的TCP通讯 一. socket的通讯原理 服务器端的步骤如下. (1)建立服务器端的Socket,开始侦听整个网络中的连接请求. (2)当检测到来自客户端的连接请求时,向客户端发送收到连 ...

  2. 使用DatagramSocket发送、接收数据(Socket之UDP套接字)

    2019独角兽企业重金招聘Python工程师标准>>> 创建一个DatagramSocket实例,并将该对象绑定到指定IP地址.指定端口. 通过上面三个构造器中的任意一个构造器即可创 ...

  3. Java中的Listener监听器与Ajax技术和Axios异步框架以及JSON传递接收数据

    Listener监听器与Ajax Listener 概念 Listener 表示监听器,是 JavaWeb 三大组件(Servlet.Filter.Listener)之一. 监听器可以监听就是在 ap ...

  4. 多串口接收数据并显示-自定义串口通信类-调用委托显示数据-保存数据-实例:10串口接收数据并显示加保存

    当时搜了很久,没咋都到合适的思路,就自己整理一份吧 大致实现的功能: 通过串口接收数据,进行解析,然后显示,或者保存数据: 主要:多个串口接收显示都能用: 大致思路: 1.新建一个类SerialPor ...

  5. C#利用SerialPort类对串口发送接收数据

    1.连接串口方法 SerialPort ser = new SerialPort();//也可以在工具箱中直接拖SerialPort控件 public void OpenCom() {try{//波特 ...

  6. 使用c#实现tcp的连接和发送接收数据

    最近有个小项目,需要调用装置的录波数据,使用tcp模式,在这里整理了下如何使用c#实现tcp连接并实现发送接收数据,分享出来. 我这里使用的tcpclient ,终端是tcpserver模式. 首先自 ...

  7. linux can总线接收数据串口打包上传_关于串口,你需要知道这些!!

    嵌入式设备在电路中交换信息的时候必须通过共享一个通用的协议.现在嵌入式系统中已经定义了数百种通信协议来实现数据交换,一般来说可以将其分为两类:并行或串行. 并行传输数据是指同时传输多个数据位,它们通常 ...

  8. 揭秘 React 异步获取数据的进化历程

    点击上方 前端瓶子君,关注公众号 回复算法,加入前端编程面试算法每日一题群 本篇文章,以模拟从『Hacker News API[1]』获取热门文章为例,通过一步步地代码优化和封装,阐述 React 异 ...

  9. iOS网络--同步,异步下载数据

    一. 这一节我们来学习几种下载数据的方式,目的在于学习同步,异步下载数据的知识. 二. 1.直接同步下载数据 //直接下载 同步下载 阻塞主线程 NSURL * url = [NSURL URLWit ...

  10. TcpClient类和TcpListener类

    TcpClient类和TcpListener类属于.NET框架下网络通信中的应用层类,为Socket通信提供了更简单,对用户更为友好的接口.应用层类比位于底层的Socket类提供了更高层次的抽象,封装 ...

最新文章

  1. 汇编语言中寻址方式[bx + idata]
  2. 微服务架构设计模式读书笔记
  3. UA MATH563 概率论的数学基础 中心极限定理17 0-1律的应用
  4. 使用MetaPost绘制流程图
  5. 这个“达芬奇”不一般!它是美国医生的好帮手
  6. Allegro 导装配图
  7. ACTS:首屈一指的软件测试策略是什么?
  8. python语言表白语句简单_简短的表白情话
  9. 公司注销又有新变化! 财务人要知道的公司注销新规定
  10. Ant Design Icon图标使用
  11. brctl 配置网桥
  12. PHASEN: A Phase-and-Harmonics-Aware Speech Enhancement Network
  13. 设计模式十四(中介者模式)
  14. ubuntu 16.04 成功安装网卡驱动
  15. logback 日志脱敏 隐藏PII信息
  16. 清空KindEditor编辑器内容
  17. 防止XSS漏洞攻击常用解决方案
  18. 第一次写策划书的感想
  19. mysql temporary_MySQL中临时表(TEMPORARY)
  20. 在线教育的内容研发和技术的迭代创新

热门文章

  1. 运放放大倍数计算公式_运放电路设计【1】
  2. Python 教程之再见 Excel你 Python 的spreadsheets电子表格
  3. 三菱plc编程2000个实例
  4. ubuntu WeChat 网易云音乐 Mac OS主题 wps 截图链接版
  5. QuantLib教程(三)BS模型、二叉树模型与欧式期权定价
  6. iOS Socket 客户端 基本使用
  7. 一、最简单的爬虫(python3 爬虫小白系列文章)
  8. java idea 免费_Java程序员看过来,IDEA 2020免费版本来了
  9. addr2line的使用
  10. 常见的思维模型:5W2H和2W1H