为了账号安全,请及时绑定邮箱和手机立即绑定

简单的服务器客户端通信不起作用

简单的服务器客户端通信不起作用

Go
ibeautiful 2023-07-17 16:34:53
这个看似简单的例子并没有按预期工作,我觉得问这个问题很糟糕,但这里是:有一个客户端重试连接到服务器,发送消息,然后等待响应:func client() {    var conn net.Conn    var err error    // retry server until it is up    for {        conn, err = net.Dial("tcp", ":8081")        if err == nil {            break        }        log.Println(err)        time.Sleep(time.Second)    }    // write to server    _, err = conn.Write([]byte("request"))    if err != nil {        log.Println(err)        return    }    // block & read from server    var buf []byte    n, err := conn.Read(buf)    if err != nil {        log.Println(err)        return    }    log.Printf("From server: %s\n", buf[:n])}它连接到一个服务器,该服务器对于每个连接,读取并解释发送的数据,并在需要时发送响应:func server() {    ln, _ := net.Listen("tcp", ":8081")    for {        conn, _ := ln.Accept()        go handleConn(conn)    }}func handleConn(conn net.Conn) {    var buf []byte    n, err := conn.Read(buf)    if err != nil {        return    }    log.Printf("Server got: %s\n", buf)    if string(buf[:n]) == "request" {        _, _ = conn.Write([]byte("response"))    }}全部由main函数驱动:func main() {    go client()    server()}为了简洁起见,省略了错误处理。预期的行为是客户端将连接到服务器并发送消息“请求”,然后阻止读取。服务器接收“请求”并将消息“响应”发送回同一连接。客户端解锁,打印收到的消息并退出。相反,当程序运行时,会打印以下内容:2019/09/01 22:24:02 From server: 2019/09/01 22:24:02 Server got: 表明没有数据交换,并且客户端没有阻塞。
查看完整描述

1 回答

?
www说

TA贡献1775条经验 获得超8个赞

客户端的循环很奇怪!如果读/写已结束,则循环没有意义。但错误只是这样:


  //var buf []byte <--- this read 0 bytes

  buf := make([]byte, 1024) 

  n, err := conn.Read(buf)

给您的建议:


package main


import (

    "log"

    "net"

    "time"

)


func client() {

    var conn net.Conn

    var err error


    // retry server until it is up

    for {

        log.Printf("Connecting...")

        conn, err = net.Dial("tcp", ":8082")

        if err != nil {

            log.Println(err)

            break

        }

        time.Sleep(time.Second)

        // write to server

        log.Printf("Writing...")

        _, err = conn.Write([]byte("request"))

        if err != nil {

            log.Println(err)

            return

        }

        // block & read from server

        log.Printf("Reading...")

        var buf []byte

        n, err := conn.Read(buf)

        if err != nil {

            log.Println(err)

            return

        }

        log.Printf("From server: %s\n", buf[:n])

    }

}


func server() {

    ln, _ := net.Listen("tcp", ":8082")

    for {

        conn, _ := ln.Accept()

        go handleConn(conn)

    }

}


func handleConn(conn net.Conn) {

    buf := make([]byte, 1024)

    n, err := conn.Read(buf)

    if err != nil {

        return

    }

    log.Printf("Server got: [%d bytes] %s\n", n, buf)


    if string(buf[:n]) == "request" {

        _, _ = conn.Write([]byte("response"))

    }

    conn.Close()

}


func main() {

    go client()

    server()

}



查看完整回答
反对 回复 2023-07-17
  • 1 回答
  • 0 关注
  • 86 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信