Example #1
0
    /// <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);
    }
Example #2
0
        //--当连接建立时--
        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;
        }
Example #3
0
    /// <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;
            }
        }
    }