예제 #1
0
        private async Task ConnectTask(string ipAddress, string port, string username)
        {
            var ip      = IPAddress.Parse(ipAddress);
            var intPort = int.Parse(port);

            var ipEndpoint = new IPEndPoint(ip, intPort);

            var client = new TcpClient();

            client.Connect(ipEndpoint);

            var stream = client.GetStream();

            // for testing purposes send over join chat room message
            var msg = new JoinChatroomMessage()
            {
                Username = username
            };

            lock (_queueService.QueueLock)
            {
                _queueService.Enqueue(msg);
            }

            var socket = client.Client;

            while (!(socket.Poll(0, SelectMode.SelectRead) && socket.Available == 0))
            {
                if (stream.DataAvailable)
                {
                    int    twoKiloBytes = 2048;
                    byte[] buffer       = new byte[twoKiloBytes];

                    int messageLength = await stream.ReadAsync(buffer, 0, twoKiloBytes);

                    var flushTask = stream.FlushAsync();

                    byte[] actualMessage = buffer.Take(messageLength).ToArray();

                    await Task.Run(() => _messageHandlingService.HandleMessage(actualMessage, socket));


                    await flushTask;
                }

                if (_queueService.ItemAvailable)
                {
                    // Message to send

                    IMessage message;
                    lock (_queueService.QueueLock)
                    {
                        message = _queueService.Dequeue();
                    }

                    var bytes = message.Pack();
                    await stream.WriteAsync(bytes, 0, bytes.Length);

                    await stream.FlushAsync();
                }
            }

            _eventAggregator.GetEvent <KillHeartbeatEvent>().Publish();
            client.Close();
        }