您的位置:首页 > 理论基础 > 计算机网络

代码篇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();
        }
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: