/// <summary> /// 请求登录 /// </summary> public void onLoginRequst(string account, string password = "") { MessageRequestLogin login = new MessageRequestLogin(); login.Account = account; login.Password = "******"; NetworkManager.GetInstance().SendMessage(MSG_CS.ReqLogin, login); }
//--当连接建立时-- private void OnConnect(MemoryStream memStream) { if (islogging) { return; } MessageRequestLogin login = new MessageRequestLogin(); ////login.account = Singleton<GameModel>.GetInstance().Account; ////login.server_id = Singleton<ServiceModel>.GetInstance().GetCurSeverInfo().ID; MemoryStream stream = new MemoryStream(); Serializer.Serialize <MessageRequestLogin>(stream, login); SendMessage((ushort)MSG_CS.MSG_CS_REQUEST_LOGIN_C, stream); islogging = true; }
/// <summary> /// 接收客户端发来的信息,客户端套接字对象 /// </summary> /// <param name="socketclientpara"></param> static void recv(object socketclientpara) { Socket socketServer = socketclientpara as Socket; while (true) { //System.Threading.Thread.Sleep(200/*new System.Random().Next(200)*/); //将接收到的信息存入到内存缓冲区,并返回其字节数组的长度 try { int length = socketServer.Receive(byteBuffer); memStream.SetLength(0); memStream.Seek(0, SeekOrigin.End); memStream.Write(byteBuffer, 0, length); memStream.Seek(0, SeekOrigin.Begin); bool isFullMsg = false; while ((int)(memStream.Length - memStream.Position) >= PROTOCOL_HEAD_LENGTH) { int totalLen = reader.ReadInt32(); int messageLen = totalLen & PROTOCOL_HEAD_LENGTH_MASK; ushort msgId = reader.ReadUInt16(); UInt16 serialNumber = reader.ReadUInt16(); if ((int)(memStream.Length - memStream.Position) >= messageLen) { //Debug.Log("服务端收到请求:" + msgId); isFullMsg = true; byte[] data = reader.ReadBytes(messageLen); receiveStream.SetLength(0); receiveStream.Write(data, 0, data.Length); receiveStream.Position = 0; ByteBuffer buffer; switch (msgId) { case (ushort)MSG_CS.ReqLogin: MessageRequestLogin req = MessageRequestLogin.Parser.ParseFrom(receiveStream); Debug.Log("Req login:account: " + req.Account + " password:"******"666token"; receiveStream.SetLength(0); Google.Protobuf.MessageExtensions.WriteTo(res, receiveStream); buffer = createByteBuffer((ushort)MSG_CS.ResLogin, receiveStream); socketServer.BeginSend(buffer.ToBytes(), 0, buffer.ToBytes().Length, SocketFlags.None, null, null); break; case (ushort)MSG_CS.ReqHeartBeat: MessageRequestHeartBeat heartReq = MessageRequestHeartBeat.Parser.ParseFrom(receiveStream); MessageResponseHeartBeat heartRes = new MessageResponseHeartBeat(); heartRes.RealTime = heartReq.RealTime; heartRes.ServerTime = (ulong)DateTime.Now.Second; Google.Protobuf.MessageExtensions.WriteTo(heartRes, receiveStream); buffer = createByteBuffer((ushort)MSG_CS.ResHeartBeat, receiveStream); socketServer.BeginSend(buffer.ToBytes(), 0, buffer.ToBytes().Length, SocketFlags.None, null, null); break; case (ushort)MSG_CS.NotifyClientOperations: lock (OperationsList) { MessageNotifyClientOperations ope = MessageNotifyClientOperations.Parser.ParseFrom(receiveStream); OperationsList.Add(ope.PlayerOperation); break; } case (ushort)MSG_CS.ReqStartFight: StartFightFlag = true; NotifyRoomInfo(); break; default: Debug.LogError("服务端没有此协议:" + msgId); break; } } else { memStream.Position = memStream.Position - PROTOCOL_HEAD_LENGTH; break; } } if (isFullMsg) { int len = (int)(memStream.Length - memStream.Position); if (len > 0) { //reader和memStream是关联的,所以必须先读取,再重置memStream byte[] leftover = reader.ReadBytes(len); memStream.SetLength(0); memStream.Write(leftover, 0, leftover.Length); } else { memStream.SetLength(0); } } } catch (Exception ex) { List <string> key = new List <string>(); foreach (var item in clientConnectionItems) { if (!item.Value.Connected) { key.Add(item.Key); } } for (int i = 0; i < key.Count; i++) { for (int j = 0; j < roomInfoList.Count; j++) { if (roomInfoList[j].Uid == key[i]) { roomInfoList.RemoveAt(j); break; } } clientConnectionItems[key[i]].Close(); Debug.Log("客户端" + key[i] + "已经中断连接"); clientConnectionItems.Remove(key[i]); } return; clientConnectionItems.Remove(socketServer.RemoteEndPoint.ToString()); Console.WriteLine("Client Count:" + clientConnectionItems.Count); //提示套接字监听异常 Console.WriteLine("客户端" + socketServer.RemoteEndPoint + "已经中断连接" + "\r\n" + ex.Message + "\r\n" + ex.StackTrace + "\r\n"); //关闭之前accept出来的和客户端进行通信的套接字 socketServer.Close(); break; } } }