tcpserver에서 읽는 가장 효율적인 방법은 무엇입니까?
문제
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과 같은 템플릿으로 항상 시작할 수 있기 때문입니다.