2013-05-05 7 views
0

TCPSocket을 사용하면, socket.puts "foobar"이 필요하고, socket.close이 소켓의 반대쪽에있는 소켓에 연결됩니다. socket.read.Ruby를 사용하여 TCP 연결을 유지하는 방법은 무엇입니까?

소켓을 통해 메시지를 보내거나받을 수있는 방법이 있지만 소켓을 닫지 않아도 소켓을 다시 만들지 않고 메시지를 다시 보낼 수 있습니까? 웹 소켓

답변

3

수퍼 클래스 체인을 탐색하면 결국 IO에서 상속 받음을 알 수 있습니다. 대부분 IO 객체는 Ruby에서 데이터를 버퍼링하여 디스크에서 더 효율적으로 쓰기 및 읽기를 수행합니다.

귀하의 경우 버퍼가 플러시되지 않을 정도로 충분히 크지 않았거나 충분한 시간이 경과하지 않았습니다. 그러나 소켓을 닫을 때 버퍼 자원이 강제로 플러시됩니다. 수동 IO#flush를 사용하여 세척하기 위해 버퍼를 강제 할 수

  • :

    당신은 몇 가지 옵션이 있습니다.
  • IO#sync=true으로 설정하여 쓰기/읽기 후에 항상 동기화하도록 버퍼를 설정할 수 있습니다. IO 개체의 동기화 상태를 확인하려면 IO#sync을 사용하세요. 나는 당신이 볼 것 같아요. socket.synC#=> false
  • BasicSocket#send을 사용하십시오. call POSIX send(2); 소켓은 이고, 주소는 O_FSYNC이며, send는 동기 및 원자 단위입니다.
+0

소켓에'sync '를 설정할 필요는 없습니다. 소스를 살펴보면, 소켓은 ['O_FSYNC'] (https : // github.)와 함께 [초기화] (https://github.com/ruby/ruby/blob/trunk/ext/socket/init.c#L67)됩니다. co.kr/ruby ​​/ ruby ​​/ blob/trunk/io.C# L5526-5530) set과 ['# send'] (https://github.com/ruby/ruby/blob/trunk/ext/socket/basicsocket.c) # L561-L573)은 POSIX ['send (2)'] (https://github.com/ruby/ruby/blob/trunk/ext/socket/init.c#L86) – dbenhur

+0

을 호출합니다. 'send'가 아닌'puts '를 사용하면'sync'에 의해 제어되는 내부 버퍼링 로직을 거치게됩니다. – dbenhur

+0

감사합니다. 해당 옵션도 함께 대답을 업데이트했습니다. –

1

같은

p.s 뭔가 읽어 상대방의 순서 연결을 닫습니다이 켜지지해서는 안됩니다. send은 즉시 conection을 통해 데이터를 전송해야합니다. 상대방이 소켓에서 읽는지 확인하십시오.

+0

+1'send' 작동 – mko

관련 문제