C#网络编程(四)----简易聊天窗口

TcpListner和TcpClient使用(同步)
服务端

在这里插入图片描述

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading;

namespace WindowsFormsApplication4
{
    public partial class Form1 : Form
    {

        
        private static string serverIp = "127.0.0.1";
        private static int serverPort = 8999;
        private static TcpClient clientTcpClient;

        private delegate void ShowMsg(string msg);
        private ShowMsg showMsg;
     
        private delegate void ShowStatusText(string text);
        private ShowStatusText showStatusText;

        private delegate void ShowProgress(int value);
        private ShowProgress showProgress;


        private BinaryReader br;
        private BinaryWriter bw;



        public Form1()
        {
            InitializeComponent();

            try
            {

                // 委托绑定
                showMsg = new ShowMsg(showMsgToView);
                showStatusText = new ShowStatusText(setStatusToLabel);
                showProgress = new ShowProgress(setStatusToProgress);




            }
            catch (Exception e)
            {

                handleError(e);


            }


            
            

        }

        // 发送信息按钮
        private void btnSendMsg_Click(object sender, EventArgs e)
        {



            

            try{



            // 获取要发送的信息
            string msg = getMsgWhichSend();

            if(msg.Length==0){

                MessageBox.Show("不能发送空消息");
                return;
                    
            }

            ThreadPool.QueueUserWorkItem(new WaitCallback(sendMsg), msg);

     

            }catch(Exception err){

                
                handleError(err);


            }



        }


        // 接收信息按钮点击
        private void btnReceiveMsg_Click(object sender, EventArgs e)
        {


            try
            {




                ThreadPool.QueueUserWorkItem(new WaitCallback(receiveMsg));



            }
            catch (Exception err)
            {


                handleError(err);


            }

        }


        // 


        // 获取要发送的信息
        private string getMsgWhichSend()
        {

            return rtbInputMsg.Text;
            
        }


        // 错误处理
        private void handleError(Exception e){

            showStatusText("异常");

            MessageBox.Show("发送错误:"+e.Message);

            if (br != null)
                {

                    br.Dispose();
                    br.Close();
                }


                if (bw != null)
                {

                    bw.Dispose();
                    bw.Close();
                }


                if (clientTcpClient != null)
                {

                    clientTcpClient.Close();
                }
        }



        // 显示信息
        private void showMsgToView(string msg)
        {
            rtbShowMsg.AppendText(msg);
            rtbShowMsg.ScrollToCaret();

        }

        // 设置状态
        private void setStatusToLabel(string status)
        {
            lblStatus.Text = status;

        }

        // 设置进度条状态
        private void setStatusToProgress(int value)
        {

            progressBar.Value = value;
            
        }

        // 清空输入区
        private void resetINput(){


            rtbInputMsg.Clear();
        }


        // 发送信息
        private void sendMsg(object msg)
        {



            try{

            if (clientTcpClient != null)
            {

                lblStatus.Invoke(showStatusText, "发送中");
                progressBar.Invoke(showProgress, 1);

                bw.Write(msg.ToString());
                bw.Flush();

                lblStatus.Invoke(showStatusText, "发送完毕");
                progressBar.Invoke(showProgress, 100);



            }
            else
            {
                MessageBox.Show("没有客户端连接");
            }

            }
            catch (Exception e)
            {


                handleError(e);

            }





        }

        // 接收信息
        private void receiveMsg(object state)
        {
            try{

                if (clientTcpClient != null)
                {

                    lblStatus.Invoke(showStatusText, "接收中");
                    progressBar.Invoke(showProgress, 1);

                    string msg = br.ReadString();

                    rtbShowMsg.Invoke(showMsg, msg);

                    lblStatus.Invoke(showStatusText, "接收完毕");
                    progressBar.Invoke(showProgress, 100);

                }
                else
                {

                    MessageBox.Show("请先创建连接");



                }


            
            
            }catch(Exception e){
            
            
                handleError(e);

            
            }

            


        }


