github.com/codingeasygo/util@v0.0.0-20231206062002-1ce2f004b7d9/tools/xecho/echo.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "net" 6 "net/http" 7 "os" 8 9 "golang.org/x/net/websocket" 10 ) 11 12 type ll struct { 13 net.Listener 14 } 15 16 func (l *ll) Accept() (conn net.Conn, err error) { 17 conn, err = l.Listener.Accept() 18 if err == nil { 19 fmt.Printf("ACCEPT:%v\n", conn.RemoteAddr()) 20 } 21 return 22 } 23 24 func main() { 25 http.Handle("/", websocket.Handler(func(ws *websocket.Conn) { 26 fmt.Printf("connection from %v is starting\n", ws.RemoteAddr()) 27 buffer := make([]byte, 32*1024) 28 for { 29 n, err := ws.Read(buffer) 30 if err != nil { 31 break 32 } 33 fmt.Printf("RECV:%v\n", (buffer[0:n])) 34 _, err = ws.Write(buffer[0:n]) 35 if err != nil { 36 break 37 } 38 // binary.BigEndian.PutUint32(buffer, 64) 39 // buffer[0] = 3 40 // _, err = ws.Write(buffer[:4]) 41 // if err != nil { 42 // break 43 // } 44 // for i := 0; i < 6; i++ { 45 // time.Sleep(100 * time.Millisecond) 46 // copy(buffer, []byte("0123456789")) 47 // _, err = ws.Write(buffer[:10]) 48 // if err != nil { 49 // break 50 // } 51 // } 52 } 53 fmt.Printf("connection from %v is done\n", ws.RemoteAddr()) 54 })) 55 ln, err := net.Listen("tcp", os.Args[1]) 56 if err != nil { 57 fmt.Println(err) 58 return 59 } 60 server := &http.Server{Addr: os.Args[1], Handler: http.DefaultServeMux} 61 fmt.Println(server.Serve(&ll{Listener: ln})) 62 }