[英]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.