        // 启动监听点击事件
        private void tslStart_Click(object sender, EventArgs e)
        {

            try
            {



                Thread startThread = new Thread(new ThreadStart(startListen));
                startThread.Start();
       
    

            }
            catch (Exception err)
            {

                handleError(err);

            }




        }



        // 启动连接
        private void startListen()
        {
            try
            {

   
                lblStatus.Invoke(showStatusText, "准备中");
                progressBar.Invoke(showProgress, 1);
               

                IPAddress serverIpAddress = IPAddress.Parse(serverIp);

                TcpListener serverTcpListner = new TcpListener(serverIpAddress, serverPort);
                serverTcpListner.Start();

                lblStatus.Invoke(showStatusText, "准备就绪");
                progressBar.Invoke(showProgress, 100);



                clientTcpClient = serverTcpListner.AcceptTcpClient();
                MessageBox.Show("客户端接入");

                NetworkStream nStream = clientTcpClient.GetStream();
                br = new BinaryReader(nStream);
                bw = new BinaryWriter(nStream);

            }
            catch(Exception err)
            {
                
                handleError(err);

            }


        }

        


        // 停止监听点击事件
        private void tslStop_Click(object sender, EventArgs e)
        {

            try
            {

                Thread stopThread = new Thread(new ThreadStart(stopConnect));
                stopThread.Start();


            }
            catch (Exception err)
            {

                handleError(err);

            }


        }


        // 停止服务
        private void stopConnect()
        {


            try
            {


                lblStatus.Invoke(showStatusText, "关闭中");
                progressBar.Invoke(showProgress, 1);

                if (br != null)
                {

                    br.Dispose();
                    br.Close();
                }


                if (bw != null)
                {

                    bw.Dispose();
                    bw.Close();
                }


                if (clientTcpClient != null)
                {

                    clientTcpClient.Close();
                }

                lblStatus.Invoke(showStatusText, "完毕");
                progressBar.Invoke(showProgress, 100);


            }
            catch (Exception e)
            {

                handleError(e);
            }
        }

    }
}

客户端

