コード例 #1
0
ファイル: NetData.cs プロジェクト: TheProxor/Unity-Server-PGN
        public static NetData RecoverBytes(byte[] bytesData, int bytesCount, out ushort type)
        {
            ushort _type = type = BitConverter.ToUInt16(bytesData, 0);

            if (bytesCount > 2 && SynchronizableTypes.TypeExists(type))
            {
                byte[] bytes = new byte[bytesCount - 2];
                for (int i = 0; i < bytesCount - 2; i++)
                {
                    bytes[i] = bytesData[i + 2];
                }

                object message = null;
                try
                {
                    using (var memoryStream = new MemoryStream(bytes))
                        Serializer.NonGeneric.TryDeserializeWithLengthPrefix(memoryStream, PrefixStyle.Base128, filed => typeof(NetData), out message);
                    return(message as NetData);
                }
                catch (Exception e)
                {
                    return(null);
                }
            }
            else
            {
                return(null);
            }
        }
コード例 #2
0
        static void Main(string[] args)
        {
            server = new ServerHandler("Users.bd", "Attributes.config", new PGN.DataBase.SQLiteBehaivour());

            ServerHandler.onLogReceived += (string log) => { Console.WriteLine(log); };

            serverUser = new User("Server Callback User");
            server.RegistrUser(serverUser);


            ServerHandler.onUserConnectedTCP    += (User user) => { Console.WriteLine($"User {user.ID} was connected via TCP"); };
            ServerHandler.onUserDisconnectedTCP += (User user) => { Console.WriteLine($"User {user.ID} was disconnected via TCP"); };

            ServerHandler.onUserConnectedUDP    += (User user) => { Console.WriteLine($"User {user.ID} was connected via UDP"); };
            ServerHandler.onUserDisconnectedUDP += (User user) => { Console.WriteLine($"User {user.ID} was disconnected via UDP"); };

            //server.SetLocalAdressTCP("192.168.0.1", 8000);
            // server.SetLocalAdressUDP("192.168.0.1", 8001);
            server.SetLocalAdressTCP("127.0.0.1", 8000);
            server.SetLocalAdressUDP("127.0.0.1", 8001);

            Console.WriteLine("Server IP: " + "127.0.0.1");

            SynchronizableTypes.EnableTransitNonValidTypes();

            server.Start();

            Console.ReadLine();
        }
コード例 #3
0
ファイル: NetData.cs プロジェクト: TheProxor/Unity-Server-PGN
 public static byte[] GetBytesData(NetData message)
 {
     using (var memoryStream = new MemoryStream())
     {
         ushort _type = SynchronizableTypes.GetTypeID(message.data.GetType());
         if (SynchronizableTypes.TypeExists(_type))
         {
             Serializer.NonGeneric.SerializeWithLengthPrefix(memoryStream, message, PrefixStyle.Base128, _type);
             byte[] source = memoryStream.ToArray();
             byte[] dest   = new byte[source.Length + 2];
             byte[] type   = BitConverter.GetBytes(_type);
             dest[0] = type[0];
             dest[1] = type[1];
             for (int i = 2; i < dest.Length; i++)
             {
                 dest[i] = source[i - 2];
             }
             return(dest);
         }
         else
         {
             return(null);
         }
     }
 }
コード例 #4
0
        public ServerHandler(string databasePath, string attributesPath, DataBase.DataBaseBehaivour dataBaseBehaivour) : base()
        {
            DataBaseBehaivour = dataBaseBehaivour;
            dataBaseBehaivour.Init(databasePath, attributesPath);

            SynchronizableTypes.AddType(typeof(ValidateServerCall.Refresh),
                                        (object data, string id) =>
            {
                ValidateServerCall.Refresh refresh = data as ValidateServerCall.Refresh;
                if (refresh.info == null || refresh.info.dataAttributes.Count == 0)
                {
                    SendMessageViaTCP(new NetData(new ValidateServerCall.Refresh(clients[id].info), false), clients[id]);
                }
                else
                {
                    clients[id].info = refresh.info;
                }
            }
                                        );


            SynchronizableTypes.AddSyncSubType(typeof(DataBase.UserInfo));
            SynchronizableTypes.AddSyncSubType(typeof(DataBase.DataProperty));

            MatchmakingController.Init();
        }
