client.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. package server
  2. import (
  3. // "fmt"
  4. "net"
  5. "time"
  6. // "errors"
  7. // "io"
  8. "github.com/beoran/woe/monolog"
  9. "github.com/beoran/woe/telnet"
  10. )
  11. /* Specific properties of a client. */
  12. type ClientInfo struct {
  13. w int
  14. h int
  15. mtts int
  16. naws bool
  17. compress2 bool
  18. mssp bool
  19. zmp bool
  20. msp bool
  21. msdp bool
  22. mxp bool
  23. ttype bool
  24. terminals []string
  25. terminal string
  26. }
  27. type Client struct {
  28. server * Server
  29. id int
  30. conn net.Conn
  31. alive bool
  32. timeout int
  33. datachan chan []byte
  34. errchan chan error
  35. timechan chan time.Time
  36. telnet * telnet.Telnet
  37. info ClientInfo
  38. }
  39. func NewClient(server * Server, id int, conn net.Conn) * Client {
  40. datachan := make (chan []byte, 1024)
  41. errchan := make (chan error, 1)
  42. timechan := make (chan time.Time, 32)
  43. telnet := telnet.New()
  44. info := ClientInfo{-1, -1, 0, false, false, false, false, false, false, false, false, nil, "none"}
  45. return &Client{server, id, conn, true, -1, datachan, errchan, timechan, telnet, info}
  46. }
  47. func (me * Client) Close() {
  48. me.conn.Close()
  49. me.alive = false
  50. }
  51. /** Goroutine that does the actual reading of input data, and sends it to the
  52. * needed channels. */
  53. func (me * Client) ServeRead() {
  54. for (me.alive) {
  55. buffer := make([]byte, 1024, 1024)
  56. read , err := me.conn.Read(buffer);
  57. if err != nil {
  58. me.errchan <- err
  59. return
  60. }
  61. // reply will be stored in me.telnet.Events
  62. me.telnet.ProcessBytes(buffer[:read])
  63. }
  64. }
  65. /* Goroutine that sends any data that must be sent through the Telnet protocol
  66. * (that any data, really) other to the connected client.
  67. */
  68. func (me * Client) ServeWrite() {
  69. for (me.alive) {
  70. select {
  71. case data := <- me.telnet.ToClient:
  72. monolog.Debug("Will send to client: %v", data)
  73. me.conn.Write(data)
  74. }
  75. }
  76. }
  77. func (me * Client) TryReadEvent(millis int) (event telnet.Event, timeout bool, close bool) {
  78. select {
  79. case event := <- me.telnet.Events:
  80. return event, false, false
  81. case err := <- me.errchan:
  82. monolog.Info("Connection closed: %s\n", err)
  83. me.Close()
  84. return nil, false, true
  85. case _ = <- time.Tick(time.Millisecond * time.Duration(millis)):
  86. return nil, true, false
  87. }
  88. }
  89. func (me * Client) TryRead(millis int) (data []byte, timeout bool, close bool) {
  90. for (me.alive) {
  91. event, timeout, close := me.TryReadEvent(millis)
  92. if event == nil && (timeout || close) {
  93. return nil, timeout, close
  94. }
  95. switch event := event.(type) {
  96. case * telnet.DataEvent:
  97. monolog.Debug("Telnet data event %T : %d.", event, len(event.Data))
  98. return event.Data, false, false
  99. default:
  100. monolog.Info("Ignoring telnet event %T : %v for now.", event, event)
  101. }
  102. }
  103. return nil, false, true
  104. }
  105. func (me * Client) Serve() (err error) {
  106. // buffer := make([]byte, 1024, 1024)
  107. go me.ServeWrite()
  108. go me.ServeRead()
  109. me.SetupTelnet()
  110. for (me.alive) {
  111. data, _, _ := me.TryRead(3000)
  112. if data == nil {
  113. // me.telnet.TelnetPrintf("Too late!\r\n")
  114. } else {
  115. me.server.Broadcast(string(data))
  116. }
  117. }
  118. return nil
  119. }
  120. func (me * Client) IsAlive() bool {
  121. return me.alive
  122. }
  123. func (me * Client) WriteString(str string) {
  124. me.conn.Write([]byte(str))
  125. }