在这里插入图片描述

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace WindowsFormsApplication4
{
    public partial class Form1 : Form
    {


        private static string serverIp = "";
        private static int serverPort = -1;
        private static TcpClient clientTcpClient;

        private delegate void ShowMsg(string msg);
        private ShowMsg showMsg;

        private delegate void ShowStatusText(string text);
        private ShowStatusText showStatusText;

        private delegate void ShowProgress(int value);
        private ShowProgress showProgress;


        private BinaryReader br;
        private BinaryWriter bw;

        public Form1()
        {
            InitializeComponent();



            try
            {

                // 委托绑定
                showMsg = new ShowMsg(showMsgToView);
                showStatusText = new ShowStatusText(setStatusToLabel);
                showProgress = new ShowProgress(setStatusToProgress);




            }
            catch (Exception e)
            {

                handleError(e);


            }

        }


        // 连接按钮点击事件
        private void btnConnect_Click(object sender, EventArgs e)
        {

            serverIp = txtIp.Text;
            

            if (serverIp==null||"".Equals(serverIp.Trim()))
            {
                MessageBox.Show("请输入ip地址");

                return;
            }

            if (serverPort == null)
            {
               MessageBox.Show("请输入端口号");
               return;
            }
            else
            {
                try
                {

                    serverPort = int.Parse(txtport.Text);

                }
                catch (Exception err)
                {
                    MessageBox.Show("请输入正确的端口号");
                    return;

                }
            }

            try
            {

                Thread startThread = new Thread(new ThreadStart(startConnect));
                startThread.Start();



            }
            catch (Exception err)
            {

                handleError(err);

            }


        }


        // 开始连接
        private void startConnect()
        {

            try
            {
                lblStatus.Invoke(showStatusText, "连接中");
                progressBar.Invoke(showProgress, 1);


                clientTcpClient = new TcpClient();


                clientTcpClient.Connect(serverIp, serverPort);

                NetworkStream stream = clientTcpClient.GetStream();
                br = new BinaryReader(stream);
                bw = new BinaryWriter(stream);

                lblStatus.Invoke(showStatusText, "连接成功");
                progressBar.Invoke(showProgress, 100);


            }
            catch (Exception err)
            {


                handleError(err);

            }


        }



        // 发送信息
        private void sendMsg(object msg)
        {



            try
            {

                //if (clientTcpClient != null)
                //{


                lblStatus.Invoke(showStatusText, "发送中");
                progressBar.Invoke(showProgress, 1);

                bw.Write(msg.ToString());
                bw.Flush();

                lblStatus.Invoke(showStatusText, "发送完毕");
                progressBar.Invoke(showProgress, 100);



                //}
                //else
                //{

                //    MessageBox.Show("请先建立连接");
                //}





            }
            catch (Exception e)
            {


                handleError(e);

            }


        }

        // 接收信息
        private void receiveMsg(object state)
        {
            try
            {

                if (clientTcpClient != null)
                {

                    lblStatus.Invoke(showStatusText, "接收中");
                    progressBar.Invoke(showProgress, 1);

                    string msg = br.ReadString();

                    rtbShowMsg.Invoke(showMsg, msg);
                    //MessageBox.Show(msg);

                    lblStatus.Invoke(showStatusText, "接收完毕");
                    progressBar.Invoke(showProgress, 100);

                }
                else
                {

                    MessageBox.Show("请先创建连接");



                }




            }
            catch (Exception e)
            {


                handleError(e);


            }




        }


        // 错误处理
        private void handleError(Exception e)
        {

            showStatusText("异常");

            MessageBox.Show("发送错误:" + e.Message);

            if (br != null)
            {

                br.Dispose();
                br.Close();
            }


            if (bw != null)
            {

                bw.Dispose();
                bw.Close();
            }


            if (clientTcpClient != null)
            {

                clientTcpClient.Close();
            }
        }



        // 显示信息
        private void showMsgToView(string msg)
        {
            rtbShowMsg.AppendText(msg);
            rtbShowMsg.ScrollToCaret();

        }


        // 设置状态
        private void setStatusToLabel(string status)
        {
            lblStatus.Text = status;

        }

        // 设置进度条状态
        private void setStatusToProgress(int value)
        {

            progressBar.Value = value;

        }

        // 清空输入区
        private void resetINput()
        {


            rtbInputMsg.Clear();
        }






        // 信息发送按钮
        private void btnSendMsg_Click(object sender, EventArgs e)
        {


            try
            {



                // 获取要发送的信息
                string msg = getMsgWhichSend();

                if (msg.Length == 0)
                {

                    MessageBox.Show("不能发送空消息");
                    return;

                }

                ThreadPool.QueueUserWorkItem(new WaitCallback(sendMsg),msg);



            }
            catch (Exception err)
            {


                handleError(err);


            }

        }


        // 发送信息
        private void sendMsg(String msg)
        {



            try
            {

                if (clientTcpClient != null)
                {


                    lblStatus.Invoke(showStatusText, "发送中");
                    progressBar.Invoke(showProgress, 1);

                    bw.Write(msg.ToString());
                    bw.Flush();

                    lblStatus.Invoke(showStatusText, "发送完毕");
                    progressBar.Invoke(showProgress, 100);



                }
                else
                {

                    MessageBox.Show("请先建立连接");
                }





            }
            catch (Exception e)
            {


                handleError(e);

            }


        }

        // 接收信息
        private void receiveMsg()
        {
            try
            {

                if (clientTcpClient != null)
                {

                    //lblStatus.Invoke(showStatusText, "接收中");
                    //progressBar.Invoke(showProgress, 1);

                    string msg = br.ReadString();
                    MessageBox.Show(msg);

                    //rtbShowMsg.Invoke(showMsg, msg);

                    //lblStatus.Invoke(showStatusText, "接收完毕");
                    //progressBar.Invoke(showProgress, 100);

                }
                else
                {

                    MessageBox.Show("请先创建连接");



                }




            }
            catch (Exception e)
            {


                handleError(e);


            }




        }

        private void btnReceiveMsg_Click(object sender, EventArgs e)
        {

            try
            {




                ThreadPool.QueueUserWorkItem(new WaitCallback(receiveMsg));
                //receiveMsg();


            }
            catch (Exception err)
            {


                handleError(err);


            }


        }


        // 获取要发送的信息
        private string getMsgWhichSend()
        {

            return rtbInputMsg.Text;

        }

        private void btnDisConnect_Click(object sender, EventArgs e)
        {


            lblStatus.Invoke(showStatusText, "正在断开");
            progressBar.Invoke(showProgress, 1);
            if (br != null)
            {

                br.Dispose();
                br.Close();
            }


            if (bw != null)
            {

                bw.Dispose();
                bw.Close();
            }


            if (clientTcpClient != null)
            {

                clientTcpClient.Close();
            }

            lblStatus.Invoke(showStatusText, "未连接");
            progressBar.Invoke(showProgress, 100);
       
        }



    }
}

