本文主要是介绍TcpClient类异步接收数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
- 构造函数
- 属性
- 主要方法
- 流程
- TcpClient读取数据过程
- TcpClient连接
- TcpClient已经连接上NetworkStream读取
- NetworkStream已经读取完毕取出数据
- TcpClient发送数据流程
- TcpClient线程
- NetworkStream异步发送线程
- TcpClient读取数据过程
- 实例
- 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已经连接上,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;}
}
- 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类异步接收数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!