gpt4 book ai didi

go - Golang 中带有 TCP/IP 套接字的 channel 无法正常工作

转载 作者:数据小太阳 更新时间:2023-10-29 03:04:28 25 4
gpt4 key购买 nike

我刚开始为我用 C 语言用 TCP/IP 套接字制作的服务器编写 Golang 客户端,然后我发现我的 channel 无法正常工作。

有什么想法吗?

func reader(r io.Reader, channel chan<- []byte) {
buf := make([]byte, 2048)
for {
n, err := r.Read(buf[:])
if err != nil {
return
}
channel <- buf[0:n]
}
}
func client(e *gowd.Element) {
f, err := os.Create("/tmp/dat2")
if err != nil {
log.Fatal()
}
read := make(chan []byte)
c, err := net.Dial("tcp", "127.0.0.1:4242")
if err != nil {
log.Fatal(err)
}
go reader(c, read)
for {
buf := <-read
n := strings.Index(string(buf), "\n")
if n == -1 {
continue
}
msg := string(buf[0:n])
if msg == "WELCOME" {
fmt.Fprint(c, "GRAPHIC\n")
}
f.WriteString(msg + "\n")
}

使用 netcat 测试我的服务器会产生以下输出: http://pasted.co/a37b2954

但我只有:http://pasted.co/f13d56b4

我是 Golang 的新手,所以也许我错了(我可能是错的)

最佳答案

channel 使用看起来没问题,但是从 channel 中检索值会覆盖先前在 buf := <-read 处读取的值因为你在等待换行。

您也可以使用 bufio.Reader读取字符串直到换行。

您的代码片段是部分的,因此无法执行,尝试告诉我:

func reader(r io.Reader, channel chan<- string) {
bufReader := bufio.NewReader(conn)
for {
msg, err := bufReader.ReadString('\n')
if err != nil { // connection error or connection reset error, etc
break
}
channel <- msg
}
}

func client(e *gowd.Element) {
f, err := os.Create("/tmp/dat2")
if err != nil {
log.Fatal()
}
read := make(chan string)
c, err := net.Dial("tcp", "127.0.0.1:4242")
if err != nil {
log.Fatal(err)
}
go reader(c, read)
for {
msg := <-read
if msg == "WELCOME" {
fmt.Fprint(c, "GRAPHIC\n")
}
f.WriteString(msg + "\n")
}
//...
}

编辑:

请查找通用 TCP 客户端读取数据的示例。我还从上面的代码片段中删除了扫描器并添加了缓冲区读取器。

func main() {
conn, err := net.Dial("tcp", "127.0.0.1:4242")
if err != nil {
log.Fatal(err)
}

reader := bufio.NewReader(conn)
for {
msg, err := reader.ReadString('\n')
if err != nil {
break
}
fmt.Println(msg)
}
}

关于go - Golang 中带有 TCP/IP 套接字的 channel 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44876666/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com