client.go 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. package server
  2. import (
  3. // "fmt"
  4. "net"
  5. "time"
  6. // "errors"
  7. // "io"
  8. "github.com/beoran/woe/monolog"
  9. )
  10. type Client struct {
  11. server * Server
  12. id int
  13. conn net.Conn
  14. telnet interface{}
  15. alive bool
  16. timeout int
  17. datachan chan []byte
  18. errchan chan error
  19. timechan chan time.Time
  20. }
  21. func NewClient(server * Server, id int, conn net.Conn) * Client {
  22. datachan := make (chan []byte, 1024)
  23. errchan := make (chan error, 1)
  24. timechan := make (chan time.Time, 32)
  25. return &Client{server, id, conn, nil, true, -1, datachan, errchan, timechan}
  26. }
  27. func (me * Client) Close() {
  28. me.conn.Close()
  29. me.alive = false
  30. }
  31. /** Goroutine that does the actual reading of input data, and sends it to the
  32. * needed channels. */
  33. func (me * Client) ServeRead() {
  34. for (me.alive) {
  35. buffer := make([]byte, 1024, 1024)
  36. _ , err := me.conn.Read(buffer);
  37. if err != nil {
  38. me.errchan <- err
  39. return
  40. }
  41. me.datachan <- buffer
  42. }
  43. }
  44. func (me * Client) TryRead(millis int) (data [] byte, timeout bool, close bool) {
  45. select {
  46. case data := <- me.datachan:
  47. return data, false, false
  48. case err := <- me.errchan:
  49. monolog.Info("Connection closed: %s\n", err)
  50. me.Close()
  51. return nil, false, true
  52. case _ = <- time.Tick(time.Millisecond * time.Duration(millis)):
  53. return nil, true, false
  54. }
  55. }
  56. func (me * Client) Serve() (err error) {
  57. // buffer := make([]byte, 1024, 1024)
  58. go me.ServeRead()
  59. for (me.alive) {
  60. data, _, _ := me.TryRead(3000)
  61. if data == nil {
  62. me.conn.Write([]byte("Too late!\r\n"))
  63. } else {
  64. me.server.Broadcast(string(data))
  65. }
  66. }
  67. return nil
  68. }
  69. func (me * Client) IsAlive() bool {
  70. return me.alive
  71. }
  72. func (me * Client) WriteString(str string) {
  73. me.conn.Write([]byte(str))
  74. }