我正在尝试将序列化对象(使用XMLSerializer
)NamedPipe
从服务器进程(.NET 应用程序 exe)发送到客户端进程(.NET 应用程序 exe),反之亦然。
顺序是:
1)服务器应用程序使用打开Exe1 Process.Start(processinfo)
,然后启动服务器管道:
If server.IsConnected = False Then
RaiseEvent ServerWaitingForRequests(pair)
pair.Server.WaitForConnection()
End If
在 Exe1 in Form_Load
event 中,客户端应用程序连接到服务器:
client = New NamedPipeClientStream(".", serverPipeName, PipeDirection.InOut)
If client.IsConnected = False Then client.Connect()
RaiseEvent ClientConnected(serverPipeName)
然后我在ClientConnected
这里处理事件:
Private Sub client_ClientConnected(serverName As String) Handles client.ClientConnected
Timer1.Start(StartStatus.StartNew) 'Starts a timer (I already set the interval to 1 min)
当Timer1
触发 Elapsed 事件时,我使用以下方法将序列化对象发送到服务器 exe:
'PipeMessage is a custom class I created, it is serialize and everything
Private Sub ReplyToServer(message As PipeMessage)
m_mode = ExeRequestStatus.SendingReply
RaiseEvent BeforeMessageSentToServer(message)
Dim ser As New Xml.Serialization.XmlSerializer(message.GetType)
ser.Serialize(client, message)
client.WaitForPipeDrain()
RaiseEvent AfterMessageSentToServer(message)
End Sub
现在我遇到的问题是这一行ser.Serialize(client, message)
完全挂起,编译器根本没有移动到下一行。这使服务器应用程序永远等待客户端请求。
在服务器端,我调用了这个方法(在客户端上.Serialize()
线后从 button1_click() 调用:
Sub ListenToClient(exeInfo As ServerProcessPair)
m_mode = ExeRequestStatus.WaitingForResponse
RaiseEvent ServerWaitingForRequests(exeInfo)
Dim ser As New Xml.Serialization.XmlSerializer(GetType(PipeMessage))
Do
Dim resobj As PipeMessage
Try
resobj = ser.Deserialize(exeInfo.Server)
RaiseEvent ClientExeReplied(exeInfo, resobj)
Exit Do
Catch ex As Exception
End Try
Loop
End Sub
我做错了什么?NamedPipe 是在进程之间发送序列化对象的错误选择吗?
我的系统目标是拥有 1 个服务器应用程序,它本身将产生多个客户端进程。目标是让服务器应用程序从所有打开的客户端进程发送和接收消息。