Exemple #1
0
        public virtual void SendMessage(ITcpMessage message)
        {
            MessageQueue.Enqueue(message);

            _semaphore.Wait();

            try
            {
                if (NetworkStream.CanWrite)
                {
                    var byteArray = message.GetMessage();

                    var messageLen = BitConverter.GetBytes(byteArray.Length);
                    ReadWriteStream.Write(messageLen);
                    ReadWriteStream.Flush();

                    ReadWriteStream.Write(byteArray);
                    ReadWriteStream.Flush();
                }
            }
            finally
            {
                MessageQueue.TryDequeue(out var massage);
                _semaphore.Release();
            }
        }
Exemple #2
0
        public virtual async Task SendMessageAsync(ITcpMessage message, CancellationToken token)
        {
            MessageQueue.Enqueue(message);

            await _semaphore.WaitAsync(token).ConfigureAwait(false);

            try
            {
                if (NetworkStream.CanWrite)
                {
                    var byteArray = message.GetMessage();

                    var messageLen = BitConverter.GetBytes(byteArray.Length);

                    await ReadWriteStream.WriteAsync(messageLen, token)
                    .ConfigureAwait(false);

                    await ReadWriteStream.FlushAsync(token)
                    .ConfigureAwait(false);

                    await ReadWriteStream.WriteAsync(byteArray, token)
                    .ConfigureAwait(false);

                    await ReadWriteStream.FlushAsync(token)
                    .ConfigureAwait(false);
                }
            }
            finally
            {
                MessageQueue.TryDequeue(out var massage);
                _semaphore.Release();
            }
        }
        public Packet CreatePacket(ITcpMessage message)
        {
            Packet packet = new Packet();

            packet.SendByte((byte)message.MessageType);

            switch (message)
            {
            case PacketClientJoinMessage j:
            {
                packet.SendString(j.OpenttdRevision);
                packet.SendU32(j.NewgrfVersion);
                packet.SendString(j.ClientName);
                packet.SendByte(j.JoinAs);
                packet.SendByte(j.Language);

                break;
            }

            case PacketClientGamePasswordMessage p:
            {
                packet.SendString(p.Password);

                break;
            }

            case PacketClientAckMessage ack:
            {
                packet.SendU32(ack.FrameCounter);
                packet.SendByte(ack.Token);

                break;
            }

            case PacketClientChatMessage chat:
            {
                packet.SendByte((byte)(((byte)NetworkAction.NETWORK_ACTION_CHAT) + ((byte)chat.ChatDestination)));
                packet.SendByte((byte)chat.ChatDestination);
                packet.SendU32(chat.Destination);
                packet.SendString(chat.Message);
                packet.SendU64(chat.Data);

                break;
            }

            case GenericTcpMessage _:
            {
                // here we have only messages that have only type
                break;
            }

            default:
            {
                throw new NotImplementedException(message.MessageType.ToString());
            }
            }

            packet.PrepareToSend();
            return(packet);
        }
Exemple #4
0
    void HandleTcpMessage(ITcpMessage msg)
    {
        switch (msg)
        {
        case ObjectCreatedMessage objMsg:
        {
            var id = objMsg.ObjectId;
            Objects[id] = new SyncObject(this, id, objMsg.OriginalNodeId);

            if (creationQueue.Count > 0 && objMsg.OriginalNodeId == NodeId)
            {
                lock (creationQueue)
                {
                    creationQueue.Dequeue().SetResult(id);
                }
            }

            Logger.Debug("Client", $"Received ObjectId={id}");

            InvokeObjectCreated(id);

            break;
        }

        case ObjectDeletedMessage delMsg:
        {
            var id = delMsg.ObjectId;
            Objects.Remove(id);

            Logger.Debug("Client", $"Received Deletion of ObjectId={id}");

            InvokeObjectDeleted(id);

            break;
        }

        case SymbolRegisteredMessage symMsg:
        {
            SymbolTable.Add(symMsg.Symbol, symMsg.SymbolId);
            if (symbolNotifier.IsWaiting(symMsg.Symbol))
            {
                symbolNotifier.Notify(symMsg.Symbol, symMsg.SymbolId);
            }

            Logger.Debug("Client", $"Received Symbol {symMsg.Symbol}->{symMsg.SymbolId}");
            break;
        }

        case EventSentMessage eventSentMessage:
        {
            HandleEventSentMessage(
                eventSentMessage.Name,
                eventSentMessage.Sender, eventSentMessage.Receiver,
                eventSentMessage.Args
                );
            break;
        }
        }
    }
