TCP服务端和客户端(C#)

using System;
using System.Net;
using System.Net.Sockets;
using System.ComponentModel;
using System.Windows.Forms;
using System.Configuration;
using System.Text;
using System.IO;

namespace test
{

    /// <summary>
    /// TCP服务类
    /// </summary>


    public class TcpListen
   {
        //监听IP
        private static string ip =  ConfigurationManager.AppSettings["tcpIps"] == null ? "127.0.0.1" : ConfigurationManager.AppSettings["tcpIp"].Trim();
        // 监听端口
        private static int port = ConfigurationManager.AppSettings["tcpPort"] == null ? 9999 : int.Parse(ConfigurationManager.AppSettings["tcpPort"]);
        //单例对象
        private static TcpListen tcpListen = null;
        // 后台工作线程对象
        private BackgroundWorker backWork = null;  
           
        private TcpListen()
        {
            //创建后台工作对象(线程)
            backWork = new BackgroundWorker();
            //报告进度更新
            backWork.WorkerReportsProgress = true;
            //支持异步取消
            backWork.WorkerSupportsCancellation = true;
            //绑定DoWork事件程序
            backWork.DoWork += new DoWorkEventHandler(startListen);
            //绑定ProgressChanged事件程序
            backWork.ProgressChanged += new ProgressChangedEventHandler(BackWork_ProgressChanged);
           
            //开始执行后台操作
            backWork.RunWorkerAsync();
        }

        /// <summary>
        /// 单例实现
        /// </summary>
        /// <returns></returns>

        public static TcpListen getInstance()
        {
            if (tcpListen == null)
                tcpListen = new TcpListen();
            return tcpListen;
        }

        /// <summary>
        /// 线程内部调用ReportProgress触发,用来在主线程处理具体工作
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>

        void BackWork_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            // do something
            //常用参数
            //e.ProgressPercentage;获取异步进度任务的百分比
            //e.UserState;//获取唯一的用户状态,可传意参数

        }

        //  启动监听
        private void startListen(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;
            TcpListener tcpListener;     // 声明网络监听对象 
            try
            {
                tcpListener = new TcpListener(IPAddress.Parse(ip), port);
                //开始监听
                tcpListener.Start();
                MessageBox.Show("s");
                while (true)
                {
                    // 获取TcpClient
                    TcpClient tcpClient = tcpListener.AcceptTcpClient();
                    NetworkStream networkStream = tcpClient.GetStream();

                    //以下为示例,未严格处理
                    //获取数据
                    byte[] myBytes = new byte[1024];
                    int myBytesLength = networkStream.Read(myBytes, 0, myBytes.Length);

                    string acceptMsg = Encoding.Default.GetString(myBytes, 0, myBytesLength);

                    if (!acceptMsg.Trim().Equals(""))
                    {
                       
//报告收到的数据,用于主线程操作
                        worker.ReportProgress(1, acceptMsg);
                        //将收到的数据返回客户端
                        StreamWriter sw = new StreamWriter(networkStream, Encoding.Default);
                        sw.Write(acceptMsg);
                        sw.Flush();
                    }
                    networkStream.Close();
                }
            }
            catch(Exception e1)
            {
                MessageBox.Show("监听器启动失败:" + e1.Message);
            }
        }

        /// <summary>
        /// 取消后台操作
        /// </summary>

        public void stopListen(){
            try
            {
                backWork.CancelAsync();
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
        }
    }
    /// <summary>
    /// 调用类
    /// </summary>

    public class EEyeFun
    {
        //目标IP
        private static string ip = ConfigurationManager.AppSettings["tcpClientIp"] == null ? "127.0.0.1" : ConfigurationManager.AppSettings["tcpClientIp"].Trim();
        // 端口
        private static int port = ConfigurationManager.AppSettings["tcpClientPort"] == null ? 9999 : int.Parse(ConfigurationManager.AppSettings["tcpClientPort"]);
        // 超时时间(秒)
        private static int timeout = ConfigurationManager.AppSettings["tcpClientTimeout"] == null ? 10 : int.Parse(ConfigurationManager.AppSettings["tcpClientTimeout"]);

        /// <summary>
        /// 获取数据
        /// </summary>
        /// <param name="msg"></param>
        /// <returns></returns>

        public string getData(string msg)
        {
            string result = null;
            TcpClient tcpClient = null;
            try
            {
                // 根据目标计算机地址建立连接
                tcpClient = new TcpClient(ip, port);
                tcpClient.ReceiveBufferSize = 1024;

                // 获得用于网络访问的数据流
                NetworkStream networkStream = tcpClient.GetStream();

                // 发送请求命令串
                StreamWriter sw = new StreamWriter(networkStream, Encoding.Default);
                sw.Write(msg);
                sw.Flush();

                // 等候并读取回应信息
                if (networkStream.CanRead)
                {
                    // 设置读取超时
                    networkStream.ReadTimeout = timeout * 1000;

                    //以下为示例,未严格处理
                    byte[] bytes = new byte[tcpClient.ReceiveBufferSize];
                    networkStream.Read(bytes, 0, tcpClient.ReceiveBufferSize);
                    result = Encoding.Default.GetString(bytes);
                }
                networkStream.Close();
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
                return null;
            }
            finally
            {
                // 关闭连接
                if (tcpClient != null) tcpClient.Close();
            }
            return result;
        }
    }

}


如果给你带来帮助,欢迎微信或支付宝扫一扫,赞一下。