package main import ( "log" "net" //"os" // "strconv" // "log" //"strings" "time" // "go-study/socket/config" ) func handleConn(conn net.Conn) { 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) for { select { case readStr := <-readChan: //log.Println("readStr:",readStr) //upper := strings.ToUpper(readStr) //writeChan <- upper go yunhorn_ys_l_v1(readStr) case stop := <-stopChan: if stop { break } } } } 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) >3{ 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:",Bytes2Bits(data[3:4])) 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 }