[UMU 学 golang](3) TCP Echo Server

前端之家收集整理的这篇文章主要介绍了[UMU 学 golang](3) TCP Echo Server前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

  测试需要,以前用 C + libevent 写了一个 TCP Echo Server,返回服务器时间、客户端地址信息和客户端发送的原内容。为了水一篇,现在改为 golang 实现。

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "io"
  6. "net"
  7. "os"
  8. "time"
  9. )
  10.  
  11. const BUFFER_SIZE = 1024 * 4
  12.  
  13. var buffer = make([]byte,BUFFER_SIZE)
  14.  
  15. func handleConnect(tcpConn *net.TCPConn) {
  16. if tcpConn == nil {
  17. return
  18. }
  19. for {
  20. n,err := tcpConn.Read(buffer)
  21. if err == io.EOF {
  22. fmt.Printf("The RemoteAddr: %s is closed!\n",tcpConn.RemoteAddr().String())
  23. return
  24. }
  25. handleError(err)
  26. if n > 0 {
  27. //fmt.Printf("Read: %s",string(buffer[:n]))
  28. str := tcpConn.RemoteAddr().String() + " @ " +
  29. time.Now().Format("2006-01-02 15:04:05 Z07:00") + "\r\n" +
  30. string(buffer[:n])
  31. tcpConn.Write([]byte(str))
  32. fmt.Printf("Echo: %s",str)
  33. }
  34. }
  35. }
  36.  
  37. // 错误处理
  38. func handleError(err error) {
  39. if err == nil {
  40. return
  41. }
  42. panic(err)
  43. //fmt.Printf("error: %s\n",err.Error())
  44. }
  45.  
  46. func main() {
  47. if len(os.Args) < 2 {
  48. fmt.Println("Usage:",os.Args[0],"<port>")
  49. return
  50. }
  51. port := os.Args[1]
  52. tcpAddr,err := net.ResolveTCPAddr("tcp4","0.0.0.0:"+port)
  53. handleError(err)
  54. tcpListener,err := net.ListenTCP("tcp4",tcpAddr)
  55. handleError(err)
  56. defer tcpListener.Close()
  57.  
  58. fmt.Println("Listening on",tcpAddr,"...")
  59. for {
  60. tcpConn,err := tcpListener.AcceptTCP()
  61. fmt.Printf("The client: %s has connected!\n",tcpConn.RemoteAddr().String())
  62. handleError(err)
  63. defer tcpConn.Close()
  64. go handleConnect(tcpConn)
  65. }
  66. }

猜你在找的Go相关文章