我正在嘗試從 TCP 客戶端讀取和寫入一些命令。我想在最后一個函式執行后關閉連接,但由于某種原因,即使在之后明確放置,服務器似乎也會在函式中間斷開連接。
package main
import (
"bufio"
"fmt"
"io"
"log"
"net"
"strconv"
"strings"
"time"
)
func main() {
listener, err := net.Listen("tcp", "localhost:8000")
if err != nil {
log.Fatal(err)
}
for {
conn, err := listener.Accept()
if err != nil {
log.Print(err)
}
go handleConn(conn)
conn.Close()
}
}
func handleConn(someconnection net.Conn) {
func1(someconnection)
func2(someconnection) //connection drops in the middle of executing this part
}
func func2(someconnection net.Conn) {
//send message(a string)
_, err := io.WriteString(someconnection, dosomething)
if err != nil {
log.Fatal(err)
}
//await reply
//send another message
_, err = io.WriteString(someconnection, dosomething)
if err != nil {
log.Fatal(err)
}
//await reply
//send another message, connection tends to close somewhere here
_, err = io.WriteString(someconnection, dosomething)
if err != nil {
log.Fatal(err)
}
//await,send
_, err = io.WriteString(someconnection, do something)
if err != nil {
log.Fatal(err)
}
//await, read and print message
c := bufio.NewReader(someconnection)
buff1 := make([]byte, maxclientmessagelength)
buff1, err = c.ReadBytes(delimiter)
fmt.Printf("\n%s\n", buff1)
_, err = io.WriteString(someconnection, dosomething)
if err != nil {
log.Fatal(err)
}
}
這意味著試圖向后通信的客戶端根本無法通信,但程式運行到最后。
更新1:
通過將延遲關閉陳述句放置到首次獲取連接時取得了一些進展。
func main() {
listener, err := net.Listen("tcp", "localhost:8000")
if err != nil {
log.Fatal(err)
}
for {
conn, err := listener.Accept()
if err != nil {
log.Print(err)
}
defer conn.Close()
go handleConn(conn)
}}
現在它不一定會在一秒鐘內關閉我希望它關閉但至少它現在一直運行。
uj5u.com熱心網友回復:
Goroutines 是異步的,所以在這里呼叫 handleConn 之后:
go handleConn(conn)
conn.Close()
main 函式繼續執行并關閉連接。嘗試定期呼叫 handleConn 函式(不帶go)。
uj5u.com熱心網友回復:
conn.Close完成作業后需要做的handleConn事情。您可以使用通道與主執行緒進行通信,但這太復雜了(并且還會阻止主執行緒的執行)。這是應該怎么做的
func main() {
listener, err := net.Listen("tcp", "localhost:8000")
if err != nil {
log.Fatal(err)
}
for {
conn, err := listener.Accept()
if err != nil {
log.Print(err)
}
go handleConn(conn)
// REMOVE BELOW LINE
// conn.Close()
}
}
conn.Close在里面添加handleConn
func handleConn(someconnection net.Conn) {
// ADD BELOW LINE
defer someconnection.Close()
func1(someconnection)
func2(someconnection)
}
這確保conn.Close在之后呼叫func1并func2完成執行
uj5u.com熱心網友回復:
您還可以使用 'defer' 在主結束后關閉連接:
func main() {
listener, err := net.Listen("tcp", "localhost:8000")
if err != nil {
log.Fatal(err)
}
for {
conn, err := listener.Accept()
if err != nil {
log.Print(err)
}
go handleConn(conn)
defer conn.Close()
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/463412.html
上一篇:Go測驗定義自定義結構
