我正在尝试为二进制网络协议编写客户端.所有网络操作都通过单个TCP连接执行,因此从这个意义上说,服务器的输入是连续的字节流.然而,在应用层,服务器在概念上在流上发送分组,并且在发送其自己的响应之前,客户端继续读取直到它知道已完全接收到分组.
完成这项工作所需的大量工作包括解析和生成二进制数据,我正在使用Data.Serialize模块.
服务器在TCP流上向我发送"数据包".分组不一定由换行符终止,也不是预定大小.它确实由预定数量的字段组成,字段通常以描述该字段长度的4字节数开头.在Data.Serialize的帮助下,我已经有了将此数据包的ByteString版本解析为更易于管理的类型的代码.
我希望能够用这些属性编写一些代码:
那么简而言之, 是否可以利用我当前的ByteString解析代码与惰性IO结合使用来准确读取网络中正确的字节数?
我试图将lazy ByteStreams与我的Data.Serialize实例结合使用,如下所示:
import Network
import System.IO
import qualified Data.ByteString.Lazy as L
import Data.Serialize
data MyType
instance Serialize MyType
main = withSocketsDo $ do
h <- connectTo server port
hSetBuffering h NoBuffering
inputStream <- L.hGetContents h
let Right parsed = decodeLazy inputStream :: Either String MyType
-- Then use parsed to form my own response, then wait for the server reply...
Run Code Online (Sandbox Code Playgroud)
这似乎主要在上面的第3点失败:即使在已经到达足够数量的字节来解析MyType之后它仍然被阻止.我强烈怀疑这是因为ByteStrings一次以给定的块大小 …
我的印象是obj.method
导致红宝石method
如此寻找:
obj
单身课.obj
单例类所包含的模块.obj
上课.obj
班级所包含的模块method_missing
原始对象obj
.在这个模型下,搜索该方法的唯一单例类是原始接收器的单例类obj
.但是,这个模型无法解释子类可以访问其超类的单例方法的事实.例如
class Foo
def self.foo
"foo"
end
end
class Bar < Foo
end
Bar.foo #=> "foo"
Run Code Online (Sandbox Code Playgroud)
我很困惑,因为我相信这意味着Foo
单身类在某些时候搜索了这个方法foo
.但是,根据上面的模型,我希望只Bar
搜索单例类foo
.如果做不到这一点,我希望ruby可以查看Bar
类,Class
然后继续爬上超类链(Foo
完全跳过它的单例类).
所以我的问题是:我对Ruby方法查找的理解缺少什么,这解释了一个类可以访问其超类的单例方法的事实?