日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線(xiàn)咨詢(xún)客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

php小編小新在網(wǎng)絡(luò)編程中,關(guān)閉客戶(hù)端連接后,如何從tcp套接字完全讀取緩沖內(nèi)容是一個(gè)常見(jiàn)問(wèn)題。當(dāng)客戶(hù)端關(guān)閉連接時(shí),服務(wù)器端可能仍然存在未讀取的數(shù)據(jù)。為了確保完整讀取緩沖內(nèi)容,可以采用以下幾種方法:1.使用循環(huán)讀取,直到讀取到數(shù)據(jù)結(jié)束標(biāo)志;2.設(shè)置超時(shí)時(shí)間,如果在規(guī)定時(shí)間內(nèi)未讀取到數(shù)據(jù)則跳出循環(huán);3.使用非阻塞套接字,通過(guò)輪詢(xún)檢查是否有數(shù)據(jù)可讀。以上方法可以保證從tcp套接字中完全讀取緩沖內(nèi)容,提升網(wǎng)絡(luò)通信的穩(wěn)定性和可靠性。

問(wèn)題內(nèi)容

我有一個(gè) go 服務(wù)器正在偵聽(tīng) tcp 套接字,在關(guān)閉期間我希望它告訴客戶(hù)端停止發(fā)送更多數(shù)據(jù),但也讀取客戶(hù)端迄今為止發(fā)送的所有內(nèi)容。我看到的是,一旦客戶(hù)端連接關(guān)閉,服務(wù)器就會(huì)停止讀取,但它永遠(yuǎn)不會(huì)收到客戶(hù)端認(rèn)為它發(fā)送的所有內(nèi)容。我認(rèn)為發(fā)生的情況是操作系統(tǒng)正在緩沖收到的 tcp 數(shù)據(jù)包,然后在服務(wù)器關(guān)閉客戶(hù)端連接時(shí)丟棄它們。

這是一個(gè)顯示該問(wèn)題的程序。服務(wù)器監(jiān)聽(tīng),然后打印出它收到的內(nèi)容;客戶(hù)端發(fā)送并打印出發(fā)送的內(nèi)容。服務(wù)器中斷客戶(hù)端以停止它,但最后我希望這兩個(gè)列表相同。

此示例使用 bufio.scanner 讀取套接字,但我也嘗試過(guò)僅從連接讀取字節(jié),但得到相同的結(jié)果。

conn.(*net.tcpconn).closewrite() 聽(tīng)起來(lái)正是我想要的,但這似乎根本沒(méi)有中斷客戶(hù)端。

conn.(*net.tcpconn).setreadbuffer(0) – 也嘗試過(guò)此操作,但 0 不是允許的值(恐慌)。

package main

import (
    "bufio"
    "fmt"
    "net"
    "strconv"
    "sync"
    "time"
)

const port = ":8888"

var wg sync.waitgroup

func main() {
    wg.add(1)
    go func() {
        // wait for the server to start
        time.sleep(1000 * time.millisecond)
        client()
    }()

    // server listens
    wg.add(1)
    server()

    wg.wait()
}

func server() {
    defer wg.done()

    listener, err := net.listen("tcp", port)
    if err != nil {
        panic(err)
    }

    received := make([]string, 0)
    conn, err := listener.accept()
    if err != nil {
        panic(err)
    }

    defer conn.close()

    scanner := bufio.newscanner(conn)

    for i := 0; scanner.scan(); i++ {
        received = append(received, scanner.text())

        // arbitrary condition: simulate a server shutdown - interrupt the client
        if len(received) == 2 {
            _ = conn.(*net.tcpconn).close()
        }
    }

    fmt.println("server received: ", received)
}

func client() {
    defer wg.done()

    conn, err := net.dial("tcp", port)
    if err != nil {
        panic(err)
    }

    sent := make([]string, 0)
    defer conn.close()

    for i := 0; i < 50000; i++ {
        v := strconv.itoa(i)
        _, err := conn.write([]byte(v + "\n"))
        if err != nil {
            fmt.println("client interrupted:", err)
            break
        } else {
            sent = append(sent, v)
            // slow down the sends to make output readable
            //time.sleep(1 * time.millisecond)
        }
    }
    fmt.println("client sent: ", sent)
}

登錄后復(fù)制

在我的機(jī)器上輸出是這樣的:

Server received:  [0 1 2]
Client interrupted: write tcp 127.0.0.1:49274->127.0.0.1:8888: write: broken pipe
Client sent:  [0 1 2 3 4 5 6 7 8 9 10 11 12 13]

登錄后復(fù)制

解決方法

TCP僅提供可靠的雙向字節(jié)流,沒(méi)有任何固有語(yǔ)義。如果服務(wù)器希望客戶(hù)端發(fā)出信號(hào)表明它不應(yīng)再發(fā)送任何數(shù)據(jù),則必須將此功能實(shí)現(xiàn)為應(yīng)用程序協(xié)議的一部分,即 TCP 提供的純數(shù)據(jù)傳輸之上的一層。

分享到:
標(biāo)簽:網(wǎng)絡(luò)編程
用戶(hù)無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定