1、环形缓冲区
环形缓冲区并不是物理意义上一个首尾相连的环形缓冲区,而是逻辑意义的一个环,是一个先进先出,有一定长度的内存空间,具备对缓冲区的互斥访问功能。
2、程序实现
环形缓冲区通常有一个读指针、一个写指针、一个数据长度、一段内存空间(可以是数组、也可以是链表)

public class RingBuffer
    {
        private int readPoint;
        private int writePoint;

        public int Count { get; set; }
        public byte[] BufferData { get; set; }

        public RingBuffer(int size)
        {
            readPoint = 0;
            writePoint = 0;
            Count = 0;
            BufferData = new byte[size];
        }

        //写数据
        public int Write(byte[] data)
        {
            if (writePoint + data.Length > BufferData.Length)
            {
                int writePointBackup = 0;
                if (writePoint == BufferData.Length)
                {
                    writePoint = 0;
                    Buffer.BlockCopy(data, 0, BufferData, writePoint, data.Length);
                    writePoint += data.Length;
                }
                else
                {
                    int len = BufferData.Length - writePoint;
                    Buffer.BlockCopy(data, 0, BufferData, writePoint, len);
                    Buffer.BlockCopy(data, len, BufferData, 0, data.Length - len);
                    writePointBackup = writePoint;
                    writePoint = data.Length - len;
                }
                Count += data.Length;
                if (Count > BufferData.Length)
                {
                    if (writePoint > readPoint)
                    {
                        Count = writePoint - readPoint;
                        readPoint = writePointBackup;
                    }
                    else
                    {
                        Count = readPoint - writePoint;
                    }
                }
            }
            else
            {
                Buffer.BlockCopy(data, 0, BufferData, writePoint, data.Length);
                writePoint += data.Length;
                Count += data.Length;
            }
            
            return Count;
        }

        //读数据
        public byte[] Read(int num)
        {
            byte[] data = new byte[num];
            if (num > Count)
            {
                return null;
            }
            if (readPoint + num > BufferData.Length)
            {
                if(readPoint== BufferData.Length)
                {
                    readPoint = 0;
                    Buffer.BlockCopy(BufferData, readPoint, data, 0, num);
                    readPoint += num;
                }
                else
                {
                    int len = BufferData.Length - writePoint;
                    Buffer.BlockCopy(BufferData, readPoint, data, 0, len);
                    Buffer.BlockCopy(BufferData, 0, data, len, num - len);
                    readPoint = num - len;
                }
            }
            else
            {
                Buffer.BlockCopy(BufferData, readPoint, data, 0, num);
                readPoint += num;
            }
            Count -= num;
            return data;
        }

    }

3、软件调用

try
                    {
                        c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                        //把ip和端口转为IPEndpoint实例
                        int port = Convert.ToInt32(textBox2.Text);
                        IPAddress ip = IPAddress.Parse(textBox1.Text);
                        IPEndPoint ipe = new IPEndPoint(ip, port);

                        //创建socket 并连接到服务器
                        c.Connect(ipe);

                        button1.Text = "断  开";
                        button1.Image = TCPClient.Properties.Resources.bitmap2;

                        thread = new Thread(new ThreadStart(TCPlisten));
                        thread.IsBackground = true;//指示该线程为后台线程。后台线程将会随着主线程的退出而退出。
                        thread.Start();
                    
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("连接到服务器失败");

                    }
private void TCPlisten()
        {    
            while (true)
            {
                try
                {
                    Encoding my = Encoding.GetEncoding("GB2312");
                    string recvStr = "";
                    byte[] recvBytes = new byte[1024];
                    int bytes;
                    bytes = c.Receive(recvBytes, recvBytes.Length, 0);
                    if (bytes > 0)
                    {
                        byte[] data = new byte[bytes];
                        Buffer.BlockCopy(recvBytes, 0, data, 0, bytes);
                        ringBuffer.Write(data);
                    }
                    
                    recvStr += my.GetString(recvBytes, 0, bytes);
                    TextReceive.Invoke
                        (
                        new MethodInvoker
                            (
                          delegate
                                {
                                   TextReceive.Text += recvStr;
                                   rlength = rlength + recvStr.Length;
                                   textBox6.Text = rlength.ToString();
                                 }
                             )
                         );
                }
                catch
                {
                    MessageBox.Show("请连接服务器");
                    continue;
                }
            }   
        }
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