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(); }