tcpmachine/tcpclient/client.go

82 lines
1.5 KiB
Go
Raw Normal View History

2024-10-10 07:17:51 +02:00
package tcpclient
import (
"bufio"
"errors"
"fmt"
"io"
"net"
)
type ClientConfiguration struct {
ErrorResolver func(chan error)
}
func GetDefaultConfig() *ClientConfiguration {
return &ClientConfiguration{
2024-10-10 07:17:51 +02:00
ErrorResolver: func(c chan error) {
for err := range c {
fmt.Printf("DefConfig:Error: %v\n", err)
}
},
}
}
type ErrorResolverFunc func(errors chan error)
2024-10-10 07:17:51 +02:00
type Client struct {
2024-10-12 11:32:38 +02:00
addr string
2024-10-10 07:17:51 +02:00
exit chan bool
Server net.Conn
IsConnected bool
//
Messages chan []byte
ErrorsChannel chan error
ErrorResolver ErrorResolverFunc
2024-10-10 07:17:51 +02:00
}
2024-10-12 11:32:38 +02:00
func CreateClient(addr string, options ...ClientOption) *Client {
conf := GetDefaultConfig()
for _, opt := range options {
opt(conf)
}
2024-10-10 07:17:51 +02:00
return &Client{
2024-10-12 11:32:38 +02:00
addr: addr,
2024-10-10 07:17:51 +02:00
Messages: make(chan []byte, 16),
ErrorResolver: conf.ErrorResolver,
ErrorsChannel: make(chan error, 8),
exit: make(chan bool, 1),
}
}
2024-10-12 11:32:38 +02:00
func (c *Client) StartClient() error {
server, err := net.Dial("tcp", c.addr)
2024-10-10 07:17:51 +02:00
if err != nil {
return fmt.Errorf("net.Dial: %w", err)
}
serverReader := bufio.NewReader(server)
c.IsConnected = true
c.Server = server
loop:
for {
select {
case <-c.exit:
break loop
default:
msg, err := serverReader.ReadString('\n')
if err != nil {
if errors.Is(err, io.EOF) {
c.exit <- true
break
}
c.ErrorsChannel <- fmt.Errorf("serverReader.ReadString: %w", err)
}
fmt.Printf("Server send us a message: %s", msg)
c.Messages <- []byte(msg)
}
}
return nil
}