コード例 #5
0
        public ClientHandler() : base()
        {
            SynchronizableTypes.AddType(typeof(ValidateServerCall.Refresh), (object data, string id) =>
            {
                OnLogReceived("Refreshed");
                var refresh = data as ValidateServerCall.Refresh;
                onRefreshed?.Invoke(refresh.info);
            });

            SynchronizableTypes.AddType(typeof(MatchmakingServerCall.OnJoinedToRoomCallback), (object data, string id) =>
            {
                var joined = data as MatchmakingServerCall.OnJoinedToRoomCallback;
                onJoinedToRoom?.Invoke(joined.ids);
            });

            SynchronizableTypes.AddType(typeof(MatchmakingServerCall.OnMatchReadyCallback), (object data, string id) =>
            {
                var ready = data as MatchmakingServerCall.OnMatchReadyCallback;
                onMatchReady.Invoke(ready.userInfos);
            });

            SynchronizableTypes.AddType(typeof(MatchmakingServerCall.OnGetLobbysListCallback), (object data, string id) =>
            {
                var lobbysGet = data as MatchmakingServerCall.OnGetLobbysListCallback;
                onGetLobbysList?.Invoke(lobbysGet.lobbys);
            });

            SynchronizableTypes.AddType(typeof(MatchmakingServerCall.OnPlayerLeaveCallback), (object data, string id) =>
            {
                onUserLeaveRoom?.Invoke(id);
            });

            SynchronizableTypes.AddType(typeof(MatchmakingServerCall.OnRoomRealeasedCallback), (object data, string id) =>
            {
                onRoomReleased?.Invoke();
            });

            SynchronizableTypes.AddType(typeof(MatchmakingServerCall.OnLobbyDestoyedCallback), (object data, string id) =>
            {
                onLobbyDestroyed?.Invoke();
            });

            SynchronizableTypes.AddSyncSubType(typeof(DataBase.UserInfo));
            SynchronizableTypes.AddSyncSubType(typeof(DataBase.DataProperty));

            SynchronizableTypes.AddSyncSubType(typeof(MatchmakingServerCall.JoinToMatch));
            SynchronizableTypes.AddSyncSubType(typeof(MatchmakingServerCall.GetLobbysList));
            SynchronizableTypes.AddSyncSubType(typeof(MatchmakingServerCall.CreateLobby));
            SynchronizableTypes.AddSyncSubType(typeof(MatchmakingServerCall.JoinToLobby));
            SynchronizableTypes.AddSyncSubType(typeof(MatchmakingServerCall.LeaveFromRoom));
            SynchronizableTypes.AddSyncSubType(typeof(MatchmakingServerCall.ReleaseRoom));
            SynchronizableTypes.AddSyncSubType(typeof(MatchmakingServerCall.StartLobby));
            SynchronizableTypes.AddSyncSubType(typeof(MatchmakingServerCall.DestroyLobby));
        }
コード例 #6
0
        /// <summary>
        /// Handle recieved messages
        /// Обработка пришедших сообщений
        /// </summary>
        ///
        public void HandleData()
        {
            if (onConnectCondition)
            {
                onConnect?.Invoke();
                onConnectCondition = false;
                connected          = true;
            }

            if (onDisconnectCondition)
            {
                onDisconnect?.Invoke();
                onDisconnectCondition = false;
                connected             = false;
            }

            if (onConnectionLostCondition)
            {
                onConnectionLost?.Invoke();
                onConnectionLostCondition = false;
            }

            if (onServerNotAvaibleCondition)
            {
                onServerNotAvaible?.Invoke();
                onServerNotAvaibleCondition = false;
            }

            if (connected)
            {
                lock (messages)
                {
                    while (messages.Count != 0)
                    {
                        PhantomMessage phantomMessage = messages.Dequeue();
                        SynchronizableTypes.InvokeClientAction(phantomMessage.bytes, phantomMessage.bytesCount);
                    }
                }
            }
        }
