我是新手, 我试图用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())
}
}
答案 0 :(得分:5)
我不确定你是否需要解析你的地址才能听。
你应该能做到这一点:
listener, err := net.Listen("tcp", ":8080")
你似乎没有对收到的字节服务器端做任何事情(你放弃了Read
的结果),这就解释了为什么你认为你什么也得不到。
请注意,您的代码一次只能处理一个连接。您应该在新的goroutine中处理每个打开的连接。
答案 1 :(得分:2)
我不确定你的期望是什么输出,因为在我看来你不打印任何东西,只是在客户端读取输入。正如@dystroy指出的那样,服务器然后丢弃它收到的内容,只检查通信中的错误。
此外,似乎您的服务器应该只是坐在那里听,因为你在循环中做到这一点。如果您查看net包的文档,它会给出一个如何运行服务器和客户端的示例。这是我从中做出的一个样本,对我有用。
服务器强>:
ln, err := net.Listen("tcp", ":8080")
// handle error
for {
conn, err := ln.Accept()
// handle error
var cmd []byte
fmt.Fscan(conn, &cmd)
fmt.Println("Message:", string(cmd))
}
<强>客户端强>:
conn, err := net.Dial("tcp", "127.0.0.1:8080")
// handle error
fmt.Fprintf(conn, "message\n")
编辑添加:此程序的预期结果是您运行服务器并且它正在等待。然后,您可以在另一个终端中运行客户端,该终端会立即退出,但现在服务器已打印出“消息:消息”。如果再次运行客户端,服务器将再次打印相同的消息。我在我的机器上测试了这段代码(只是添加代码来响应错误),它就像宣传的那样工作。