socket服务便是judger服务器的TCP服务。负责处理TCP连接和数据的收发。启动TCP监听
func TcpStart() {
i := 0
ln, err := net.Listen("tcp", ":1004")
handleError(err, nil)
if len(os.Args) > 1 && os.Args[1] == "debug" {
MARK = "#"
} else {
MARK = "\003"
}
for {
conn, err := ln.Accept()
if err != nil {
fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())
continue
}
i += 1
if i > MAX_LCI {
fmt.Println("reached max client limit, server stoped.")
return
}
go handleConnection(conn, i)
}
}
TCP连接监听处于for循环中,每当收到连接请求调用Accept方法创建连接,并且通过go关键词在新线程中通过handleConnection处理当前连接的信息收发。TCP连接的监听端口为1004,TCP协议的帧分割标识是\003。
这个TcpStart方法也是在由主线程创建的子线程中启动的。其代码在core包下的init.go文件中,代码如下
go TcpStart()
HttpStart()
可见TcpStart是在新线程中启动的,而HttpStart是在主线程中启动。由于是服务程序,主线程必须被阻塞,故而将同为阻塞型的方法HttpStart置于主线程中。