我这边有个 server 以 socket 同步短联接方式提供类似生成支付密码的功能。 要求接收数据包结构为
名称 类型 长度
-----------------------------------
账号 字符 32
签发日期 字符 8
凭证种类 字符 1
签发金额 字符 16
凭证号码 字符 8
收方账号 字符 32
返回数据包结构为
名称 类型 长度
-----------------------------------
返回码 字符 6
支付密码 字符 16
这个 server 功能已经实现了 我这边作为 client 要怎么通过 socket 调用这个功能啊 纯小白一个,求助啊。
require 'socket'
s = TCPSocket.new 'localhost', 2000
while line = s.gets # Read lines from socket
puts line # and print them
end
s.close # close socket when done
API 的例子啊。
@zgm api 的例子我都看了,还是不太会调这种实际的功能。主要是不知道 server 具体是怎么写的,文档基本都是上面这种只说了要接收和返回的数据包结构。 btw,这 api 例子返回为空。
自定义传输格式的 API 最蛋疼了。先搞清楚,字符数不够是用什么填充,'\0'
还是 空格。按要求格式好字符串,比如是 '\0'
填充(|
不需要,方便看清楚加的分隔符,...
表示省略若干字符)。
|12341234...1234|20120124|5|234\0\0\0\0\0...\0\0|12345678|123123...1234|
依次是
|账号|日期|种类|金额|凭证|帐号|
格式化好后用 TCPSocket#write
发出去,然后用 TCPSocket#read
读 22 个字符。
raw_request = request.to_raw_request socket.write(raw_request) raw_response = socket.read(22) response = Response.parse_raw(raw_response)
可以先用 telnet
连上去试试 telnet hostname port
后依次输入 32 位帐号,8 位日期等所有输入然后看看服务器返回些什么东西。
PS,可以用 Array#pack
和 String#unpack
来格式化 request 和解析 response
["12341234", "20121230", "1", "200.3", "5555", "43214321"].pack("A32A8A1A16A8A32")
A32
表示 32 长度的字符串,不够长度在后面补齐空格。换成 a32
就是补齐'\0'
。如果不是明文字符串,而是数字序列化也可以用相应的 flag 来格式化和解析。