LSP API:
我们现在利用GO语言来撰写LSP协议。你必须用准确的API来促进自动测试,这样子就能保证在不同的运行中的兼容性问题。
LSP的API可以在lsp文件夹中被找到,这部分也是代码的开始。文件定义了几种输出,包括借口,界面和常数,同时也提供了详细的文件描述,讲述了内容和兼容各种层面的API。可以定期的查询。
LSP信息:
不同的LSP信息被定义成如下的常数整形:
type MsgType int
const (
MsgConnect MsgType =iota // Connection request fromclient.
MsgData // Datamessage from client or server.
MsgAck //Acknowledgment from client or server.
)
EachLSP message consists of four
elds, and is declared as a Go struct:
type Message struct {
Type MsgType // Oneof the message types listed above.
ConnID int // Uniqueclient-server connection ID.
SeqNum int // Messagesequence number.
Payload []byte //Data message payload.
}
这个其实就是前面说的队列序号,连接ID什么的那几种参数的实现方式,相信也比较容易熟悉。但是,如果要在网络上传输信息,你必须首先把结构转化为一个UDP包通过把信息整理成一序列的字节。
这个方法可以用Go语言的json包里的marshal函数实现。
LSP 参数:
在客户端和服务器里,API都提供了一种机制去指定时间上限K,时间点长度b,和滑动窗口的大小a在服务器和客户端建立的时候。这些参数会被密封在下面的结构体里:
type Params struct {
EpochLimit int // Default value is 5.
EpochMillis int // Default value is 2000.
WindowSize int // Default value is 1.
}
LSP的客户端API:
应用程序会调用函数去建立新的客户端和初始化客户端的各种活动。不过,在客户端和服务器的连接已经被着手却返回一个非空的关于连接没被建立的错误时,这个函数就失败了。函数被定义如下:
func NewClient(hostport string, params *Params) (Client,error)
LSP的客户端API被客户端的界面定义模式如下:
ConnID() int
Read() ([]byte, error)
Write(payload []byte) error
Close() error
类似客户端,服务器的界面允许应用程序对客户端进行读写操作。注意,然而也是因为服务器会同时连接好几个LSP客户端,write和closeconn模式会要求客户端提供自己的连接ID作为凭证,指示这段连接到底是应该被写还是被关闭。
如果要了解更详细的文件描述和每个函数的模式和功能,可以参考server_api.go 和 server_impl.go 文件。
初始代码:
初始代码可以在p1/src/github.com/cmu440/目录下,具体功能和分布如下:
lsp文件夹里包含了API,测试,和需要完善的开始代码:
client_api.go, server_api.go, message.go,和params.go 文件包含了对LSP,API的定义。为了调试的正常,这些文件是不能改动的。
client_impl.go 文件包含了对用户端设计的一些框架,你要自己填具体内容。
server_impl.go 文件包含了对服务器设计的一些框架,你要自己填具体内容。
*_test.go 文件包含了我们要在Autolab上运行的测试代码,并评估你最后的提交。
lspnet文件夹里包含了所有你需要的UDP操作。在后台,lspnet包提供了额外的可以增强系统稳固性的功能。
srunner (server-runner) 和 crunner (client-runner)文件夹分别提供了可执行的可以用于调试的程序。这些程序的使用方法被放置在project的readme.md里面。
这里还提供了上面所说的用意测试的之前就编译过的在srunner 和 crunner 中的可执行文件。这两个文件都通过LSP实例被编译过,所以你会发现在早起编程时非常有用,例如,你在还没写服务器的情况下想测试一下你的客户端。这些指令的使用方法同时在readme.md里面。
对于提供的开始代码,你可能需要添加一些实用的文档。例如,你可能会突然奇想添加一个common.go然后用它去存储那些可以在客户端和服务器都能用上的代码。
(未完待续)
有疑问加站长微信联系(非本文作者)