2010-03-09 2 views
4

아마 내 소켓 프로그래밍 방식을 혼란스럽게 만들었지 만,이 작업과 같이해서는 안됩니까?Ruby TCPServer 소켓

srv = TCPServer.open(3333) 
client = srv.accept 

data = "" 
while (tmp = client.recv(10)) 
    data += tmp 
end 

나는 꽤 많은 클라이언트 TCPSocket에서 "지고"데이터의 다른 모든 방법을 시도했지만, 그들 모두는 (getc 그룹,,, 등을 읽을됩니다) 루프의 탈옥 결코 끊지 않고. 나는 뭔가 잊고있는 것 같은 기분이야. 내가 뭘 놓치고 있니?

답변

4

흠, 스택 오버플로에서 계속 [내 질문에 대답]. 아마 다른 사람을 도울 것입니다. 내가 뭘하려고했던 일을 가야하는 쉬운 방법을 발견 : 전무 또는 false를 반환 client.recv(10) 있도록 소켓에 기록 CA는 아무것도 없다

srv = TCPServer.open(3333) 
client = srv.accept 

data = "" 
recv_length = 56 
while (tmp = client.recv(recv_length)) 
    data += tmp 
    break if tmp.length < recv_length 
end 
+3

보내려는 시퀀스의 마지막 청크는 정확하게 'recv_length' 크기 일 수 있으며 루프는 한 번 더 실행됩니다 (오류). – clyfe

1

. 시도 :
SRV = TCPServer.open 당신이 중 하나를 수행해야합니다 서버가 잘 기록 할 (3333) 클라이언트 = srv.accept 위해

data = "" 
while (tmp = client.recv(10) and tmp != 'QUIT') 
    data += tmp 
end 
8

을 :

  • 미리 알아야 전달할 데이터의 양 : recv(size) 대신 read(size) 메소드를 사용할 수 있습니다. read은 총 바이트 수가 수신 될 때까지 차단됩니다.
  • 종료 시퀀스가 ​​있음 :이 경우 통신이 끝났음을 나타내는 일련의 바이트를 수신 할 때까지 루프를 recv에 보관합니다.
  • 통신을 마친 후 클라이언트가 소켓을 닫도록하십시오.이 경우 read은 부분 데이터 또는 0을 반환하고 recv은 0 크기 데이터 data.empty?==true을 반환합니다.
  • 통신 시간 초과 정의 : 특정 기간 후에 통신이 없을 때 시간 초과를 얻으려면 select 기능을 사용할 수 있습니다. 이 경우 소켓을 닫고 모든 데이터가 통신되었다고 가정합니다.

희망이 도움이됩니다.