TcpListner和TcpClient使用(异步)
服务端
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading;

namespace WindowsFormsApplication4
{
    public partial class Form1 : Form
    {

        
        private static string serverIp = "127.0.0.1";
        private static int serverPort = 8999;
        private static TcpClient clientTcpClient;

        private static TcpListener serverTcpListner;

        private delegate void ShowMsg(string msg);
        private ShowMsg showMsg;
     
        private delegate void ShowStatusText(string text);
        private ShowStatusText showStatusText;

        private delegate void ShowProgress(int value);
        private ShowProgress showProgress;

        private delegate void ReceiveMsgDelegate(out string msg);
        private ReceiveMsgDelegate receiveMsgDelegate;

        private delegate void SendMsgDelegate(string msg);
        private SendMsgDelegate sendMsgDelegate;


        private BinaryReader br;
        private BinaryWriter bw;



        public Form1()
        {
            InitializeComponent();

            try
            {

                // 委托绑定
                showMsg = new ShowMsg(showMsgToView);
                showStatusText = new ShowStatusText(setStatusToLabel);
                showProgress = new ShowProgress(setStatusToProgress);
                receiveMsgDelegate = new ReceiveMsgDelegate(asyncRecvMsg);

                sendMsgDelegate = new SendMsgDelegate(asyncSendMsg);




            }
            catch (Exception e)
            {

                handleError(e);


            }


            
            

        }

        // 发送信息按钮
        private void btnSendMsg_Click(object sender, EventArgs e)
        {



            

            try{



            // 获取要发送的信息
            string msg = getMsgWhichSend();

            if(msg.Length==0){

                MessageBox.Show("不能发送空消息");
                return;
                    
            }

            ThreadPool.QueueUserWorkItem(new WaitCallback(sendMsg), msg);

     

            }catch(Exception err){

                
                handleError(err);


            }



        }


        // 接收信息按钮点击
        private void btnReceiveMsg_Click(object sender, EventArgs e)
        {


            try
            {




                ThreadPool.QueueUserWorkItem(new WaitCallback(receiveMsg));



            }
            catch (Exception err)
            {


                handleError(err);


            }

        }


        // 异步获取信息
        private void asyncRecvMsg(out string msg)
        {
            msg = null;

            //try
            //{

            //}
            //catch (Exception e)
            //{



            //}

            if(br!=null)
            {

                msg = br.ReadString();



            }


        }
        

        // 异步发送信息
        private void asyncSendMsg(string msg)
        {


            //try
            //{


            //}
            //catch (Exception e)
            //{



            //}

            if (bw != null)
            {

                bw.Write(msg);


            }

        }



        // 获取要发送的信息
        private string getMsgWhichSend()
        {

            return rtbInputMsg.Text;
            
        }


