【发布时间】:2012-12-01 04:13:18
【问题描述】:
我是新来的, 我试图用 go 语言准备客户端服务器并尝试编写代码,但它没有提供任何输出。它没有给出任何错误,只是在听。
请有人帮助我,我想使用 go 创建身份验证系统,其中服务器使用用户名密码对客户端进行身份验证..
服务器:
package main
import (
"fmt"
"net"
)
func main() {
service := "0.0.0.0:8080"
tcpAddr, err := net.ResolveTCPAddr("tcp", service)
checkError(err)
listener, err := net.ListenTCP("tcp", tcpAddr)
checkError(err)
for {
conn, err := listener.Accept()
//fmt.Println("Server listerning")
_, err = conn.Read([]byte("HEAD"))
if err != nil {
conn.Close()
}
if err != nil {
continue
}
}
}
func checkError(err error) {
if err != nil {
fmt.Println("Fatal error ", err.Error())
}
}
客户:
package main
import (
"bufio"
"fmt"
"net"
"os"
"strings"
)
func main() {
if len(os.Args) != 2 {
fmt.Println("Usage: ", os.Args[0], "host")
os.Exit(1)
}
host := os.Args[1]
conn, err := net.Dial("tcp", host+":8080")
checkError(err)
_, err = conn.Write([]byte("HEAD"))
reader := bufio.NewReader(os.Stdin)
for {
line, err := reader.ReadString('\n')
ftm.Println(err)
line = strings.TrimRight(line, " \t\r\n")
if err != nil {
conn.Close()
break
}
}
}
func checkError(err error) {
if err != nil {
fmt.Println("Fatal error ", err.Error())
}
}
【问题讨论】:
-
checkError函数基本上打印错误然后什么也不做。这本身就是错误的,因此它的名称具有误导性。考虑使用log.Fatal(err),它会打印错误并调用os.Exit(1)。或者将这样一个对os.Exit的调用添加到您的错误处理函数中,并将其重命名为die或类似的名称。 -
不要忘记,即使没有错误,您也想关闭连接,
defer conn.close()应该在括号之外和之后,并且第一个错误子句应该是在阅读之上 - 我知道这是几年后的事情,但如果人们阅读这个。