4

我是新手,我试图用 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())
        }
}
4

2 回答 2

5

我不确定您是否需要解析您的地址才能收听。

你应该能够做到这一点:

listener, err := net.Listen("tcp", ":8080")

而且您似乎对接收到的字节服务器端没有做任何事情(您丢弃了 的结果Read),这解释了为什么您认为您什么也没有收到。

请注意,您的代码一次只能处理一个连接。您应该在新的 goroutine 中处理每个打开的连接。

这是相关问题中通过 TCP 进行客户端-服务器通信的示例。

于 2012-11-30T11:55:49.867 回答
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")

编辑添加:该程序的预期结果是您运行服务器并且它正在等待。然后,您在另一个终端中运行客户端,该终端立即退出,但现在服务器已打印“消息:消息”。如果您再次运行客户端,服务器将再次打印相同的消息。我在我的机器上测试了这段代码(只是添加代码来响应错误),它像宣传的那样工作。

于 2012-11-30T20:13:18.300 回答