        // 错误处理
        private void handleError(Exception e){

            showStatusText("异常");

            MessageBox.Show("发送错误:"+e.Message);

            if (br != null)
                {

                    br.Dispose();
                    br.Close();
                }


                if (bw != null)
                {

                    bw.Dispose();
                    bw.Close();
                }


                if (clientTcpClient != null)
                {

                    clientTcpClient.Close();
                }
        }



        // 显示信息
        private void showMsgToView(string msg)
        {
            rtbShowMsg.AppendText(msg);
            rtbShowMsg.ScrollToCaret();

        }

        // 设置状态
        private void setStatusToLabel(string status)
        {
            lblStatus.Text = status;

        }

        // 设置进度条状态
        private void setStatusToProgress(int value)
        {

            progressBar.Value = value;
            
        }

        // 清空输入区
        private void resetINput(){


            rtbInputMsg.Clear();
        }


        // 发送信息
        private void sendMsg(object msg)
        {



            try{

            if (clientTcpClient != null)
            {

                lblStatus.Invoke(showStatusText, "发送中");
                progressBar.Invoke(showProgress, 1);

                //bw.Write(msg.ToString());
                //bw.Flush();


                IAsyncResult result =  sendMsgDelegate.BeginInvoke(msg.ToString(), null, null);

                // 异步操作未完成
                while (result.IsCompleted == false)
                {


                    Thread.Sleep(500);
                    
                }


                sendMsgDelegate.EndInvoke(result);


                lblStatus.Invoke(showStatusText, "发送完毕");
                progressBar.Invoke(showProgress, 100);





            }
            else
            {
                MessageBox.Show("没有客户端连接");
            }

            }
            catch (Exception e)
            {


                handleError(e);

            }





        }

        // 接收信息
        private void receiveMsg(object state)
        {
            try{

                if (clientTcpClient != null)
                {

                    lblStatus.Invoke(showStatusText, "接收中");
                    progressBar.Invoke(showProgress, 1);

                    //string msg = br.ReadString();

                    //rtbShowMsg.Invoke(showMsg, msg);

                    string msg = null ;

                    IAsyncResult result =  receiveMsgDelegate.BeginInvoke(out msg, null, null);

                    while (result.IsCompleted == false)
                    {

                        int j = 20;
                        j += 20;

                        
                        if (j == 100) j = 10;

                        progressBar.Invoke(showProgress, j);

                        Thread.Sleep(500);

                        
                    }




                    receiveMsgDelegate.EndInvoke(out msg, result);

                    if (msg != null)
                    {


                        rtbShowMsg.Invoke(showMsg, msg);

                        lblStatus.Invoke(showStatusText, "接收完毕");
                        progressBar.Invoke(showProgress, 100);

                    }
                    else
                    {


                        rtbShowMsg.Invoke(showMsg, msg);

                        lblStatus.Invoke(showStatusText, "接收失败");
                        progressBar.Invoke(showProgress, 0);

                    }




                }
                else
                {

                    MessageBox.Show("请先创建连接");



                }


            
            
            }catch(Exception e){
            
            
                handleError(e);

            
            }

            


        }


        // 启动监听点击事件
        private void tslStart_Click(object sender, EventArgs e)
        {

            try
            {



                Thread startThread = new Thread(new ThreadStart(startListen));
                startThread.Start();
       
    

            }
            catch (Exception err)
            {

                handleError(err);

            }




        }



