Я написал небольшое приложение, которое создает именованный сервер и клиент, который подключается к нему.Вы можете отправлять данные на сервер, и сервер успешно их читает.
Следующее, что мне нужно сделать, - это получать сообщения с сервера, поэтому у меня есть еще один поток, который порождает, сидит и ждет входящих сообщений.данные.
Проблема в том, что пока поток находится в ожидании входящих данных, вы больше не можете отправлять сообщения на сервер, поскольку он зависает при вызове WriteLine
, так как я предполагаю, что канал теперь связан, проверяя данные.
Так я просто не подхожу к этому правильно?Или именованные каналы не предназначены для такого использования?Примеры, которые я видел на именованных каналах, похоже, идут только в одну сторону: клиент отправляет, а сервер получает, хотя вы можете указать направление канала как In
, Out
или оба.
Буду признателен за любую помощь, указатели или предложения!
Вот код на данный момент:
// Variable declarations
NamedPipeClientStream pipeClient;
StreamWriter swClient;
Thread messageReadThread;
bool listeningStopRequested = false;
// Client connect
public void Connect(string pipeName, string serverName = ".")
{
if (pipeClient == null)
{
pipeClient = new NamedPipeClientStream(serverName, pipeName, PipeDirection.InOut);
pipeClient.Connect();
swClient = new StreamWriter(pipeClient);
swClient.AutoFlush = true;
}
StartServerThread();
}
// Client send message
public void SendMessage(string msg)
{
if (swClient != null && pipeClient != null && pipeClient.IsConnected)
{
swClient.WriteLine(msg);
BeginListening();
}
}
// Client wait for incoming data
public void StartServerThread()
{
listeningStopRequested = false;
messageReadThread = new Thread(new ThreadStart(BeginListening));
messageReadThread.IsBackground = true;
messageReadThread.Start();
}
public void BeginListening()
{
string currentAction = "waiting for incoming messages";
try
{
using (StreamReader sr = new StreamReader(pipeClient))
{
while (!listeningStopRequested && pipeClient.IsConnected)
{
string line;
while ((line = sr.ReadLine()) != null)
{
RaiseNewMessageEvent(line);
LogInfo("Message received: {0}", line);
}
}
}
LogInfo("Client disconnected");
RaiseDisconnectedEvent("Manual disconnection");
}
// Catch the IOException that is raised if the pipe is
// broken or disconnected.
catch (IOException e)
{
string error = "Connection terminated unexpectedly: " + e.Message;
LogError(currentAction, error);
RaiseDisconnectedEvent(error);
}
}