コード例 #7
0
        public void GetMessage()
        {
            do
            {
                byte[] bytes      = new byte[1024];
                int    bytesCount = 0;
                try
                {
                    bytesCount = stream.Read(bytes, 0, bytes.Length);
                    if (bytesCount < 2)
                    {
                        throw new Exception("null bytes");
                    }
                }
                catch
                {
                    if (user != null)
                    {
                        ServerHandler.OnUserDisconnectedTCP(user);
                        ServerHandler.OnUserDisconnectedUDP(user);
                        ServerHandler.RemoveConnection(user);
                    }
                    Close();
                    return;
                }

                ushort  type;
                bool    transitable;
                NetData message = NetData.RecoverBytes(bytes, bytesCount, out type, out transitable);

                if (!transitable)
                {
                    if (message != null)
                    {
                        if (ServerHandler.clients.ContainsKey(message.senderID))
                        {
                            if (ServerHandler.clients[message.senderID].tcpConnection == null)
                            {
                                user = ServerHandler.clients[message.senderID];
                                user.tcpConnection = this;
                                ServerHandler.OnUserConnectedTCP(user);
                            }
                        }
                        else
                        {
                            user = new User(message.senderID);
                            user.tcpConnection = this;
                            ServerHandler.AddConnection(user);
                            ServerHandler.OnUserConnectedTCP(user);

                            Matchmaking.DefaultRoom.instance.JoinToRoom(user);

                            if (user.info == null)
                            {
                                user.info = ServerHandler.DataBaseBehaivour.GetUserData(message.senderID);
                            }
                            if (user.info == null)
                            {
                                user.info = ServerHandler.DataBaseBehaivour.CreateUser(message.senderID);
                            }
                        }

                        SynchronizableTypes.InvokeTypeActionTCP(type, bytes, message, ServerHandler.clients[message.senderID]);
                    }
                    else
                    {
                        if (user != null)
                        {
                            ServerHandler.OnUserDisconnectedTCP(user);
                            ServerHandler.OnUserDisconnectedUDP(user);
                            ServerHandler.RemoveConnection(user);
                        }
                        Close();
                        return;
                    }
                }
                else
                {
                    user.currentRoom.BroadcastMessageTCP(bytes);
                }
            }while (stream.DataAvailable);
        }
コード例 #8
0
ファイル: Handler.cs プロジェクト: TheProxor/Unity-Server-PGN
 public Handler()
 {
     SynchronizableTypes.Init();
 }
コード例 #9
0
        private static void GetMessage(UdpClient client, IAsyncResult ar)
        {
            IPEndPoint iPEndPoint = new IPEndPoint(IPAddress.Any, 8001);
            UdpClient  udpClient  = (ar.AsyncState as UdpClient);

            byte[] bytes = null;
            try
            {
                bytes = udpClient.EndReceive(ar, ref iPEndPoint);
                if (bytes.Length < 2)
                {
                    throw new Exception("null bytes");
                }
            }
            catch
            {
                return;
            }
            finally
            {
                if (bytes != null)
                {
                    ushort  type;
                    bool    transitable;
                    NetData message = NetData.RecoverBytes(bytes, bytes.Length, out type, out transitable);
                    if (!transitable || !ServerHandler.udpConnections.ContainsKey(iPEndPoint))
                    {
                        if (message != null)
                        {
                            User udpUser = null;

                            if (ServerHandler.clients.ContainsKey(message.senderID))
                            {
                                if (ServerHandler.clients[message.senderID].udpConnection == null)
                                {
                                    ServerHandler.OnUserConnectedUDP(ServerHandler.clients[message.senderID]);
                                    UdpConnection udpConnection = new UdpConnection(iPEndPoint);
                                    udpConnection.user = ServerHandler.clients[message.senderID];
                                    ServerHandler.clients[message.senderID].udpConnection = udpConnection;
                                    ServerHandler.udpConnections.Add(iPEndPoint, udpConnection);
                                }
                                udpUser = ServerHandler.clients[message.senderID];
                            }
                            else
                            {
                                udpUser = new User(message.senderID);
                                udpUser.udpConnection = new UdpConnection(iPEndPoint);
                                ServerHandler.udpConnections.Add(iPEndPoint, udpUser.udpConnection);

                                ServerHandler.AddConnection(udpUser);

                                Matchmaking.DefaultRoom.instance.JoinToRoom(udpUser);

                                ServerHandler.OnUserConnectedUDP(udpUser);

                                if (udpUser.info == null)
                                {
                                    udpUser.info = ServerHandler.DataBaseBehaivour.GetUserData(message.senderID);
                                }
                                if (udpUser.info == null)
                                {
                                    udpUser.info = ServerHandler.DataBaseBehaivour.CreateUser(message.senderID);
                                }
                            }
                            SynchronizableTypes.InvokeTypeActionUDP(type, bytes, message, ServerHandler.clients[message.senderID]);
                        }
                    }
                    else
                    {
                        ServerHandler.udpConnections[iPEndPoint].user.currentRoom.BroadcastMessageUDP(bytes);
                    }
                }
            }
        }
