我刚接触Go语言并尝试将TCP服务器做成并发的。我找到了多个相关示例,包括这个,但我正在尝试弄清楚为什么对非并发版本所做的某些更改不起作用。
以下是我参考的原始代码:
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函数。
如果您能提供任何反馈,我将不胜感激。我找到并测试了使用相同方法并发调用处理连接函数的类似代码示例,它们可以正常工作。因此,我想知道我的修改后的代码与其他示例之间有什么不同,因为在我看来它们似乎是相同的。正在启动服务器...
监听端口
接受端口连接
调用handleConnection
我不确定这是否是问题,但我尝试注释掉defer调用close。那没有帮助。
谢谢。