문제

TCP 클라이언트에 연결하는 Ruby 서버를 만들고 있습니다. 내 서버는 tcpserver를 사용하고 있으며 tcpserver :: recv ()를 사용하려고하지만 데이터를 기다리지 않으므로 데이터가 수신 될 때까지 긴밀한 루프로 계속됩니다.

간헐적 데이터를 처리하는 가장 효율적인 방법은 무엇입니까? 다른 서버를 모방하려고 시도한 이후로 전송되는 데이터를 변경할 수 없습니다. tcpserver/tcpsocket의 문장처럼 읽은 내용은 데이터가 전송되기를 기다릴까요?


    require "socket"
    dts = TCPServer.new('localhost', 20000)
    s = dts.accept
    print(s, " is accepted\n")
    loopCount = 0;
    loop do
      Thread.start(s) do
        loopCount = loopCount + 1
        lineRcvd = s.recv(1024)
        if ( !lineRcvd.empty? )
          puts("#{loopCount} Received: #{lineRcvd}")
          s.write(Time.now)
        end
      end
    end
    s.close
    print(s, " is gone\n")

시간 내 줘서 고마워.

도움이 되었습니까?

해결책

RECV가 다시 돌아 오지 않는다고 확신합니까? "" - 소켓이 닫혔다는 것을 의미합니까? 그렇지 않다면 아마도 당신의 소켓은 어떻게 든 차단하지 않도록 설정 되었습니까?

EventMachine은 소켓 프로그래밍을 위해 스레드를 사용하는 것보다 훨씬 빠릅니다 :) GL. -아르 자형

다른 팁

당신이 묻는 질문을 바탕으로, 나는 당신이 Eventmachine과 같은 프레임 워크를 시도하고 서버 래퍼를 작성하는 데 소중히 노력하는 대신 원하는 것을 구현하는 서버를 작성해야한다고 생각합니다.

즉, 소켓에서 읽는 가장 효율적인 방법은 적절한 선택 통화를 사용하고 모든 열린 연결을 폴링하는 것입니다. 이것은 이전에 고객-서버 응용 프로그램을 개발 한 사람에게는 상당히 학문적 인 것이지만, 쉽게 잘못 될 수있는 것들이 많이 있기 때문에 귀찮은 일입니다. 예를 들어. 여러 연결을 처리하면 통화 차단을 피하는 데 특히주의하지 않으면 모든 종류의 귀찮은 상황이 발생할 수 있습니다.

EventMachine 프레임 워크를 사용하면 쿼리/응답 유형 서버를 쉽게 개발할 수 있습니다. 예를 들어 내장 EventMachine :: Protocols :: LineAndTextProtocol One과 같은 템플릿으로 항상 시작할 수 있기 때문입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top