gpt4 book ai didi

go - 使 Golang TCP 服务器并发

转载 作者:IT王子 更新时间:2023-10-29 00:36:08 24 4
gpt4 key购买 nike

Go 的新手并尝试使 TCP 服务器并发。我发现了多个这样的例子,包括 this one ,但我想弄清楚的是为什么我对非并发版本所做的一些更改不起作用。

这是我开始的原始示例代码

package main
import "bufio"
import "fmt"
import "log"
import "net"
import "strings" // only needed below for sample processing

func main() {
fmt.Println("Launching server...")
fmt.Println("Listen on port")
ln, err := net.Listen("tcp", "127.0.0.1:8081")
if err != nil {
log.Fatal(err)
}
defer ln.Close()

fmt.Println("Accept connection on port")
conn, err := ln.Accept()
if err != nil {
log.Fatal(err)
}

fmt.Println("Entering loop")
// run loop forever (or until ctrl-c)
for {
// will listen for message to process ending in newline (\n)
message, _ := bufio.NewReader(conn).ReadString('\n')
// output message received
fmt.Print("Message Received:", string(message))
// sample process for string received
newmessage := strings.ToUpper(message)
// send new string back to client
conn.Write([]byte(newmessage + "\n"))
}
}

上面的工作,但它不是并发的。

这是我修改后的代码

package main
import "bufio"
import "fmt"
import "log"
import "net"
import "strings" // only needed below for sample processing

func handleConnection(conn net.Conn) {
fmt.Println("Inside function")
// run loop forever (or until ctrl-c)
for {
fmt.Println("Inside loop")
// will listen for message to process ending in newline (\n)
message, _ := bufio.NewReader(conn).ReadString('\n')
// output message received
fmt.Print("Message Received:", string(message))
// sample process for string received
newmessage := strings.ToUpper(message)
// send new string back to client
conn.Write([]byte(newmessage + "\n"))
}

}

func main() {
fmt.Println("Launching server...")
fmt.Println("Listen on port")
ln, err := net.Listen("tcp", "127.0.0.1:8081")
if err != nil {
log.Fatal(err)
}
//defer ln.Close()

fmt.Println("Accept connection on port")
conn, err := ln.Accept()
if err != nil {
log.Fatal(err)
}
fmt.Println("Calling handleConnection")
go handleConnection(conn)

}

我的代码基于我发现的并发服务器的其他几个例子,但是当我运行上面的代码时,服务器似乎退出而不是运行 handleConnection 函数

Launching server...

Listen on port

Accept connection on port

Calling handleConnection

感谢任何反馈,因为我使用相同的方法发现并测试了类似的代码示例,并发调用函数来处理连接,工作正常;所以,想知道我修改后的代码与我看到的其他示例有什么不同,因为它们对我来说似乎是一样的。

我不确定这是否是问题所在,但我尝试评论延迟调用以关闭。这没有帮助。

谢谢。

最佳答案

您的 main 函数在接受新连接后立即返回,因此您的程序在连接可以被处理之前退出。由于您可能还想接收多个连接(否则不会并发),因此您应该将它放在一个 for 循环中。

您还在 for 循环的每次迭代中创建一个新的缓冲读取器,这将丢弃所有缓冲数据。您需要在 for 循环之外执行此操作,我在这里通过创建一个新的 bufio.Scanner 来演示。这是阅读换行符分隔文本的更简单方法。

import (
"bufio"
"fmt"
"log"
"net"
"strings"
)

func handleConnection(conn net.Conn) {
defer conn.Close()
scanner := bufio.NewScanner(conn)
for scanner.Scan() {
message := scanner.Text()
fmt.Println("Message Received:", message)
newMessage := strings.ToUpper(message)
conn.Write([]byte(newMessage + "\n"))
}

if err := scanner.Err(); err != nil {
fmt.Println("error:", err)
}
}

func main() {
ln, err := net.Listen("tcp", "127.0.0.1:8081")
if err != nil {
log.Fatal(err)
}

fmt.Println("Accept connection on port")

for {
conn, err := ln.Accept()
if err != nil {
log.Fatal(err)
}
fmt.Println("Calling handleConnection")
go handleConnection(conn)
}
}

关于go - 使 Golang TCP 服务器并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51254367/

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