Skip to content
This repository was archived by the owner on Oct 5, 2023. It is now read-only.

Message terminator parameter #21

Closed
wants to merge 9 commits into from
1 change: 1 addition & 0 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
11 changes: 9 additions & 2 deletions tcp_server.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,15 @@ 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
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)
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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) {})
Expand Down
42 changes: 42 additions & 0 deletions tcp_server_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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")
}
}