FlexDXCluster/TCPServer.go

130 lines
2.6 KiB
Go
Raw Normal View History

2024-09-23 16:24:50 +07:00
package main
import (
"bufio"
"fmt"
"net"
"os"
"strings"
"sync"
log "github.com/sirupsen/logrus"
)
var (
err error
)
type TCPServer struct {
Address string
Port string
Clients map[net.Conn]bool
Mutex sync.Mutex
LogWriter *bufio.Writer
Reader *bufio.Reader
Writer *bufio.Writer
Conn net.Conn
Listener net.Listener
MsgChan chan string
CmdChan chan string
Log *log.Logger
}
func NewTCPServer(address string, port string, log *log.Logger) *TCPServer {
return &TCPServer{
Address: address,
Port: port,
Clients: make(map[net.Conn]bool),
MsgChan: make(chan string),
CmdChan: make(chan string),
Log: log,
}
}
func (s *TCPServer) StartServer() {
s.LogWriter = bufio.NewWriter(os.Stdout)
s.Listener, err = net.Listen("tcp", Cfg.Telnet.Host+":"+Cfg.Telnet.Port)
if err != nil {
s.Log.Info("could not create telnet server")
}
defer s.Listener.Close()
2024-09-24 11:57:48 +07:00
s.Log.Infof("telnet server listening on %s:%s", Cfg.Telnet.Host, Cfg.Telnet.Port)
2024-09-23 16:24:50 +07:00
go func() {
for message := range s.MsgChan {
s.broadcastMessage(message)
}
}()
for {
s.Conn, err = s.Listener.Accept()
s.Log.Info("client connected", s.Conn.RemoteAddr().String())
if err != nil {
s.Log.Error("could not accept connections to telnet server")
continue
}
s.Mutex.Lock()
s.Clients[s.Conn] = true
s.Mutex.Unlock()
go s.handleConnection()
}
}
func (s *TCPServer) handleConnection() {
s.Conn.Write([]byte("Welcome to the FlexDXCluster telnet server! Type 'bye' to exit.\n"))
2024-09-24 11:57:48 +07:00
s.Reader = bufio.NewReader(s.Conn)
s.Writer = bufio.NewWriter(s.Conn)
2024-09-23 16:24:50 +07:00
for {
2024-09-24 11:57:48 +07:00
message, err := s.Reader.ReadString('\n')
2024-09-23 16:24:50 +07:00
if err != nil {
s.Mutex.Lock()
delete(s.Clients, s.Conn)
s.Mutex.Unlock()
2024-09-24 11:57:48 +07:00
s.Log.Infof("client %s disconnected", s.Conn.RemoteAddr().String())
2024-09-23 16:24:50 +07:00
return
}
message = strings.TrimSpace(message)
2024-09-24 11:57:48 +07:00
s.Log.Infof("Message reçu du client: %s\n", message)
switch message {
case "bye":
2024-09-23 16:24:50 +07:00
s.Mutex.Lock()
delete(s.Clients, s.Conn)
s.Mutex.Unlock()
2024-09-24 11:57:48 +07:00
s.Log.Infof("client %s disconnected", s.Conn.RemoteAddr().String())
return
case "SH/DX 30":
2024-09-23 16:24:50 +07:00
return
2024-09-24 11:57:48 +07:00
default:
s.Write("cannot identify command\n")
2024-09-23 16:24:50 +07:00
}
}
}
func (s *TCPServer) Write(message string) (n int, err error) {
2024-09-24 11:57:48 +07:00
_, err = s.Writer.Write([]byte(message))
2024-09-23 16:24:50 +07:00
if err == nil {
err = s.Writer.Flush()
}
return
}
func (s *TCPServer) broadcastMessage(message string) {
s.Mutex.Lock()
defer s.Mutex.Unlock()
for client := range s.Clients {
_, err := client.Write([]byte(message))
if err != nil {
fmt.Println("Erreur lors de l'envoi du message au client:", client.RemoteAddr())
}
}
}