簡體   English   中英

客戶端中 net.conn 讀取嘗試的程序空白。 不顯示和錯誤它只是變成空白並停止工作

[英]program blanks at net.conn read attempt in client. Does not show and error it just goes blank and stops working

這是我的客戶端 ''' func ClientStart() { var dissconnect bool //用於檢測斷開連接 var previousData []byte var packet [][]byte

    conn, err := net.Dial("tcp", "0.0.0.0:9999")
    if err != nil {
        log.Fatalln(err)
    }
    defer conn.Close()

    //Create the hello message
    //--------
    
    //-----
    //----->>>>> tracker
    tracker = Newtrack(15 * time.Second) //set timer for 15 seconds
    //----->>>>> tracker end
    //The loop
    for {
        buffer := make([]byte, 1<<16) //create 1 mb buffer //make sure to zero out when finished

        _,err := conn.Read(buffer) //read into the buffer
        //This is for more gracefully hnadling the stuff
        if err != nil {
            if err !=  io.EOF {
                fmt.Println(err)
            }
            break
        }

        packets,previousData, err = Messages.ExtractPackets(append(previousData,buffer...))//extract the packets


        //This is where everything gets processed
        for _, value := range packets {
            irc, err := Messages.CreateIrc(value)//get irc
            if err != nil {fmt.Println(err)}

            parse, opcode, err := Messages.Parse(*irc)
            if err != nil {fmt.Println(err)}

            err = handleMessages(*parse,opcode)
            if err != nil {fmt.Println(err)}
        }


        //-+-+-+++++++++++++++++++++++ dissconnect if timer expires
        go func(dis *bool)  {
            for {
                <-tracker.timer.C
                fmt.Println("Keepalive not sent from function")
                break
            }
            *dis = true
        }(&dissconnect)
        if dissconnect {
            fmt.Println("client has not sent keepalive dissconnecting")
            os.Exit(3)
        }
        //++++++++++++++++++++++++++++ timer

        sendKeepAlive(conn)
    }
}

'''

這是我的服務器'''

func ServerStart() {
    listener, err := net.Listen("tcp", "0.0.0.0:9999")
    if err != nil {
        log.Fatalln(err)
    }
    defer listener.Close()

    for {
        con, err := listener.Accept()
        if err != nil {
            log.Println(err)
            continue
        }

        // If you want, you can increment a counter here and inject to handleClientRequest below as client identifier
        go handleClientRequest(con)
    }
}

func handleClientRequest(conn net.Conn) {
    defer conn.Close()
    var dissconnect bool //used to dissconnect if keep alive fails
    var previousData []byte //holds previous data from for loop
    var packets [][]byte //holds packets in a list
    var label string
    tracker = Newtrack(15 * time.Second) //create a new tracker and set the timer for 15 seconds


    for {
        buffer := make([]byte, 1<<16) // small buffer


        _,err := conn.Read(buffer) //read into the buffer
        //This is for more gracefully hnadling the stuff
        if err != nil {
            if err !=  io.EOF {
                fmt.Println(err)
            }
            break
        }
        //extract the packets and any extra
        packets,previousData, err = Messages.ExtractPackets(append(previousData,buffer...))//extract the packets

        //print the error
        if err != nil {
            fmt.Println(err)
        }



        //turn the packets into IRC packets
        IRCpackets := make([]Messages.IrcPacket, len(packets)) //create a list of IRC packets len of raw packets
        for index,value := range packets {
            IRC, err := Messages.CreateIrc(value)

            if IRC != nil { //if IRC = nil then err likely does not = nil
                IRCpackets[index] = *IRC //create IRCpackets's for every raw packet
            }
            if err != nil {
                fmt.Println(err)
            }
        }




        

        //This is where everything gets processed
        for _, value := range packets {
            irc, err := Messages.CreateIrc(value)//get irc
            if err != nil {fmt.Println(err)}

            parse, opcode, err := Messages.Parse(*irc)
            if err != nil {fmt.Println(err)}

            err = handleMessages(*parse,opcode)
            if err != nil {fmt.Println(err)}
        }






    }

}

'''

如標題中所述,它只是坐在那里並且不會繼續。 你可以使用相同的連接來讀取和寫入嗎? 我在服務器端的讀取工作正常並且沒有問題但是我還沒有嘗試在服務器端寫入所以我不確定這是否是問題

編輯:通過停止工作,我的意思是它在調試器中沒有做任何事情,它只是坐在那里並拒絕繼續前進,我以前從未見過這樣的事情。

客戶端和服務器是分開運行的,並且不是由命令行參數激活的同一進程的一部分。 所以我不能同時使用調試器。

你可以使用相同的連接來讀取和寫入嗎?

是的。 TCP 連接支持兩個異步數據流。

對我來說,要閱讀的代碼太多(嘗試將其簡化為演示問題的最小可編譯示例),但我認為問題如下。 如果您不conn.Write()在一側,另一側將等待conn.Read() ,反之亦然。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM