简单的命名管道Demo
客户端:输入 1+1 点击发送,将1+1传给服务端
服务端:进行运算后把结果返回给客户端
下面是核心代码,完整Demo点击这里
client:
private void sendMsgToServer()
{
string _name = "sendMsgToServer";
using (var client = new NamedPipeClientStream(".", m_sPipeName, PipeDirection.InOut))
{
try
{
client.Connect(2000);
Helper.LogHelper.Log_Info(m_sClassName + _name, "连接服务器成功,管道名称:" + m_sPipeName);
using (var pipe = new Helper.PipeStream(client))
{
Helper.LogHelper.Log_Info(m_sClassName + _name, "开始循环收发消息,管道名称:" + m_sPipeName);
while (!m_bClosePipe)
{
if (m_bSend)
{
m_bSend = !m_bSend;
m_bReceive = !m_bReceive;
this.Dispatcher.Invoke(delegate ()
{
Helper.MsgModel msg = GetMsg();
if (msg != null)
{
string sendMsg = JsonConvert.SerializeObject(msg);
pipe.Send(sendMsg);
Helper.LogHelper.Log_Info(m_sClassName + _name, "向服务器发消息,管道名称:" + m_sPipeName);
}
});
}
if (m_bReceive)
{
m_bReceive = !m_bReceive;
string receive = pipe.Receive();
if (!string.IsNullOrEmpty(receive))
{
MessageBox.Show(receive, "接收到来自服务器的消息");
Helper.LogHelper.Log_Info(m_sClassName + _name, "接收到来自服务器的消息,管道名称:" + m_sPipeName);
}
}
}
string closeMsg = JsonConvert.SerializeObject(null);
pipe.Send(closeMsg);
Helper.LogHelper.Log_Info(m_sClassName + _name, "向服务器发送关闭管道消息,管道名称:" + m_sPipeName);
}
client.Close();
Helper.LogHelper.Log_Info(m_sClassName + _name, "客户端管道关闭,管道名称:" + m_sPipeName);
MessageBox.Show("客户端当前命名管道已关闭", "客户端");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString(), "客户端");
Helper.LogHelper.Log_Error(m_sClassName + _name, "错误:" + ex.Message.ToString());
}
}
}
server:
private void listenClient()
{
while (!m_bClose)
{
using (m_PipeServer = new NamedPipeServerStream(m_sPipeName, PipeDirection.InOut, m_iMaxNumber))
{
try
{
m_PipeServer.WaitForConnection();
using (m_pipeStream = new Helper.PipeStream(m_PipeServer))
{
while (true)
{
string msgJson = m_pipeStream.Receive();
if (msgJson != "null")
{
Helper.MsgModel msg = JsonConvert.DeserializeObject<Helper.MsgModel>(msgJson);
double number1 = Convert.ToDouble(msg.number1);
double number2 = Convert.ToDouble(msg.number2);
switch (msg.type)
{
case "+":
DoMain_A(number1, number2);
break;
case "-":
DoMain_B(number1, number2);
break;
case "*":
DoMain_C(number1, number2);
break;
case "/":
DoMain_D(number1, number2);
break;
}
m_PipeServer.RunAsClient(SendToClent);
}
else
{
break;
}
}
}
m_PipeServer.Close();
MessageBox.Show("服务器当前命名管道已关闭","服务器");
}
catch(Exception ex)
{
MessageBox.Show(ex.Message.ToString(), "服务器");
}
}
}
}