第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何從 TCP 套接字服務器讀取所有數(shù)據(jù)并隨后執(zhí)行操作

如何從 TCP 套接字服務器讀取所有數(shù)據(jù)并隨后執(zhí)行操作

Go
手掌心 2022-05-23 17:14:30
在花了很多時間之后。我找不到讀取來自 TCP 套接字服務器的所有數(shù)據(jù)然后進行操作的方法,因為我找不到中斷循環(huán)的方法。套接字服務器發(fā)送包含許多以“\n”結(jié)尾的行的文本??蛻舳藨撃軌蜃x取所有這些行并使用所有數(shù)據(jù)發(fā)出 POST 請求,但循環(huán)總是掛起并且沒有辦法打破它。然后,它將繼續(xù)等待更多數(shù)據(jù),因此停止條件可能是三秒超時。我嘗試了不同的解決方案(Scanner、ReadString、ReadLine、ReadAll),但它總是掛起并且循環(huán)永遠不會完成。代碼中的最后一行從不打印。 conn, err := net.Dial("tcp", "127.0.0.1:15000") reader := bufio.NewReader(conn) message := "" for {     line, err := reader.ReadString('\n')     if err == io.EOF {         break     }     message += line } log.Println(message)
查看完整描述

2 回答

?
肥皂起泡泡

TA貢獻1829條經(jīng)驗 獲得超6個贊

如果您唯一的選擇是讀取行直到超時,您可以在第一次讀取完成后在連接上設置讀取截止日期。然后,您可以攔截超時錯誤,并將其轉(zhuǎn)換為 EOF,以便緩沖閱讀器正確解釋您的意圖。


type timeoutReader struct {

    net.Conn

    once sync.Once

}


func (r *timeoutReader) Read(b []byte) (int, error) {

    n, err := r.Conn.Read(b)


    // Set a read deadline only after the first Read completes

    r.once.Do(func() {

        r.Conn.SetReadDeadline(time.Now().Add(3 * time.Second))

    })


    // If we got a timeout, treat it as an io.EOF so the bufio.Scanner handles

    // the error as if it was the normal end of the stream.

    var netErr net.Error

    if errors.As(err, &netErr) && netErr.Timeout() {

        return n, io.EOF

    }

    return n, err

}


func main() {

    conn, err := net.Dial("tcp", "127.0.0.1:15000")

    if err != nil {

        log.Fatal(err)

    }

    scanner := bufio.NewScanner(&timeoutReader{Conn: conn})

    message := ""

    for scanner.Scan() {

        message += scanner.Text()

    }

    if err := scanner.Err(); err != nil {

        log.Fatal(err)

    }

    log.Println(message)

}


查看完整回答
反對 回復 2022-05-23
?
繁星點點滴滴

TA貢獻1803條經(jīng)驗 獲得超3個贊

如果條件是收到第一行后3秒超時,解決辦法是收到第一行后3秒關(guān)閉socket。


var firstLineReceived bool

conn, err := net.Dial("tcp", "127.0.0.1:15000")

reader := bufio.NewReader(conn)

message := ""

for {

    line, err := reader.ReadString('\n')

    if err == io.EOF {

        break

    }

    message += line

    if !firstLineReceived {

        firstLineReceived = true

        go func(){

            time.Sleep(3*time.Second)

            conn.Close()

        }()

    }

}

log.Println(message)


查看完整回答
反對 回復 2022-05-23
  • 2 回答
  • 0 關(guān)注
  • 180 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號