using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Threading;
using System.Net.Sockets;
namespace _004_异步tcpclient
{
public partial class Form1 : Form
{
//---接收消息回调声明
private delegate void ReceiveMsgCallBack(out string text);
private ReceiveMsgCallBack receiveMsgCallBack;
//---修改进度条的回调
private delegate void SetProgressBarValueCallBack();
private SetProgressBarValueCallBack setProgressBarValueCallBack;
//--接收消息列表回调
private delegate void ShowMsgCallBack(string text);
private ShowMsgCallBack showMsgCallBack;
// ---TCP客户端
private TcpClient myTcpClient;
//---网络数据流
private NetworkStream networkstream;
//--消息接受线程
private Thread receiveMessageThread;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//---初始化回调
receiveMsgCallBack = new ReceiveMsgCallBack(ReceiveMsg);
setProgressBarValueCallBack = new SetProgressBarValueCallBack(SetProgressBarValue);
showMsgCallBack = new ShowMsgCallBack(ShowMsg);
}
//---连接按钮被单击事件
private void btn_connect_Click(object sender, EventArgs e)
{
//---创建异步回调
AsyncCallback connectAsyncCallBack = new AsyncCallback(ConnectToServer);
//--实例化客户端
myTcpClient = new TcpClient();
//--发起异步连接
IAsyncResult result = myTcpClient.BeginConnect(IPAddress.Parse(textbox_serverIP.Text), Convert.ToInt32(textbox_serverPort.Text), connectAsyncCallBack, myTcpClient);
//----弹出提示。
MessageBox.Show("异步发起连接");
}
//---连接异步回调方法
private void ConnectToServer( IAsyncResult iar)
{
try
{
//----获取TCPClient
myTcpClient = (TcpClient)iar.AsyncState;
//---结束异步操作
myTcpClient.EndConnect(iar);
//--绑定网络数据流
networkstream = myTcpClient.GetStream();
//---启动接收消息线程
receiveMessageThread = new Thread(ReceiveMessage);
receiveMessageThread.Start();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
///---消息接收线程
private void ReceiveMessage()
{
while(true)
{
try
{
///--传入异步操作的变量
string receiveMsg;
//--开始异步接收消息
IAsyncResult result = receiveMsgCallBack.BeginInvoke(out receiveMsg, null, null);
///---循环滚动进度条
while(!result.IsCompleted)
{
//--
progressbar_progressbar.Invoke(setProgressBarValueCallBack);
//--
Thread.Sleep(100);
}
//---结束异步
receiveMsgCallBack.EndInvoke(out receiveMsg, result);
//--
if (null != receiveMsg)
{
listbox_receiveMessage.Invoke(showMsgCallBack, receiveMsg);
}
}
catch (ThreadAbortException)
{
//---人为中断抛出的异常。
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
//---释放系统相关资源
if (null != networkstream)
{
networkstream.Dispose();
}
}
}
}
//----接收消息的被委托的方法
private void ReceiveMsg(out string text)
{
text = null;
try
{
byte[] getData = new byte[1024];
networkstream.Read(getData, 0, getData.Length);
text = Encoding.Default.GetString(getData);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
//--释放系统资源
if (null != networkstream)
{
networkstream.Dispose();
}
}
}
///--修改进度条被委托的方法
private void SetProgressBarValue()
{
//---判断进度条是否到达最大值
if (progressbar_progressbar.Maximum > progressbar_progressbar.Value)
{
//---未到最大值. +1
progressbar_progressbar.Value++;
}
else
{
//--达到最大值
progressbar_progressbar.Value = 0;
}
}
///--显示消息到列表被委托的方法
private void ShowMsg(string text)
{
listbox_receiveMessage.Items.Add(text);
}
//--发送消息按钮被单击事件
private void btn_send_Click(object sender, EventArgs e)
{
byte[] sendData = Encoding.Default.GetBytes(textbox_sendMessage.Text);
networkstream.Write(sendData, 0, sendData.Length);
}
private void btn_disconnect_Click(object sender, EventArgs e)
{
receiveMessageThread.Abort();
}
}
}
代码篇C#网络编程之tcp异步客户端
最新推荐文章于 2023-12-04 17:09:51 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)