diff --git a/readme.md b/readme.md index 6fb64f7..3576a74 100644 --- a/readme.md +++ b/readme.md @@ -20,6 +20,7 @@ import "github.com/firstrow/tcp_server" func main() { server := tcp_server.New("localhost:9999") + server.MessageTerminator('\n') // Optional end of message byte, default to newline. server.OnNewClient(func(c *tcp_server.Client) { // new client connected diff --git a/tcp_server.go b/tcp_server.go index 791c145..4ff1ab9 100644 --- a/tcp_server.go +++ b/tcp_server.go @@ -20,6 +20,7 @@ type server struct { onNewClientCallback func(c *Client) onClientConnectionClosed func(c *Client, err error) onNewMessage func(c *Client, message string) + messageTerminator byte } // Read client data from channel @@ -27,7 +28,7 @@ func (c *Client) listen() { c.Server.onNewClientCallback(c) reader := bufio.NewReader(c.conn) for { - message, err := reader.ReadString('\n') + message, err := reader.ReadString(c.Server.messageTerminator) if err != nil { c.conn.Close() c.Server.onClientConnectionClosed(c, err) @@ -75,6 +76,11 @@ func (s *server) OnNewMessage(callback func(c *Client, message string)) { s.onNewMessage = callback } +// Set message terminator +func (s *server) MessageTerminator(terminator byte) { + s.messageTerminator = terminator +} + // Listen starts network server func (s *server) Listen() { var listener net.Listener @@ -103,7 +109,8 @@ func (s *server) Listen() { func New(address string) *server { log.Println("Creating server with address", address) server := &server{ - address: address, + address: address, + messageTerminator: '\n', } server.OnNewClient(func(c *Client) {}) diff --git a/tcp_server_test.go b/tcp_server_test.go index 06adeb3..bd9fcba 100644 --- a/tcp_server_test.go +++ b/tcp_server_test.go @@ -47,3 +47,45 @@ func Test_accepting_new_client_callback(t *testing.T) { t.Error("received wrong message") } } + +func Test_accepting_new_client_callback_different_terminator(t *testing.T) { + server := New("localhost:9998") + + var wg sync.WaitGroup + wg.Add(3) + + var messageText string + + server.OnNewClient(func(c *Client) { + wg.Done() + }) + server.OnNewMessage(func(c *Client, message string) { + wg.Done() + messageText = message + }) + server.OnClientConnectionClosed(func(c *Client, err error) { + wg.Done() + }) + server.MessageTerminator('\u0000') + go server.Listen() + + // Wait for server + // If test fails - increase this value + time.Sleep(10 * time.Millisecond) + + conn, err := net.Dial("tcp", "localhost:9998") + if err != nil { + t.Fatal("Failed to connect to test server") + } + _, err = conn.Write([]byte("Test message\u0000")) + if err != nil { + t.Fatal("Failed to send test message.") + } + conn.Close() + + wg.Wait() + + if messageText != "Test message\u0000" { + t.Error("received wrong message") + } +}