예제 #1
0
        private void SendTcpData(int clientId, Packet packet)
        {
            PineappleLogger.Log(LogType.INFO, $"{type} SendTcpData()");

            packet.WriteLength();
            server.Clients[clientId].Tcp.SendData(packet);
        }
예제 #2
0
        public override void ReceiveCallback(IAsyncResult _result)
        {
            try
            {
                int _byteLength = stream.EndRead(_result);
                if (_byteLength <= 0)
                {
                    if (IsServer == false)
                    {
                        Client.Disconnect();
                    }

                    //TODO if server is true disconnect that client
                    //Server.clients[id].Disconnect();
                    return;
                }

                byte[] _data = new byte[_byteLength];
                Array.Copy(receiveBuffer, _data, _byteLength);

                receivedData.Reset(HandleData(_data)); // Reset receivedData if all data was handled
                stream.BeginRead(receiveBuffer, 0, dataBufferSize, ReceiveCallback, null);
            }
            catch (Exception _ex)
            {
                PineappleLogger.Log(LogType.ERROR, $"Error receiving TCP data: {_ex}");
                //Server.Clients[id].Disconnect();
            }
        }
예제 #3
0
        //private static UdpClient udpListener;

        public void Start(int port)
        {
            try
            {
                IPGlobalProperties         ipGlobalProperties = IPGlobalProperties.GetIPGlobalProperties();
                TcpConnectionInformation[] tcpConnInfoArray   = ipGlobalProperties.GetActiveTcpConnections();

                foreach (var tcpi in tcpConnInfoArray)
                {
                    if (tcpi.LocalEndPoint.Port == port)
                    {
                        throw new SocketException();
                    }
                }

                Port      = port;
                IsRunning = true;

                PineappleLogger.Log(LogType.INFO, "Starting server...");
                Initialize();

                serverLooper.Start();

                tcpListener = new TcpListener(IPAddress.Any, Port);
                tcpListener.Start();
                tcpListener.BeginAcceptTcpClient(TCPConnectCallback, null);
                PineappleLogger.Log(LogType.INFO, $"Server started on port {Port}.");
            }
            catch (Exception e)
            {
                PineappleLogger.HandleException(e, false);
            }
        }
예제 #4
0
        public void JoinLobby(int clientId, Packet packet)
        {
            try
            {
                string password = packet.ReadString();
                int    lobbyId  = packet.ReadInt();

                //bool result = serverHelper.JoinLobby(clientId, lobbyId, password);

                int tries = 0;
                while (serverHelper.JoinLobby(clientId, lobbyId, password) == false)
                {
                    tries++;

                    if (tries >= 3)
                    {
                        throw new Exception("Too many tries!");
                    }

                    Thread.Sleep(100);
                }
            }
            catch (Exception ex)
            {
                PineappleLogger.HandleException(ex, true, "ServerHandle - JoinLobby()");
            }
        }
예제 #5
0
        public void StartOnline(bool simulate = false)
        {
            if (Players.Count <= 0 || Server != null || Client != null)
            {
                PineappleLogger.HandleException(new Exception("GameController - StartOnline()"), true);
            }

            GameType = GameType.CLIENT;

            if (simulate == false)
            {
                Client = new Client(this);

                int tries = 0;
                while (Client.IsConnected == false)
                {
                    tries++;

                    if (tries >= 10)
                    {
                        throw new Exception($"GameController - StartOnline()");
                    }

                    Thread.Sleep(100);
                }
            }
        }
예제 #6
0
        public void StartServer(bool simulate = false)
        {
            if (Server == null || Client != null)
            {
                PineappleLogger.HandleException(new Exception("GameController - StartServer()"), true);
            }

            GameType = GameType.SERVER;
        }
예제 #7
0
        public void AssignPlayerToClient(Player player)
        {
            if (this.Player != null)
            {
                PineappleLogger.HandleException(new Exception("Client - AssignPlayerToClient"), true);
            }

            this.Player = player;
        }
예제 #8
0
        public void Disconnect()
        {
            if (IsServer == false)
            {
                Tcp.Socket.Close();
                //udp.socket.Close();

                PineappleLogger.Log(LogType.DEBUG, "Disconnected from server.");
            }
        }
예제 #9
0
        public void WelcomeClient(int clientId, string msg = "Welcome to the Server!")
        {
            PineappleLogger.Log(LogType.INFO, $"{type} Welcome Client: {clientId}");
            using (Packet packet = new Packet((int)PacketType.Welcome))
            {
                packet.Write(msg);
                packet.Write(clientId);

                SendTcpData(clientId, packet);
            }
        }
예제 #10
0
        public void StartOffline(bool simulate = false)
        {
            if (Players.Count <= 0 || Server != null || Client != null)
            {
                PineappleLogger.HandleException(new Exception("GameController - StartOffline()"), true);
            }

            Enemies = new List <EnemyController>();

            GameType = GameType.LOCAL;

            Enemies.Add(new EnemyController(this));
        }
예제 #11
0
        public static void QueueClient(TcpClient client)
        {
            if (client == null)
            {
                PineappleLogger.Log(LogType.DEBUG, "ClientConnectQueue - Null");
                return;
            }

            lock (clientQueue)
            {
                clientQueue.Enqueue(client);
            }
        }
예제 #12
0
        public void CreateLobby(int clientId, Packet packet)
        {
            try
            {
                string password = packet.ReadString();
                bool   join     = packet.ReadBool();

                bool result1 = serverHelper.CreateLobby(clientId, password, join);
            }
            catch (Exception ex)
            {
                PineappleLogger.HandleException(ex, true, "ServerHandle - CreateLobby()");
            }
        }
