如何用Go语言创建客户端服务器?

时间:2012-11-30 11:46:30

标签: sockets go

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

2 个答案:

答案 0 :(得分:5)

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

你应该能做到这一点:

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

你似乎没有对收到的字节服务器端做任何事情(你放弃了Read的结果),这就解释了为什么你认为你什么也得不到。

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

以下是相关问题中的example of client-server communication over TCP

答案 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")

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