Exemple #5
0
        public HttpServer(int port, List <Route> routes, ITcpMessage tcpMessage_ = null)
        {
            this.Port      = port;
            this.Processor = new HttpProcessor(tcpMessage_);

            foreach (var route in routes)
            {
                this.Processor.AddRoute(route);
            }
        }
Exemple #6
0
        private void TcpClient_MessageReceived(object sender, ITcpMessage e)
        {
            switch (e.MessageType)
            {
            case TcpMessageType.PACKET_SERVER_CHAT:
            {
                var m = e as PacketServerChatMessage;
                if (m.ClientId == this.tcpClient.MyClientId)
                {
                    break;
                }
                ChatDestination destination = (ChatDestination)((int)m.NetworkAction - (int)NetworkAction.NETWORK_ACTION_CHAT);

                if (new ChatDestination[] { ChatDestination.DESTTYPE_BROADCAST, ChatDestination.DESTTYPE_CLIENT, ChatDestination.DESTTYPE_TEAM }.Contains(destination))
                {
                    this.ReceivedChatMessage?.Invoke(this, new ReceivedChatMessage(m.Message, tcpClient.Players[m.ClientId], destination, this.ServerInfo));
                }
                break;
            }
            }
        }
        public async void UpdateEvents(CancellationToken token)
        {
            while (token.IsCancellationRequested == false)
            {
                ITcpMessage message = null;
                try
                {
                    if (receivedMessageQueue.TryDequeue(out message))
                    {
                        this.MessageReceived?.Invoke(this, message);
                    }

                    if (receivedMessageQueue.IsEmpty)
                    {
                        await Task.Delay(TimeSpan.FromSeconds(0.5));
                    }
                }
                catch (Exception e)
                {
                    this.logger.LogError(e, $"Error with {message?.MessageType}");
                }
            }
        }
Exemple #8
0
 /// <summary>
 /// Sends the MSG.
 /// </summary>
 /// <param name="msg">The MSG.</param>
 public void SendMsg(ITcpMessage msg)
 {
     this.MessageQueue.Enqueue(msg);
     this.waitHandle.Set();
 }
Exemple #9
0
 public HttpProcessor(ITcpMessage tcpMessage_)
 {
     this.tcpMessage = tcpMessage_;
 }
Exemple #10
0
 public TcpHandler(int port, ITcpMessage tcpMessage_ = null)
 {
     this.tcpMessage = tcpMessage_;
     this.Port       = port;
     this.Listener   = new TcpListener(IPAddress.Any, this.Port);
 }
Exemple #11
0
 /// <summary>
 /// 发送一般消息
 /// </summary>
 /// <param name="raw">可转换Json格式的实体类,并继承BaseMessage</param>
 public bool Send(ITcpMessage raw)
 {
     return(Send(Encoding.UTF8.GetBytes($"<jsonMsg>{JsonConvert.SerializeObject(raw)}</jsonMsg>")));
 }