예제 #13
0
        /// <summary>Sets an action to be executed on the main thread.</summary>
        /// <param name="_action">The action to be executed on the main thread.</param>
        public static void ExecuteOnMainThread(Action _action)
        {
            if (_action == null)
            {
                PineappleLogger.Log(LogType.DEBUG, "ExecuteOnMainThread - Null");
                return;
            }

            lock (executeOnMainThread)
            {
                executeOnMainThread.Add(_action);
                actionToExecuteOnMainThread = true;
            }
        }
예제 #14
0
 public void SendData(Packet _packet)
 {
     try
     {
         if (Socket != null)
         {
             //PineappleLogger.PineappleLog(LogType.INFO, Socket.Client.LocalEndPoint.ToString() + " " + Socket.Client.RemoteEndPoint.ToString());
             stream.BeginWrite(_packet.ToArray(), 0, _packet.Length(), null, null);
         }
     }
     catch (Exception _ex)
     {
         PineappleLogger.HandleException(_ex, true);
     }
 }
예제 #15
0
        public void WelcomeReceived(int clientId, Packet packet)
        {
            try
            {
                Client client       = server.Clients[clientId];
                Player clientPlayer = (Player)serializer.Deserialize(packet.ReadBytes(packet.UnreadLength()));

                client.IsConnected = true;
                client.AssignPlayerToClient(clientPlayer);
            }
            catch (Exception ex)
            {
                PineappleLogger.HandleException(ex, true, "ServerHandle - WelcomeReceived()");
            }
        }
예제 #16
0
        public void CombatCalc(int clientId, Packet packet)
        {
            try
            {
                string packetId = packet.ReadString();
                int    length   = packet.ReadInt();
                int    order    = packet.ReadInt();
                byte[] data     = packet.ReadBytes(packet.UnreadLength());

                serverHelper.CombatCalc(clientId, packetId, length, order, data);
            }
            catch (Exception ex)
            {
                PineappleLogger.HandleException(ex, true, "ServerHandle - CombatCalc()");
            }
        }
예제 #17
0
        /// <summary>Handles new TCP connections.</summary>
        private void TCPConnectCallback(IAsyncResult _result)
        {
            if (IsRunning == false)
            {
                PineappleLogger.Log(LogType.WARNING, "Server - TCPConnectCallback - IsRunning == false");
                return;
            }

            TcpClient socket = tcpListener.EndAcceptTcpClient(_result);

            tcpListener.BeginAcceptTcpClient(TCPConnectCallback, null);
            PineappleLogger.Log(LogType.INFO, $"Incoming connection from {socket.Client.RemoteEndPoint}...");

            ThreadManager.QueueClient(socket);
            //PineappleLogger.PineappleLog(LogType.WARNING, $"{_client.Client.RemoteEndPoint} failed to connect: Server full!");
        }
예제 #18
0
        public void Stop()
        {
            try
            {
                PineappleLogger.Log(LogType.WARNING, "Stopping server...");
                IsRunning = false;

                ThreadManager.Stop();
                serverLooper.Stop();
                tcpListener.Stop();

                Thread.Sleep(50);
            }
            catch (Exception e)
            {
                PineappleLogger.HandleException(e, true);
            }
        }
예제 #19
0
        static void Main(string[] args)
        {
            try
            {
                //Console.WriteLine("Hello World!");

                //new PineappleLib.Networking.Server().Start(5, 55555);

                //var client = new ClientLocal();

                //client.Init();
            }
            catch (Exception e)
            {
                PineappleLogger.HandleException(e, false);
            }

            Console.ReadKey();
        }
예제 #20
0
        public void WelcomeFromServer(Packet packet)
        {
            try
            {
                string msg = packet.ReadString();
                int    id  = packet.ReadInt();

                PineappleLogger.Log(LogType.INFO, $"{type} [{client.Id}] I received welcome from server my new ID is: {id}");

                client.IsConnected = true;
                client.Id          = id;

                client.ClientSender.WelcomeReceived();
            }
            catch (Exception ex)
            {
                PineappleLogger.HandleException(ex, true, "ClientHandle - WelcomeFromServer()");
            }
        }
예제 #21
0
        public void WriteReadTest()
        {
            string date = DateTime.Now.ToString("yyyy_MM_dd");
            string path = Path.Combine("C:/Utveckling/ProjectPineapple/PineappleServer/Logger", "Deploy.log");

            if (File.Exists(path))
            {
                File.Delete(path);
            }

            Assert.False(File.Exists(path));

            PineappleLogger.CreateDeployLog();

            Assert.True(File.Exists(path));

            string content = PineappleReader.Read(path);

            Assert.Equal($"{date} - Deployed", content);
        }
예제 #22
0
        protected override void ConnectCallback(IAsyncResult _result)
        {
            try
            {
                Socket.EndConnect(_result);

                if (!Socket.Connected)
                {
                    return;
                }

                stream = Socket.GetStream();

                receivedData = new Packet();
                stream.BeginRead(receiveBuffer, 0, dataBufferSize, ReceiveCallback, null);
                Client.IsConnected = true;
            }
            catch (Exception e)
            {
                PineappleLogger.HandleException(e, false);
            }
        }
예제 #23
0
 private void SendTCPData(Packet _packet)
 {
     PineappleLogger.Log(LogType.INFO, $"{type} [{client.Id}] SendTCPData()");
     _packet.WriteLength();
     client.Tcp.SendData(_packet);
 }