public void Send(MessageType type, int x = 0, int y = 0, string chatStr = "")
        {
            int length = 16 + chatStr.Length * 2;

            byte[] head = new byte[length];
            StreamHead.WriteHead(head, type, x, y, chatStr);

            lock (messages)
            {
                messages.Add(head);
            }
        }
        void receiver()
        {
            while (true)
            {
                MessageType type;
                int         x, y;
                string      ChatStr;

                byte[] getLength = new byte[4];
                int    alllength;
                try
                {
                    alllength = socket.Receive(getLength, 4, SocketFlags.None);
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                    goto End;
                }
                alllength = BitConverter.ToInt32(getLength, 0);
                byte[] head = new byte[alllength];
                byte[] temp = new byte[alllength];
                Array.Copy(getLength, head, 4);

                try
                {
                    int sub = alllength - 4;
                    int length;
                    while (true)
                    {
                        int l = (temp.Length < sub) ? temp.Length : sub;
                        length = socket.Receive(temp, l, SocketFlags.None);
                        if (length <= 0)
                        {
                            goto End;
                        }
                        if (length == sub)
                        {
                            Array.Copy(temp, 0, head, head.Length - sub, length);
                            break;
                        }
                        else // if (length < sub)
                        {
                            Array.Copy(temp, 0, head, head.Length - sub, length);
                            sub -= length;
                        }
                    }
                    StreamHead.Read(head, out type, out x, out y, out ChatStr);

                    if (type == MessageType.Reset)
                    {
                        FIR.Piece self = random.Next(0, 2) == 0 ? FIR.Piece.Black : FIR.Piece.White;
                        FIR.Piece now  = FIR.Piece.Black;

                        // 先设置棋子 再请求刷新 否则可能不一致
                        Owner.RefreshText(self, now);
                        Owner.Reset();

                        Send(MessageType.Piece, (int)FIR.Reserve(self), (int)now);
                    }
                    if (type == MessageType.Piece)
                    {
                        FIR.Piece self = (FIR.Piece)x;
                        FIR.Piece now  = (FIR.Piece)y;

                        Owner.RefreshText(self, now);
                        Owner.Reset();
                    }
                    if (type == MessageType.Set)
                    {
                        Owner.Set(new Point(x, y), false);
                    }
                    if (type == MessageType.Chat)
                    {
                        Owner.ChatRecv(ChatStr);
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                    goto End;
                }
            }

End:
            new Thread(abort).Start();
        }