C# TcpHelper 通讯类

这个博客展示了如何使用C#实现TCP的服务器和客户端进行消息的接收与发送。`TcpHelper`类包含了服务器的绑定、客户端的连接、消息的发送和接收事件处理。在`Form1`中创建了服务器和客户端实例,并监听和发送消息。当服务器接收到消息时,会触发`Tcpserver_Receiving`事件,将消息显示在UI上。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TCP的接收与发送消息类

 public class TcpHelper
    {
        /// <summary>
        /// 作为一个收消息事件
        /// </summary>
        /// <param name="buffer"></param>
        /// <param name="clientIp"></param>
        /// <param name="intPort"></param>
        public delegate void DelReceive(byte[] buffer, string clientIp, int intPort);
        public event DelReceive Receiving;

        /// <summary>
        /// 服务器
        /// </summary>
        Socket serverSocket;
        /// <summary>
        /// 客户端
        /// </summary>
        Socket clientSocket;
        /// <summary>
        /// 客户线程
        /// </summary>
        Thread thread;
        public string IpAddress { get; set; }
        public int Port { get; set; }

        private int _bufferSize = 1024;
        public int BufferSize
        {
            get
            {
                return _bufferSize;
            }
            set
            {
                _bufferSize = value;
            }
        }

        public TcpHelper()
        {

        }

        /// <summary>
        /// 构造
        /// </summary>
        /// <param name="ipAddress"></param>
        /// <param name="port"></param>
        public TcpHelper(string ipAddress, int port, int bufferSize = 1024)
        {
            this.IpAddress = ipAddress;
            this.Port = port;
            this.BufferSize = bufferSize;
        }

        /// <summary>
        /// 作为服务器,需要Bind
        /// </summary>
        public void Bind()
        {
            IPEndPoint ipEnd = new IPEndPoint(IPAddress.Any, this.Port);
            serverSocket = new Socket(ipEnd.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
            serverSocket.Bind(ipEnd);
            serverSocket.Listen(10);
            clientSocket = serverSocket.Accept();
            thread = new Thread(new ThreadStart(Receive));
            thread.Start();
        }

        private void Receive()
        {
            IPEndPoint remotePoint = (IPEndPoint)clientSocket.RemoteEndPoint;
            string remoteAddress = remotePoint.Address.ToString();
            int remotePort = remotePoint.Port;
            byte[] buffer = new byte[this.BufferSize];
            while (true)
            {
                clientSocket.Receive(buffer, buffer.Length, SocketFlags.None);
                OnReceiving(buffer, remoteAddress, remotePort);
            }
        }

        void OnReceiving(byte[] buffer, string remoteAddress, int remotePort)
        {
            if (Receiving != null)
            {
                Receiving(buffer, remoteAddress, remotePort);
            }
        }

        /// <summary>
        /// 连接一个Socket服务器
        /// </summary>
        /// <returns></returns>
        public bool Connect()
        {
            try
            {
                IPEndPoint ipEnd = new IPEndPoint(IPAddress.Parse(this.IpAddress), this.Port);
                clientSocket = new Socket(ipEnd.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
                clientSocket.Connect(ipEnd);
                return true;
            }
            catch (Exception ex)
            {

            }
            return false;
        }

        //发送消息
        public void Send(byte[] buffer)
        {
            try
            {
                clientSocket.Send(buffer, buffer.Length, SocketFlags.None);
            }
            catch (Exception ex)
            {

            }
        }

        /// <summary>
        /// 关闭服务器
        /// </summary>
        public void Close()
        {
            try
            {
                if (serverSocket != null && serverSocket.Connected)
                {
                    serverSocket.Close();
                }
                if (clientSocket != null && clientSocket.Connected)
                {
                    clientSocket.Close();
                }
            }
            catch
            {

            }
        }
    }

简单的窗口调用

 Bz.Utils.TcpHelper tcpserver = new Bz.Utils.TcpHelper();
        Bz.Utils.TcpHelper tcpclient = new Bz.Utils.TcpHelper();
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Task.Run(new Action(() =>
            {
                tcpserver.IpAddress = "127.0.0.1";
                tcpserver.Port = 3001;

                tcpserver.Receiving += Tcpserver_Receiving;
                tcpserver.Bind();
            }));

            Task.Run(new Action(() =>
            {
                tcpclient.Port = 3001;
                tcpclient.IpAddress = "127.0.0.1";
                tcpclient.Connect();
            }));
        }

        private void Tcpserver_Receiving(byte[] buffer, string clientIp, int intPort)
        {
            this.Invoke(new Action(() =>
            {
                txtReceive.AppendText(System.Text.Encoding.UTF8.GetString(buffer) + ":" + clientIp + ":" + intPort);
            }));
           
        }

        private void btnSender_Click(object sender, EventArgs e)
        {
            tcpclient.Send(System.Text.Encoding.UTF8.GetBytes(txtSender.Text));
        }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值