Adlandırılmış bir boru sunucusu ve ona bağlanan bir istemci oluşturan küçük bir başvuru yazdım. Verileri sunucuya gönderebilir ve sunucu başarıyla okuyabilir.Tek bir Adlandırılmış Boru istemcisi okuyabilir ve yazabilir misiniz?
Yapmam gereken bir sonraki şey, sunucudan ileti almaktır, bu yüzden gelen veriyi ortaya çıkarıp bekler ve bekler.
Sorun, iş parçacığı gelen verileri beklerken oturdu iken, artık veri denetlemek için bağlanmış olduğunu varsayarak, sunucuya WriteLine
çağrıda asılı olarak iletileri gönderemezsiniz.
Sadece bu doğru bir şekilde yaklaşmıyorum mu? Yoksa böyle kullanılmayacak şekilde adlandırılmış borular mı? Bir borunun yönünü In
, Out
veya her ikisini de belirtebilmenize rağmen, adlandırılmış yöneltmelerde gördüğüm örnekler yalnızca bir yoldan gitmektedir, bir istemci gönderir ve bir sunucu alır.
Herhangi bir yardım, işaretçi veya öneri takdir edilecektir!
İşte şimdiye kadar kod:
// 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);
}
}
Elbette, async'e ihtiyacınız olmadığı sürece bu mümkündür. Bu, DOĞRUDAN BAĞIMSIZ, okuma ve yazma için 2 borunun kullanımının BAĞIMLILIKTA GERÇEKTİR. –
Kulağa biraz şifreli geliyor ... Bu yüzden, okumak için bir boru ve başka bir pipo olması gerektiğini söylüyorsunuz, çünkü her seferinde sadece bir eylem için kullanabilirsiniz. Eğer öyleyse, bu mantıklı – w69rdy