新手问题 咨询一个 Ruby 的 socket 监听的问题

haoshanshan · 2015年08月17日 · 最后由 mueven 回复于 2015年08月19日 · 1916 次阅读
socket = TCPSocket.new(ip,port)
socket.send(construct_msg,0) #(发送注册侦听器消息)

问题是:现在成功的注册了侦听器后,一直监听链路上是否有返回的消息,并打印出该返回消息,这个如何实现了,各位大牛

ans = socket.read
puts ans

#1 楼 @so_zengtao

socket.read 是个 block 的操作,如果 server 没有返回 eof,客户端不会打印出任何东西。

所以应该使用 partial read 来替代 read。

1. Lifecycle of TCP socket client

  1. create socket
  2. bind(if you skip this step, system will defaultly bind a ephemeral port to connect server.)
  3. connect
  4. close

2. This example is verbose but easy to understand

require 'socket'
# step1 create
socket = Socket.new(:INET, :STREAM)

# step2 bind(skip)

# step3 connect
remote_addr = Socket.pack_sockaddr_in(80, 'google.com')
socket.connect(remote_addr)

while data = socket.readpartial(one_hundred_kb) do
  puts data
end


# step4 close
socket.close

3. stackoverflow 上一个很好范例

http://stackoverflow.com/questions/8649860/ruby-tcpsocket-http-request

4. 一本很好的关于 Tcp socket 的通俗易懂的书

[book] Working with TCP Sockets

大便时遇到这个问题,顺便回一下。

@xiaoronglv @so_zengtao 哇塞,谢谢 2 位大牛

@haoshanshan 之前社区里有帖子讨论过 socket,有例子

需要 登录 后方可回复, 如果你还没有账号请 注册新账号