package main import ( "log" "net" //"os" // "strconv" // "log" //"strings" "time" // "go-study/socket/config" ) func handleConn(conn net.Conn) { log.Println("begin handleConn,cliendAddr:", conn.RemoteAddr()) defer conn.Close() readChan := make(chan []byte) //writeChan := make(chan string) stopChan := make(chan bool) go readConn(conn, readChan, stopChan) // go writeConn(conn, writeChan, stopChan) var heartbeat []byte = []byte{0x01} for { select { case readStr := <-readChan: //log.Println("readStr:",readStr) //upper := strings.ToUpper(readStr) //writeChan <- upper // go yunhorn_ys_l_v1(readStr) go yunhorn_wireless(readStr) case stop := <-stopChan: if stop { log.Println("stop channel") break } case <-time.After(5000 * time.Millisecond): _, err := conn.Write(heartbeat) if err != nil { log.Println("write msg error!", err) stopChan <- true } else { log.Println("write msg success!", conn.RemoteAddr()) } } } } func readConn(conn net.Conn, readChan chan<- []byte, stopChan chan<- bool) { data_buf := make(chan []byte) Rdata := make([]byte, 0) data := make([]byte, 256) go func() { for { select { case kkdata := <-data_buf: //如果有数据,下面打印。但是有可能ch一直没数据 Rdata = append(Rdata, kkdata...) //log.Println("kkdata:",kkdata) case <-time.After(50 * time.Millisecond): //上面的ch如果一直没数据会阻塞,那么select也会检测其他case条件,检测到后3秒超时 // log.Println("超时") if len(Rdata) > 4 { readChan <- Rdata Rdata = make([]byte, 0) } //strData := string(Rdata) //Rdata = make([]byte,0) //log.Println("Received:", strData) //readChan <- Rdata //Rdata = make([]byte,0) } } }() for { // data := make([]byte, config.SERVER_RECV_LEN) //data2 := make([]byte,256) _, err := conn.Read(data) if err != nil { log.Println(err) break } // log.Println(DEVICEDATAS) log.Println("read.data:%d,%s", Bytes2Bits(data[3:4])[0],conn.RemoteAddr()) data_buf <- data } stopChan <- true } func writeConn(conn net.Conn, writeChan <-chan string, stopChan chan<- bool) { for { strData := <-writeChan _, err := conn.Write([]byte(strData)) if err != nil { log.Println(err) break } log.Println("Send:", strData) } stopChan <- true }