1

我正在尝试将序列化对象(使用XMLSerializerNamedPipe从服务器进程(.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_Loadevent 中,客户端应用程序连接到服务器:

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 个服务器应用程序,它本身将产生多个客户端进程。目标是让服务器应用程序从所有打开的客户端进程发送和接收消息。

4

0 回答 0