Я изучаю службы MSMQ и написал простое консольное клиент-серверное приложение, которое отправляет каждое нажатие клавиши на сервер.Каждый раз, когда вы нажимаете контрольный символ (DEL
, ESC
, INS
и т. Д.), Сервер по понятным причинам выдает ошибку.Однако всякий раз, когда я набираю пробел, сервер получает пакет, но не выдает ошибку и не отображает пробел.
Сервер:
namespace QIM
{
class Program
{
const string QUEUE = @".\Private$\qim";
static MessageQueue _mq;
static readonly object _mqLock = new object();
static XmlSerializer xs;
static void Main(string[] args)
{
lock (_mqLock)
{
if (!MessageQueue.Exists(QUEUE))
_mq = MessageQueue.Create(QUEUE);
else
_mq = new MessageQueue(QUEUE);
}
xs = new XmlSerializer(typeof(string));
_mq.BeginReceive(new TimeSpan(0, 1, 0), new object(), OnReceive);
while (Console.ReadKey().Key != ConsoleKey.Escape) { }
}
static void OnReceive(IAsyncResult result)
{
Message msg;
lock (_mqLock)
{
try
{
msg = _mq.EndReceive(result);
Console.Write(".");
Console.Write(xs.Deserialize(msg.BodyStream));
}
catch (Exception ex)
{
Console.Write(ex);
}
}
_mq.BeginReceive(new TimeSpan(0, 1, 0), new object(), OnReceive);
}
}
}
Клиент:
namespace QIM_Client
{
class Program
{
const string QUEUE = @".\Private$\qim";
static MessageQueue _mq;
static void Main(string[] args)
{
if (!MessageQueue.Exists(QUEUE))
_mq = MessageQueue.Create(QUEUE);
else
_mq = new MessageQueue(QUEUE);
ConsoleKeyInfo key = new ConsoleKeyInfo();
while (key.Key != ConsoleKey.Escape)
{
key = Console.ReadKey();
_mq.Send(key.KeyChar.ToString());
}
}
}
}
Клиентский ввод:
Тестирование, тестирование ...
Вывод на сервер:
.Testing, .. Тестирование .....
Вы заметите, что символ пробела отправляетсообщение, но символ не отображается.