跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 用 go 实现 socket ,帮忙看看问题处在哪里
未分類
19 4 月 2021

用 go 实现 socket ,帮忙看看问题处在哪里

用 go 实现 socket ,帮忙看看问题处在哪里

資深大佬 : awanganddong 13

package main  import (  "bytes"  "fmt"  "net"  "time" )  func main() {  listener, err := net.Listen("tcp", "127.0.0.1:9527")  defer listener.Close()  if err != nil {   fmt.Printf("server err %vn", err)  } else {   for {    conn, err := listener.Accept()    if err == nil {     go handleConn(conn)    }   }  } } func Read(conn net.Conn) (string, error) {  readBytes := make([]byte, 1)  var buf bytes.Buffer  for {   _, err := conn.Read(readBytes)   if err != nil {    return "", err   }   readByte := readBytes[0]   if readByte == 't' {    break   }  }  return buf.String(), nil } func Write(conn net.Conn, content string) (int, error) {  var buf bytes.Buffer  buf.WriteString(content)  buf.WriteByte('t')  return conn.Write(buf.Bytes()) }  func handleConn(conn net.Conn) {  for {   conn.SetReadDeadline(time.Now().Add(2))   if str, err := Read(conn); err == nil {    fmt.Printf("收到的数据:%vn", str)    Write(conn, "server got:"+str)   }else{    fmt.Printf("read err: %vn",err)   }  } }  

现在用 telnet 发送消息,然后报错 read err: read tcp 127.0.0.1:9527->127.0.0.1:56508: i/o timeout

大佬有話說 (12)

  • 資深大佬 : codehz

    time 的 add 默认单位是纳秒(

  • 主 資深大佬 : awanganddong

    设置为以下还是同样报错
    conn.SetReadDeadline(time.Now().Add(10 * time.Second))

  • 資深大佬 : codehz

    所以你发送的内容有没有包含制表符呢

  • 主 資深大佬 : awanganddong

    @codehz 我把制表符剔除试下

  • 資深大佬 : djoiwhud

    我看了两分钟也没看出你这个 read 里面定义的 buf 是什么用途。
    每次读一个字节的操作看起来是学习练手的。看得出你没认真读过计算机网络卷一。

    另外 read 的 len 返回值务必处理。

  • 資深大佬 : writesome6

    其实就是你设置的超时时间有问题

  • 資深大佬 : 1000172

    我之前用框架写时遇到连不通是因为跨域的问题(因为我用网页测试,框架内默认进行跨域验证,我重写了跨域验证方法后就好了),你这个没太仔细看,只是送点参考意见

  • 資深大佬 : bruce0

    “`
    func Read(conn net.Conn) (string, error) {
    readBytes := make([]byte, 1)
    var buf bytes.Buffer
    for {
    _, err := conn.Read(readBytes)
    if err != nil {
    return “”, err
    }
    readByte := readBytes[0]
    if readByte == ‘t’ {
    break
    }
    }
    return buf.String(), nil
    }
    “`
    readBytes := make([]byte, 1) 这里你创建的这个切片,长度是 1, 一般没有这样设置的. 一般都是客户端和服务端约定一个包最大长度,比如 1024, 每次客户端和服务端发的数据都不会超过这个最大长度,

    n, err := conn.Read(readBytes) 通过这个函数读的时候, 返回的 n 是这次读取的长度

    而你现在传了一个长度为 1 的切片, 假设这次客户端发来的数据长度为 10 因为你的切片长度为 1 就只能读到第位 后面的都丢了

  • 主 資深大佬 : awanganddong

    以上是我参照别人 demo 写的,里边逻辑确实有问题。

  • 資深大佬 : skiy

    你的 buf.String() 永远是””

  • 資深大佬 : crescentBLADE

    你这是意识流

  • 主 資深大佬 : awanganddong

    属于瞎几把写,我再重新修改修改,里边逻辑不太对

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具