        // 启动连接
        private void startListen()
        {
            try
            {

   


            }
            catch(Exception err)
            {
                
                handleError(err);

            }

        AsyncCallback acceptCallBack = new AsyncCallback(acceptClientConnect);

        serverTcpListner = new TcpListener(IPAddress.Parse(serverIp), serverPort);

        serverTcpListner.Start();


        lblStatus.Invoke(showStatusText, "准备中");
        progressBar.Invoke(showProgress, 1);

        IAsyncResult result = serverTcpListner.BeginAcceptTcpClient(acceptCallBack, serverTcpListner);

        lblStatus.Invoke(showStatusText, "准备就绪");
        progressBar.Invoke(showProgress, 100);
       
        

        //TcpListener serverTcpListner = new TcpListener(serverIpAddress, serverPort);
        //serverTcpListner.Start();




        //clientTcpClient = serverTcpListner.AcceptTcpClient();
        //MessageBox.Show("客户端接入");


        

        //NetworkStream nStream = clientTcpClient.GetStream();
        //br = new BinaryReader(nStream);
        //bw = new BinaryWriter(nStream);


        }


        // 异步处理客户连接请求
        private void acceptClientConnect(IAsyncResult iar)
        {

            MessageBox.Show("进入处理了");


            serverTcpListner = (TcpListener)iar.AsyncState;
            clientTcpClient = serverTcpListner.EndAcceptTcpClient(iar);

            if (clientTcpClient != null)
            {


                NetworkStream stream = clientTcpClient.GetStream();
                br = new BinaryReader(stream);
                bw = new BinaryWriter(stream);

                lblStatus.Invoke(showStatusText, "已被连接");
                progressBar.Invoke(showProgress, 100);

            }
            else
            {



                lblStatus.Invoke(showStatusText, "连接异常");
                progressBar.Invoke(showProgress, 100);


            }
            






        }



        


        // 停止监听点击事件
        private void tslStop_Click(object sender, EventArgs e)
        {

            try
            {

                Thread stopThread = new Thread(new ThreadStart(stopConnect));
                stopThread.Start();


            }
            catch (Exception err)
            {

                handleError(err);

            }


        }


        // 停止服务
        private void stopConnect()
        {


            try
            {


                lblStatus.Invoke(showStatusText, "关闭中");
                progressBar.Invoke(showProgress, 1);

                if (br != null)
                {

                    br.Dispose();
                    br.Close();
                }


                if (bw != null)
                {

                    bw.Dispose();
                    bw.Close();
                }


                if (clientTcpClient != null)
                {

                    clientTcpClient.Close();
                }

                lblStatus.Invoke(showStatusText, "完毕");
                progressBar.Invoke(showProgress, 100);


            }
            catch (Exception e)
            {

                handleError(e);
            }
        }

    }
}