コード例 #10
0
        public static void Init()
        {
            defaultRoom = new DefaultRoom("defaultRoomType");
            matchmakingRooms.Add("defaultRoomType", new List <Room>(1));
            matchmakingRooms["defaultRoomType"].Add(defaultRoom);

            SynchronizableTypes.AddType(typeof(MatchmakingServerCall.CreateLobby),
                                        (object data, string id) =>
            {
                MatchmakingServerCall.CreateLobby createRoom = data as MatchmakingServerCall.CreateLobby;
                CreateLobby(ServerHandler.clients[id], createRoom.name, createRoom.roomFactors);
            }
                                        );

            SynchronizableTypes.AddType(typeof(MatchmakingServerCall.GetLobbysList),
                                        (object data, string id) =>
            {
                ServerHandler.clients[id].tcpConnection.SendMessage(new NetData(new MatchmakingServerCall.OnGetLobbysListCallback(GetLobbyList()), false));
            }
                                        );

            SynchronizableTypes.AddType(typeof(MatchmakingServerCall.JoinToMatch),
                                        (object data, string id) =>
            {
                MatchmakingServerCall.JoinToMatch joinToMatch = data as MatchmakingServerCall.JoinToMatch;
                JoinToMatch(ServerHandler.clients[id], joinToMatch.roomFactors);
            }
                                        );

            SynchronizableTypes.AddType(typeof(MatchmakingServerCall.JoinToLobby),
                                        (object data, string id) =>
            {
                MatchmakingServerCall.JoinToLobby joinToLobby = data as MatchmakingServerCall.JoinToLobby;
                if (rooms.ContainsKey(joinToLobby.id))
                {
                    rooms[joinToLobby.id].JoinToRoom(ServerHandler.clients[id]);
                }
            }
                                        );

            SynchronizableTypes.AddType(typeof(MatchmakingServerCall.StartLobby),
                                        (object data, string id) =>
            {
                if (ServerHandler.clients[id].currentRoom is Lobby)
                {
                    ServerHandler.clients[id].currentRoom.StartRoom();
                }
            }
                                        );

            SynchronizableTypes.AddType(typeof(MatchmakingServerCall.DestroyLobby),
                                        (object data, string id) =>
            {
                if (ServerHandler.clients[id].currentRoom is Lobby)
                {
                    ServerHandler.clients[id].currentRoom.DestroyRoom();
                }
            }
                                        );

            SynchronizableTypes.AddType(typeof(MatchmakingServerCall.LeaveFromRoom),
                                        (object data, string id) =>
            {
                ServerHandler.clients[id].currentRoom.LeaveFromRoom(ServerHandler.clients[id]);
            }
                                        );

            SynchronizableTypes.AddType(typeof(MatchmakingServerCall.ReleaseRoom),
                                        (object data, string id) =>
            {
                ServerHandler.clients[id].currentRoom.ReleaseRoom();
            }
                                        );

            SynchronizableTypes.AddSyncSubType(typeof(MatchmakingServerCall.OnMatchReadyCallback));
            SynchronizableTypes.AddSyncSubType(typeof(MatchmakingServerCall.OnPlayerLeaveCallback));
            SynchronizableTypes.AddSyncSubType(typeof(MatchmakingServerCall.OnJoinedToRoomCallback));
            SynchronizableTypes.AddSyncSubType(typeof(MatchmakingServerCall.OnGetLobbysListCallback));
            SynchronizableTypes.AddSyncSubType(typeof(MatchmakingServerCall.OnRoomRealeasedCallback));
            SynchronizableTypes.AddSyncSubType(typeof(MatchmakingServerCall.OnLobbyDestoyedCallback));
        }