我有一個 TCP 服務器:
l, err := net.Listen("tcp", "localhost:" strconv.Itoa(tcpPort))
服務器按原樣偵聽傳入的客戶端請求:
for {
c, err := l.Accept()
if err != nil {
log.Fatal(err)
}
b := make([]byte, 1024)
c.Read(b)
fmt.Println(string(b)) // "Hello"
}
我有一個客戶:
conn, err := net.Dial("tcp", address)
現在我寫一次 conn.Write([]byte("Hello"))
服務器捕捉到你好。但如果我有這些:
_, err := conn.Write([]byte("Hello"))
if err != nil {
log.Fatal(err)
}
_, err = conn.Write([]byte("World"))
if err != nil {
log.Fatal(err)
}
然后我會得到Hello,但不會World。
如何在同一個連接上多次寫入?
完整功能如下
func main() {
l, err := net.Listen("tcp", "localhost:1234")
if err != nil {
log.Fatal(err)
}
defer l.Close()
go func() {
for {
c, err := l.Accept()
if err != nil {
log.Fatal(err)
}
b := make([]byte, 1024)
c.Read(b)
fmt.Println(string(b))
}
}()
conn, err := net.Dial("tcp", "localhost:1234")
if err != nil {
log.Fatal(err)
}
_, err = conn.Write([]byte("hello"))
if err != nil {
log.Fatal(err)
}
_, err = conn.Write([]byte("world"))
if err != nil {
log.Fatal(err)
}
}
uj5u.com熱心網友回復:
您的問題出在服務器代碼中,即接收資料的代碼中。它只從 tcp 流中讀取一次。如果您希望它讀取"world",請用read回圈替換單個操作:
go func() {
for {
c, err := l.Accept()
if err != nil {
log.Fatal(err)
}
for {
b := make([]byte, 1024)
c.Read(b)
fmt.Println(string(b))
}
}
}()
uj5u.com熱心網友回復:
您的問題不在于conn.Write從連接中讀取,而在于讀取。現在,您只需從 接受的每個新打開的連接中讀取一次l.Accept()。解決方法是反復閱讀。
您的代碼也僅限于處理一個連接。并且不要忘記檢查錯誤c.Read(b)以了解何時停止偵聽此連接。
go func() {
for {
c, err := l.Accept()
if err != nil {
log.Fatal(err)
}
go func(conn net.Conn) {
for {
b := make([]byte, 1024)
_, err := conn.Read(b)
if err != nil {
if err != io.EOF {
fmt.Println("read error:", err)
}
break
}
fmt.Println(string(b))
}
fmt.Println("Stopping handle connection")
}(c)
}
}()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/343558.html
標籤:走
