コード例 #1
0
ファイル: MainForm.cs プロジェクト: VictorGorban/Messenger
        public bool SendCommandToServer(string serverIp, BaseCommand command, ClientCommandType clientCommandType)
        {
            var commandHeader = new ClientCommandHeader
            {
                Type = clientCommandType
            };

            var client = new TcpClient();

            try
            {
                client.Connect(serverIp, Settings.ServerPort);

                // + составить байты из ClientHeader и сериализации команды (+prepend with length)
                byte[] messageBytes           = CommandUtils.ConcatByteArrays(commandHeader.ToBytes(), command.ToBytes());
                byte[] messageBytesWithLength = CommandUtils.PrependLengthBytes(messageBytes);

                // + отправить байты в NetworkStream
                NetworkStream networkStream = client.GetStream();
                networkStream.Write(messageBytesWithLength, 0, messageBytesWithLength.Length);

                // + Обработать ответ
                HandleServerResponse(client);
            }
            catch (SocketException)
            {
                Error("Cannot sent command to server");
                return(false);
            }

            return(true);
        }
コード例 #2
0
        private static void ParseMessageBytesAndRespondToClient(byte[] bytes, System.Net.Sockets.TcpClient tcpClient)
        {
            if (bytes.Length >= ClientCommandHeader.GetLength())
            {
                ClientCommandHeader commandHeader = ClientCommandHeader.FromBytes(bytes);
                IEnumerable <byte>  commandBytes  = bytes.Skip(ClientCommandHeader.GetLength());

                var commandType = commandHeader.Type;

                BaseCommand baseCommand = commandsFromBytes[commandType].Invoke(commandBytes.ToArray());

                switch (commandType)
                {
                    //case CommandType.SendChatMessage:
                    //    if (OnStringCommand != null)
                    //        OnStringCommand((StringCommand)baseCommand, tcpClient);
                    //    break;
                    //case CommandType.Single:
                    //    if (OnSingleCommand != null)
                    //        OnSingleCommand((SingleCommand)baseCommand, tcpClient);
                    //    break;
                    //case CommandType.File:
                    //    if (OnSingleCommand != null)
                    //        OnFileCommand((FileCommand)baseCommand, tcpClient);
                    //    break;
                    //case CommandType.SaveUser:
                    //    if (OnSingleCommand != null)
                    //        OnSaveUserCommand((SaveUserCommand)baseCommand, tcpClient);
                    //    break;
                }
            }
        }
コード例 #3
0
ファイル: MainForm.cs プロジェクト: VictorGorban/Messenger
        public void HandleServerResponse(object server)
        {
            /** Алгоритм:
             *  Определить тип сообщения
             *  в зависимости от этого,
             *      распарсить байты сообщения (подойдет Dictionary с методами FromStream.)
             *      предпринять действия
             *      отправить ответ.
             *
             *
             *
             *
             */


            var tcpClient = (System.Net.Sockets.TcpClient)server;

            tcpClient.ReceiveTimeout = 3;
            NetworkStream clientStream = tcpClient.GetStream();

            var ms           = new MemoryStream();
            var binaryWriter = new BinaryWriter(ms);

            var messageLengthBytes = new byte[4];
            var messageBytes       = new byte[tcpClient.ReceiveBufferSize];
            int readCount;
            int totalReadMessageBytes = 0;

            clientStream.Read(messageLengthBytes, 0, sizeof(int));
            int messageLength = CommandUtils.BytesToInt(messageLengthBytes);

            while ((readCount = clientStream.Read(messageBytes, 0, tcpClient.ReceiveBufferSize)) != 0)
            {
                binaryWriter.Write(messageBytes, 0, readCount);
                totalReadMessageBytes += readCount;
                if (totalReadMessageBytes >= messageLength)
                {
                    break;
                }
            }

            if (ms.Length > 0)
            {
                ParseResponseBytes(ms.ToArray());
            }

            void ParseResponseBytes(byte[] bytes)
            {
                if (bytes.Length >= ClientCommandHeader.GetLength())
                {
                }
            }
        }