2017-01-13 8 views
0

https://netmq.readthedocs.io/에있는 간단한 수신/요청 소켓 예제 중 하나를 가져 와서 무한 루프의 parametrizedThread와 함께 사용하려고했습니다. 코드는 비 - 블로킹 소켓 작업 내가이 위의 첫 번째 루프 후 즉시 발생해야 뭐가 들어 즉시루프시 NetMQ 수신/응답이 작동하지 않음

완료 할 수없는

발생 후, 몇 루프를 위해 잘 작동 무작위로가 아니라. 여기서 문제는 무엇입니까? 뭔가 깨끗한 연결을 다시하기 위해 플러시되어야하는 것 같습니다 (확실하지 않음).

class Program 
{ 
    public class Connector 
    { 
     public String connection { get; set; } 
     public ResponseSocket server { get; set; } 

     public Connector(string address, ResponseSocket server_) 
     { 
      this.connection = address; 
      this.server = server_; 
     } 
    } 

    static void Main(string[] args) 
    { 
     string connection = "tcp://localhost:5555"; 
     using (var server = new ResponseSocket()) 
     { 
      while (true) 
      { 
       try 
       { 
        server.Bind(connection); 
       } 
       catch (NetMQException e) 
       { 
        Console.WriteLine(e.ErrorCode); 
       } 

       Connector c = new Connector(connection, server); 

       ParameterizedThreadStart parametrizedClientThread = new ParameterizedThreadStart(runClientSide); 
       Thread t = new Thread(parametrizedClientThread); 
       t.Start(c); 
       //runClientSide(connection, server); 
      } 
     } 
    } 

    private static void runClientSide(object param) 
    { 
     Connector conn = (Connector)param; 
     string connection = conn.connection; 
     ResponseSocket server = conn.server; 
     using (var client = new RequestSocket()) 
     { 
      client.Connect(connection); 
      client.SendFrame("Hello"); 

      string fromClientMessage = server.ReceiveFrameString(); 
      Console.WriteLine("From Client: {0}", fromClientMessage); 
      server.SendFrame("Hi Back"); 

      string fromServerMessage = client.ReceiveFrameString(); 
      Console.WriteLine("From Server: {0}", fromServerMessage); 

      //Console.ReadLine(); 
     } 
    } 
+0

동일한 포트 번호를 사용하는 서버에 대한 연결은 하나만 열 수 있습니다. 새 연결을 열기 전에 연결을 닫거나 각 메시지 이후에 연결을 닫지 않아야합니다. while 루프가 잘못되었습니다. – jdweng

+0

루프가 문제가 아닌지 확실하지 않습니다. 실제로 parametrizedThread 부분을 제거하고 주석 처리 된 메서드 (밑의 입력 매개 변수 수정)를 사용하면 루프에서 코드가 제대로 작동합니다. 요청/응답이 스레드로부터 안전하지 않다는 것을 알고 있습니다. 무엇이 잘못되었는지 확신하지 못합니다. – yp10

+0

main() 메서드는 스레드 스레딩과 동일한 프로세스가 아니며 "Invoke"를 사용하여 두 프로세스간에 데이터를 전송해야합니다. – jdweng

답변

1

NetMQSockets는 스레드로부터 안전하지 않습니다 당신은 당신의 클라이언트 스레드가 데이터를 송/수신하는 내부에서 서버에 액세스하고 있습니다. 클라이언트는 어쨌든 서버 소켓에 액세스해서는 안됩니다.

먼저 Bind를 while 루프 외부로 이동하십시오. 한 번만 필요하며 작성된 모든 클라이언트에는 필요하지 않습니다. 메시지가 NetMQPoller이 될 때까지 기다리려면 다른 모든 것을 처리하고 메시지를 받으면 서버 ReceiveReady 이벤트를 발생시킵니다.

static void Main(string[] args) { 
    string connection = "tcp://localhost:5555"; 
    using (var poller = new NetMQPoller()) { 
     using (var server = new ResponseSocket()) { 
      server.ReceiveReady += Server_ReceiveReady; 
      poller.Add(server); 
      poller.RunAsync(); 

      server.Bind(connection); 

      // start 10000 clients 
      for(int i = 0; i < 10000; i++) { 

       ParameterizedThreadStart parametrizedClientThread = new ParameterizedThreadStart(runClientSide); 
       Thread t = new Thread(parametrizedClientThread); 
       t.Start(connection); 
      } 

      Console.ReadLine(); //let server run until user pressed Enter key 
     } 
    } 
} 

//server (e.Socket) is receiving data here and can answer it 
private static void Server_ReceiveReady(object sender, NetMQSocketEventArgs e) { 
    string fromClientMessage = e.Socket.ReceiveFrameString(); 
    Console.WriteLine("From Client: {0}", fromClientMessage); 
    e.Socket.SendFrame("Hi Back"); 
} 

private static void runClientSide(object param) { 
    string connection = (string) param; 

    using (var client = new RequestSocket()) { 
     client.Connect(connection); 
     client.SendFrame("Hello"); 

     //Removed server side code here and put it into ReceiveReady event 

     string fromServerMessage = client.ReceiveFrameString(); 
     Console.WriteLine("From Server: {0}", fromServerMessage); 
    } 
} 
+0

고마워, 지금 내가 잘못하고있는 곳을 본다. 많은 도움을 주셨습니다! – yp10