測試須要,之前用 C + libevent 寫了一個 TCP Echo Server,返回服務器時間、客戶端地址信息和客戶端發送的原內容。爲了水一篇,如今改成 golang 實現。 golang
package main import ( "fmt" "io" "net" "os" "time" ) const BUFFER_SIZE = 1024 * 4 var buffer = make([]byte, BUFFER_SIZE) func handleConnect(tcpConn *net.TCPConn) { if tcpConn == nil { return } for { n, err := tcpConn.Read(buffer) if err == io.EOF { fmt.Printf("The RemoteAddr: %s is closed!\n", tcpConn.RemoteAddr().String()) return } handleError(err) if n > 0 { //fmt.Printf("Read: %s", string(buffer[:n])) str := tcpConn.RemoteAddr().String() + " @ " + time.Now().Format("2006-01-02 15:04:05 Z07:00") + "\r\n" + string(buffer[:n]) tcpConn.Write([]byte(str)) fmt.Printf("Echo: %s", str) } } } // 錯誤處理 func handleError(err error) { if err == nil { return } panic(err) //fmt.Printf("error: %s\n", err.Error()) } func main() { if len(os.Args) < 2 { fmt.Println("Usage:", os.Args[0], "<port>") return } port := os.Args[1] tcpAddr, err := net.ResolveTCPAddr("tcp4", "0.0.0.0:"+port) handleError(err) tcpListener, err := net.ListenTCP("tcp4", tcpAddr) handleError(err) defer tcpListener.Close() fmt.Println("Listening on", tcpAddr, "...") for { tcpConn, err := tcpListener.AcceptTCP() fmt.Printf("The client: %s has connected!\n", tcpConn.RemoteAddr().String()) handleError(err) defer tcpConn.Close() go handleConnect(tcpConn) } }