Exemple #12
0
 public TcpMessageReceivedEventArgs(ITcpClientConnection client, ITcpMessage message)
 {
     Message   = message;
     TcpClient = client;
 }
        public async void MainLoop(CancellationToken token, string serverIp, int serverPort, string username, string password, string revision, uint newgrfRevision)
        {
            Task <int> sizeTask = null;

            byte[] sizeBuffer    = new byte[2];
            int    sizeBufferPos = 0;


            while (token.IsCancellationRequested == false)
            {
                try
                {
                    if (this.ConnectionState == ConnectionState.NotConnected)
                    {
                        sizeTask = null;
                        this.Reset();

                        this.ConnectionState = ConnectionState.Connecting;
                        client.Connect(serverIp, serverPort);
                        await this.QueueMessage(new PacketClientJoinMessage()
                        {
                            ClientName      = username,
                            JoinAs          = 255,
                            Language        = 0,
                            OpenttdRevision = revision,
                            NewgrfVersion   = newgrfRevision
                        });
                    }
                    for (int i = 0; i < 100; ++i)
                    {
                        if (this.sendMessageQueue.TryDequeue(out ITcpMessage msg))
                        {
                            Packet packet = this.tcpPacketService.CreatePacket(msg);
                            await client.GetStream().WriteAsync(packet.Buffer, 0, packet.Size);
                        }
                        else
                        {
                            break;
                        }
                    }


                    while ((sizeTask ??= client.GetStream().ReadAsync(sizeBuffer, sizeBufferPos, 2 - sizeBufferPos)).IsCompleted)
                    {
                        sizeBufferPos += sizeTask.Result;

                        if (sizeBufferPos == 1)
                        {
                            sizeTask = client.GetStream().ReadAsync(sizeBuffer, sizeBufferPos, 2 - sizeBufferPos);
                            await sizeTask;
                        }

                        sizeBufferPos = 0;
                        sizeTask      = null;



                        sizeTask = null;

                        ushort size    = BitConverter.ToUInt16(sizeBuffer, 0);
                        byte[] content = new byte[size];
                        content[0] = sizeBuffer[0];
                        content[1] = sizeBuffer[1];
                        int contentSize = 2;


                        do
                        {
                            Task <int> task = client.GetStream().ReadAsync(content, contentSize, size - contentSize);
                            await      task;
                            contentSize += task.Result;
                        } while (contentSize < size);

                        var         packet = new Packet(content);
                        ITcpMessage msg    = this.tcpPacketService.ReadPacket(packet);

                        switch (msg.MessageType)
                        {
                        case TcpMessageType.PACKET_SERVER_FULL:
                        {
                            this.logger.LogWarning($"Cannot join {serverIp}:{serverPort} - server is full");
                            await Task.Delay(TimeSpan.FromMinutes(1));

                            this.Reset();
                            break;
                        }

                        case TcpMessageType.PACKET_SERVER_BANNED:
                        {
                            this.logger.LogWarning($"Cannot join {serverIp}:{serverPort} - user is banned");
                            await Task.Delay(TimeSpan.FromMinutes(10));

                            this.Reset();
                            break;
                        }

                        case TcpMessageType.PACKET_SERVER_NEED_GAME_PASSWORD:
                        {
                            await this.QueueMessage(new PacketClientGamePasswordMessage(password));

                            break;
                        }

                        case TcpMessageType.PACKET_SERVER_FRAME:
                        {
                            var m = msg as PacketServerFrameMessage;
                            await this.QueueMessage(new PacketClientAckMessage(m.FrameCounter, m.Token));

                            this.ConnectionState = ConnectionState.Connected;
                            this.connected       = true;
                            break;
                        }

                        case TcpMessageType.PACKET_SERVER_CHECK_NEWGRFS:
                        {
                            await this.QueueMessage(new GenericTcpMessage(TcpMessageType.PACKET_CLIENT_NEWGRFS_CHECKED));

                            break;
                        }

                        case TcpMessageType.PACKET_SERVER_CLIENT_INFO:
                        {
                            var m      = msg as PacketServerClientInfoMessage;
                            var player = new Player(m.ClientId, m.ClientName);
                            this.players.AddOrUpdate(m.ClientId, player, (_, __) => player);

                            if (connected)
                            {
                                this.receivedMessageQueue.Enqueue(msg);
                            }

                            break;
                        }

                        case TcpMessageType.PACKET_SERVER_QUIT:
                        {
                            var m = msg as PacketServerQuitMessage;

                            this.players.TryRemove(m.ClientId, out _);

                            this.receivedMessageQueue.Enqueue(msg);
                            break;
                        }

                        case TcpMessageType.PACKET_SERVER_ERROR_QUIT:
                        {
                            var m = msg as PacketServerErrorQuitMessage;

                            this.players.TryRemove(m.ClientId, out _);

                            this.receivedMessageQueue.Enqueue(msg);
                            break;
                        }

                        case TcpMessageType.PACKET_SERVER_WELCOME:
                        {
                            var m = msg as PacketServerWelcomeMessage;
                            this.MyClientId = m.ClientId;
                            await this.QueueMessage(new GenericTcpMessage(TcpMessageType.PACKET_CLIENT_GETMAP));

                            this.ConnectionState = ConnectionState.DownloadingMap;
                            break;
                        }

                        case TcpMessageType.PACKET_SERVER_MAP_DONE:
                        {
                            await this.QueueMessage(new GenericTcpMessage(TcpMessageType.PACKET_CLIENT_MAP_OK));

                            break;
                        }

                        default:
                        {
                            if (connected == false)
                            {
                                break;
                            }

                            this.receivedMessageQueue.Enqueue(msg);
                            break;
                        }
                        }
                    }

                    await Task.Delay(1);
                }
                catch (Exception e)
                {
                    this.logger.LogError(e, $"Client failure: {nameof(TcpOttdClient)}:{nameof(MainLoop)} for {serverIp}:{serverPort}");
                    this.Reset();
#if DEBUG
                    await Task.Delay(5_000);  // wait small amount of time xD before reconnecting.
#else
                    await Task.Delay(60_000); // wait 60 seconds before reconnecting.
#endif
                }
            }

            this.ConnectionState = ConnectionState.NotConnected;
        }
 public Task QueueMessage(ITcpMessage message)
 {
     this.sendMessageQueue.Enqueue(message);
     return(Task.CompletedTask);
 }