// ConnectPlayer handles connecting a new player to the game func (s *Server) ConnectPlayer(socket *glue.Socket) { // Logging log15.Debug("socket connected", "address", socket.RemoteAddr()) socket.OnClose(func() { log15.Debug("socket closed", "address", socket.RemoteAddr()) }) // Attempt to allocate free player Slot if slot := s.nextSlot(); slot != -1 { log15.Info("Accepting new player connection", "slot", slot) s.ConnectedPlayers[slot] = &Player{ Server: s, Slot: slot, Socket: socket, } s.ConnectedPlayers[slot].Socket.OnClose(func() { log15.Debug("socket closed", "address", socket.RemoteAddr()) s.DisconnectPlayer(slot) }) s.NumConnectedPlayers++ s.ConnectedPlayers[slot].Socket.Write(msg.SConnected) s.ConnectedPlayers[slot].Socket.Write(msg.SDisplayMessage + ":Press [SPACEBAR] To Spawn!") go s.ConnectedPlayers[slot].ReadLoop() } else { // No free slots available log15.Info("Rejecting new player connection: Server is full!") socket.Write(msg.SGameFull) } }
func onNewSocket(s *glue.Socket) { // Set a function which is triggered as soon as the socket is closed. s.OnClose(func() { log.Printf("socket closed with remote address: %s", s.RemoteAddr()) }) // Run the read loop in a new goroutine. go readLoop(s) // Send a welcome string to the client. s.Write("Hello Client") }
func onNewSocket(s *glue.Socket) { s.OnRead(func(data string) { // Echo back. s.Write(data) }) s.OnClose(func() { println("closed") }) s.Write("Hello Client") }
func onNewSocket(s *glue.Socket) { // Set a function which is triggered as soon as the socket is closed. s.OnClose(func() { log.Printf("socket closed with remote address: %s", s.RemoteAddr()) }) // Discard all reads. // If received data is not discarded, then the read buffer will block as soon // as it is full, which will also block the keep-alive mechanism of the socket. // The result would be a closed socket... s.DiscardRead() // Send a welcome string to the client. s.Write("Hello Client") }
func onNewSocket(s *glue.Socket) { // Set a function which is triggered as soon as the socket is closed. s.OnClose(func() { log.Printf("socket closed with remote address: %s", s.RemoteAddr()) }) // Set a function which is triggered during each received message. s.OnRead(func(data string) { // Echo the received data back to the client. s.Write(data) }) // Send a welcome string to the client. s.Write("Hello Client") }
func readLoop(s *glue.Socket) { for { // Wait for available data. // Optional: pass a timeout duration to read. data, err := s.Read() if err != nil { // Just return and release this goroutine if the socket was closed. if err == glue.ErrSocketClosed { return } log.Printf("read error: %v", err) continue } // Echo the received data back to the client. s.Write(data) } }
func (h *Hub) sendError(sock *glue.Socket, msg string) { sock.Write("error " + strconv.Quote(msg)) }