客户端
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace WindowsFormsApplication4
{
    public partial class Form1 : Form
    {


        private static string serverIp = "";
        private static int serverPort = -1;
        private static TcpClient clientTcpClient;

        private delegate void ShowMsg(string msg);
        private ShowMsg showMsg;

        private delegate void ShowStatusText(string text);
        private ShowStatusText showStatusText;

        private delegate void ShowProgress(int value);
        private ShowProgress showProgress;


        private delegate void ReceiveMsgDelegate(out string msg);
        private ReceiveMsgDelegate receiveMsgDelegate;

        private delegate void SendMsgDelegate(string msg);
        private SendMsgDelegate sendMsgDelegate;


        private BinaryReader br;
        private BinaryWriter bw;

        public Form1()
        {
            InitializeComponent();



            try
            {

                // 委托绑定
                showMsg = new ShowMsg(showMsgToView);
                showStatusText = new ShowStatusText(setStatusToLabel);
                showProgress = new ShowProgress(setStatusToProgress);
                receiveMsgDelegate = new ReceiveMsgDelegate(asyncRecvMsg);

                sendMsgDelegate = new SendMsgDelegate(asyncSendMsg);



            }
            catch (Exception e)
            {

                handleError(e);


            }

        }

        // 异步获取信息
        private void asyncRecvMsg(out string msg)
        {
            msg = null;

            //try
            //{

            //}
            //catch (Exception e)
            //{



            //}

            if (br != null)
            {

                msg = br.ReadString();



            }


        }


        // 异步发送信息
        private void asyncSendMsg(string msg)
        {


            //try
            //{


            //}
            //catch (Exception e)
            //{



            //}

            if (bw != null)
            {

                bw.Write(msg);


            }

        }


        // 连接按钮点击事件
        private void btnConnect_Click(object sender, EventArgs e)
        {

            serverIp = txtIp.Text;
            

            if (serverIp==null||"".Equals(serverIp.Trim()))
            {
                MessageBox.Show("请输入ip地址");

                return;
            }

            if (serverPort == null)
            {
               MessageBox.Show("请输入端口号");
               return;
            }
            else
            {
                try
                {

                    serverPort = int.Parse(txtport.Text);

                }
                catch (Exception err)
                {
                    MessageBox.Show("请输入正确的端口号");
                    return;

                }
            }

            try
            {

                Thread startThread = new Thread(new ThreadStart(startConnect));
                startThread.Start();



            }
            catch (Exception err)
            {

                handleError(err);

            }


        }


        // 开始连接
        private void startConnect()
        {

            try
            {
                lblStatus.Invoke(showStatusText, "连接中");
                progressBar.Invoke(showProgress, 1);

                AsyncCallback asyncCallBack = new AsyncCallback(asyncConnectCallback);


                clientTcpClient = new TcpClient();

                clientTcpClient.BeginConnect(IPAddress.Parse(serverIp), serverPort, asyncCallBack,clientTcpClient);


                //clientTcpClient.Connect(serverIp, serverPort);

                //NetworkStream stream = clientTcpClient.GetStream();
                //br = new BinaryReader(stream);
                //bw = new BinaryWriter(stream);

                




            }
            catch (Exception err)
            {


                handleError(err);

            }


        }


        private void asyncConnectCallback(IAsyncResult iar)
        {

            try
            {


            }
            catch (Exception e)
            {

            }

            clientTcpClient = (TcpClient)iar.AsyncState;

            clientTcpClient.EndConnect(iar);

            NetworkStream stream = clientTcpClient.GetStream();

            br = new BinaryReader(stream);
            bw = new BinaryWriter(stream);


            lblStatus.Invoke(showStatusText, "连接成功");
            progressBar.Invoke(showProgress, 100);

        }



        // 发送信息
        private void sendMsg(object msg)
        {


            try
            {

                if (clientTcpClient != null)
                {

                    lblStatus.Invoke(showStatusText, "发送中");
                    progressBar.Invoke(showProgress, 1);

                    //bw.Write(msg.ToString());
                    //bw.Flush();


                    IAsyncResult result = sendMsgDelegate.BeginInvoke(msg.ToString(), null, null);

                    // 异步操作未完成
                    while (result.IsCompleted == false)
                    {


                        Thread.Sleep(500);

                    }


                    sendMsgDelegate.EndInvoke(result);


                    lblStatus.Invoke(showStatusText, "发送完毕");
                    progressBar.Invoke(showProgress, 100);





                }
                else
                {
                    MessageBox.Show("没有客户端连接");
                }

            }
            catch (Exception e)
            {


                handleError(e);

            }

        }

        // 接收信息
        private void receiveMsg(object state)
        {
            try
            {

                if (clientTcpClient != null)
                {

                    lblStatus.Invoke(showStatusText, "接收中");
                    progressBar.Invoke(showProgress, 1);

                    //string msg = br.ReadString();

                    //rtbShowMsg.Invoke(showMsg, msg);

                    string msg = null;

                    IAsyncResult result = receiveMsgDelegate.BeginInvoke(out msg, null, null);

                    while (result.IsCompleted == false)
                    {

                        int j = 20;
                        j += 20;


                        if (j == 100) j = 10;

                        progressBar.Invoke(showProgress, j);

                        Thread.Sleep(500);


                    }




                    receiveMsgDelegate.EndInvoke(out msg, result);

                    if (msg != null)
                    {


                        rtbShowMsg.Invoke(showMsg, msg);

                        lblStatus.Invoke(showStatusText, "接收完毕");
                        progressBar.Invoke(showProgress, 100);

                    }
                    else
                    {


                        rtbShowMsg.Invoke(showMsg, msg);

                        lblStatus.Invoke(showStatusText, "接收失败");
                        progressBar.Invoke(showProgress, 0);

                    }




                }
                else
                {

                    MessageBox.Show("请先创建连接");



                }




            }
            catch (Exception e)
            {


                handleError(e);


            }




        }


        // 错误处理
        private void handleError(Exception e)
        {

            showStatusText("异常");

            MessageBox.Show("发送错误:" + e.Message);

            if (br != null)
            {

                br.Dispose();
                br.Close();
            }


            if (bw != null)
            {

                bw.Dispose();
                bw.Close();
            }


            if (clientTcpClient != null)
            {

                clientTcpClient.Close();
            }
        }



        // 显示信息
        private void showMsgToView(string msg)
        {
            rtbShowMsg.AppendText(msg);
            rtbShowMsg.ScrollToCaret();

        }


        // 设置状态
        private void setStatusToLabel(string status)
        {
            lblStatus.Text = status;

        }

        // 设置进度条状态
        private void setStatusToProgress(int value)
        {

            progressBar.Value = value;

        }

        // 清空输入区
        private void resetINput()
        {


            rtbInputMsg.Clear();
        }






        // 信息发送按钮
        private void btnSendMsg_Click(object sender, EventArgs e)
        {


            try
            {



                // 获取要发送的信息
                string msg = getMsgWhichSend();

                if (msg.Length == 0)
                {

                    MessageBox.Show("不能发送空消息");
                    return;

                }

                ThreadPool.QueueUserWorkItem(new WaitCallback(sendMsg),msg);



            }
            catch (Exception err)
            {


                handleError(err);


            }

        }


        // 发送信息
        private void sendMsg(String msg)
        {



            try
            {

                if (clientTcpClient != null)
                {


                    lblStatus.Invoke(showStatusText, "发送中");
                    progressBar.Invoke(showProgress, 1);

                    bw.Write(msg.ToString());
                    bw.Flush();

                    lblStatus.Invoke(showStatusText, "发送完毕");
                    progressBar.Invoke(showProgress, 100);



                }
                else
                {

                    MessageBox.Show("请先建立连接");
                }





            }
            catch (Exception e)
            {


                handleError(e);

            }


        }

        // 接收信息
        private void receiveMsg()
        {
            try
            {

                if (clientTcpClient != null)
                {

                    //lblStatus.Invoke(showStatusText, "接收中");
                    //progressBar.Invoke(showProgress, 1);

                    string msg = br.ReadString();
                    MessageBox.Show(msg);

                    //rtbShowMsg.Invoke(showMsg, msg);

                    //lblStatus.Invoke(showStatusText, "接收完毕");
                    //progressBar.Invoke(showProgress, 100);

                }
                else
                {

                    MessageBox.Show("请先创建连接");



                }




            }
            catch (Exception e)
            {


                handleError(e);


            }




        }

        private void btnReceiveMsg_Click(object sender, EventArgs e)
        {

            try
            {




                ThreadPool.QueueUserWorkItem(new WaitCallback(receiveMsg));
                //receiveMsg();


            }
            catch (Exception err)
            {


                handleError(err);


            }


        }


        // 获取要发送的信息
        private string getMsgWhichSend()
        {

            return rtbInputMsg.Text;

        }

        private void btnDisConnect_Click(object sender, EventArgs e)
        {


            lblStatus.Invoke(showStatusText, "正在断开");
            progressBar.Invoke(showProgress, 1);
            if (br != null)
            {

                br.Dispose();
                br.Close();
            }


            if (bw != null)
            {

                bw.Dispose();
                bw.Close();
            }


            if (clientTcpClient != null)
            {

                clientTcpClient.Close();
            }

            lblStatus.Invoke(showStatusText, "未连接");
            progressBar.Invoke(showProgress, 100);
       
        }



    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值