代码篇C#网络编程之tcp异步客户端
2015-09-13 14:04
615 查看
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同步客户端
- 代码篇C#网络编程之回调
- 代码篇C#网络编程之局域网聊天
- 5、Android网络编程
- windows 故障转移群集
- 公钥加密体系和https
- 蘑菇街的IM 网络层
- 网络协议
- 网络连接之——HttpClient(doGet和doPost)
- CCF 无线网络【最短路】
- http请求头
- netfilter/iptables全攻略
- Andrew Ng Machine Learning 专题【Neural Networks】下
- 关于升级到win10后的网络问题
- 未找到 Oracle 客户端和网络组件问题
- 【网络】(五)避免僵尸进程
- Android OkHttp完全解析 是时候来了解OkHttp了
- Http 协议,WebSocket 协议
- HTTP Content-type
- HTTP缓存相关头