我自己写了一个socket的server端,但是不能获得client端发上来的数据,求指点

代码如下

package main

import (
    "fmt"
    "io"
    "net"
    "os"
)

func main() {
    ln, err := net.Listen("tcp4", ":8080")
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    for {
        conn, err := ln.Accept()
        if err != nil {
            fmt.Println(err)
        }
        go say(conn)
    }
}

func say(conn net.Conn) {
    defer conn.Close()
    io.Copy(conn, conn)
    b := make([]byte, 128)
    for {
        str_len, err := conn.Read(b)
        if str_len == 0 && err != nil {
            fmt.Println(str_len, err)
            return
        }else{
            fmt.Println(string(b))
        }
    }
    fmt.Println(string(b))
}

这样的话,在say里面得io.Copy是能把client传上来的内容原原本本的返回去的(官方文档里面得例子)

但是,我在下面用conn.Read(b)却不能把client上传上来的内容获取到b中,不知道要怎么写呢?我肯定是希望获取到b中,然后做进一步处理,再返回的。

共 4 个回复


jimmykuu

因为 io.Copy 已经读完了,后面再读就读不出来了,你试试注释掉这行应该就可以了。

# 0

facat

io.Copy(conn, conn)把缓存中的数据读完了,这时缓存中就没有数据了。你再用conn.Read自然读不到数据。正确的做法是先把读的数据保存一下:data:=conn.Read(b),然后在用io.Copy,当然是对data用。

# 1

snake117

你可以新建一个bufio,然后用MultiWriter……,拷贝时顺便就生成一个副本出来了。

# 2

snake117

buf := bytes.NewBuffer()
io.Copy(io.MultiWriter(conn, buf), conn)
... ...

之后就使用buf替换下面代码里的conn来读取就行了。

注意:如果交互的数据太多可能会溢出(如果达到GB级)

# 3