12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- package server
- import (
- // "fmt"
- "net"
- "time"
- // "errors"
- // "io"
- "github.com/beoran/woe/monolog"
- )
- type Client struct {
- server * Server
- id int
- conn net.Conn
- telnet interface{}
- alive bool
- timeout int
- datachan chan []byte
- errchan chan error
- timechan chan time.Time
- }
- func NewClient(server * Server, id int, conn net.Conn) * Client {
- datachan := make (chan []byte, 1024)
- errchan := make (chan error, 1)
- timechan := make (chan time.Time, 32)
- return &Client{server, id, conn, nil, true, -1, datachan, errchan, timechan}
- }
- func (me * Client) Close() {
- me.conn.Close()
- me.alive = false
- }
- /** Goroutine that does the actual reading of input data, and sends it to the
- * needed channels. */
- func (me * Client) ServeRead() {
- for (me.alive) {
- buffer := make([]byte, 1024, 1024)
- _ , err := me.conn.Read(buffer);
- if err != nil {
- me.errchan <- err
- return
- }
- me.datachan <- buffer
- }
- }
- func (me * Client) TryRead(millis int) (data [] byte, timeout bool, close bool) {
- select {
- case data := <- me.datachan:
- return data, false, false
-
- case err := <- me.errchan:
- monolog.Info("Connection closed: %s\n", err)
- me.Close()
- return nil, false, true
-
- case _ = <- time.Tick(time.Millisecond * time.Duration(millis)):
- return nil, true, false
- }
- }
- func (me * Client) Serve() (err error) {
- // buffer := make([]byte, 1024, 1024)
- go me.ServeRead()
- for (me.alive) {
- data, _, _ := me.TryRead(3000)
-
- if data == nil {
- me.conn.Write([]byte("Too late!\r\n"))
- } else {
- me.server.Broadcast(string(data))
- }
-
- }
- return nil
- }
- func (me * Client) IsAlive() bool {
- return me.alive
- }
- func (me * Client) WriteString(str string) {
- me.conn.Write([]byte(str))
- }
|