Skip to content

Commit

Permalink
client connection handling
Browse files Browse the repository at this point in the history
  • Loading branch information
MarckTomack committed Aug 19, 2020
1 parent 133b82f commit bfc4661
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 48 deletions.
67 changes: 30 additions & 37 deletions app/senders/tcp-sender.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,23 @@ import (
"encoding/json"
"fmt"
"net"
"time"
"util"
)

type TcpSender struct {
logger *util.Logger
conn net.Conn
logger *util.Logger
tcpConn util.TcpConn
}

func NewTcpSender(address string) (*TcpSender, error) {
var err error

tcpSender := new(TcpSender)
tcpSender.conn, err = net.Dial("tcp", address)
tcpSender.tcpConn.Conn, err = net.Dial("tcp", address)
if err != nil {
return nil, err
}
err = tcpSender.conn.(*net.TCPConn).SetKeepAlive(true)
err = tcpSender.tcpConn.Conn.(*net.TCPConn).SetKeepAlive(true)
if err != nil {
return nil, err
}
Expand All @@ -34,22 +33,20 @@ func NewTcpSender(address string) (*TcpSender, error) {

func (t *TcpSender) Mute() {
msg := &util.ServerMessage{Command: util.MUTE_COMMAND}
jsonMsg, err := json.Marshal(msg)
jsonMsg, _ := json.Marshal(msg)
_, err := t.tcpConn.Write(jsonMsg)
if err != nil {
t.logger.Write(fmt.Sprintf("failed to send mute message %v", err))
return
}
t.conn.Write(jsonMsg)
}

func (t *TcpSender) Pause() {
msg := &util.ServerMessage{Command: util.PAUSE_COMMAND}
jsonMsg, err := json.Marshal(msg)
jsonMsg, _ := json.Marshal(msg)
_, err := t.tcpConn.Write(jsonMsg)
if err != nil {
t.logger.Write(fmt.Sprintf("failed to send pause message %v", err))
return
}
t.conn.Write(jsonMsg)
}

func (t *TcpSender) VolumeUp() {
Expand All @@ -59,81 +56,77 @@ func (t *TcpSender) VolumeUp() {
t.logger.Write(fmt.Sprintf("failed to send volume up message %v", err))
return
}
t.conn.Write(jsonMsg)
t.tcpConn.Write(jsonMsg)
}

func (t *TcpSender) VolumeDown() {
msg := &util.ServerMessage{Command: util.VOLUME_DOWN_COMMAND}
jsonMsg, err := json.Marshal(msg)
jsonMsg, _ := json.Marshal(msg)
_, err := t.tcpConn.Write(jsonMsg)
if err != nil {
t.logger.Write(fmt.Sprintf("failed to send volume down message %v", err))
return
}
t.conn.Write(jsonMsg)
}

func (t *TcpSender) Play(track string) {
msg := &util.ServerMessage{Command: util.PLAY_COMMAND, Track: track}
jsonMsg, err := json.Marshal(msg)
jsonMsg, _ := json.Marshal(msg)
_, err := t.tcpConn.Write(jsonMsg)
if err != nil {
t.logger.Write(fmt.Sprintf("failed to send play track message %v", err))
return
}
t.conn.Write(jsonMsg)
}

func (t *TcpSender) TrackInfo() *util.StatusResponse {
msg := &util.ServerMessage{Command: "status"}
jsonMsg, err := json.Marshal(msg)
jsonMsg, _ := json.Marshal(msg)
_, err := t.tcpConn.Write(jsonMsg)
if err != nil {
t.logger.Write(fmt.Sprintf("failed to send status message %v", err))
return nil
}
t.conn.Write(jsonMsg)

decoder := json.NewDecoder(t.conn)
decoder := json.NewDecoder(t.tcpConn.Conn)

var res util.StatusResponse

decoder.Decode(&res)
err = decoder.Decode(&res)
if err != nil {
t.logger.Write(fmt.Sprintf("failed to decode status message %v", err))
return nil
}
return &res
}

func (t *TcpSender) ShutDown() {
msg := &util.ServerMessage{Command: util.SHUTDOWN_COMMAND}
jsonMsg, err := json.Marshal(msg)
jsonMsg, _ := json.Marshal(msg)

_, err := t.tcpConn.Write(jsonMsg)
if err != nil {
t.logger.Write(fmt.Sprintf("failed to send shutdown message %v", err))
return
}
t.conn.Write(jsonMsg)
t.conn.Close()
t.tcpConn.Close()
}

func (t *TcpSender) Initialize(source string) {
msg := &util.ServerMessage{Command: util.INIT_COMMAND, Source: source, OutputDevice: ""}
jsonMsg, err := json.Marshal(msg)
jsonMsg, _ := json.Marshal(msg)
_, err := t.tcpConn.Write(jsonMsg)
if err != nil {
t.logger.Write(fmt.Sprintf("failed to send init message %v", err))
return
}
t.conn.Write(jsonMsg)
}

func (t *TcpSender) IsAlive() bool {
t.conn.SetDeadline(time.Now().Add(time.Second * 5))
defer func() {
var zero time.Time
t.conn.SetDeadline(zero)
}()
msg := &util.ServerMessage{Command: "alive-check"}
jsonMsg, err := json.Marshal(msg)
jsonMsg, _ := json.Marshal(msg)
_, err := t.tcpConn.Write(jsonMsg)
if err != nil {
return false
}
t.conn.Write(jsonMsg)
buf := make([]byte, 5)
_, err = t.conn.Read(buf)
_, err = t.tcpConn.Read(buf)
if err != nil {
return false
}
Expand Down
2 changes: 2 additions & 0 deletions daemon/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,8 @@ func main() {
player.Close()
case err := <-player.FatalError():
panic(err)
case err := <-listener.FatalError():
panic(err)
}
}
}
Expand Down
39 changes: 28 additions & 11 deletions daemon/server/tcp.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package server
import (
"aloneMPd/media"
"encoding/json"
"io"
"net"
"util"
)
Expand All @@ -14,10 +15,11 @@ type TcpServer struct {
volumeDown chan bool
shutDown chan bool
selectedTrack chan string
err chan error
playerArgs chan util.PlayerArgs
playerInfo *media.PlayerInformer
listener net.Listener
conn net.Conn
tcpConn util.TcpConn
}

func NewTcpServer() *TcpServer {
Expand All @@ -36,19 +38,30 @@ func (t *TcpServer) SetPlayerInfo(info *media.PlayerInformer) {
t.playerInfo = info
}

func (t *TcpServer) Listen(address string) error {
func (t *TcpServer) Listen(address string) {
err := t.startListen(address)
if err != nil {
return err
t.err <- err
}
defer t.conn.Close()
defer t.tcpConn.Close()

for {
decoder := json.NewDecoder(t.conn)
decoder := json.NewDecoder(t.tcpConn.Conn)

var msg util.ServerMessage

decoder.Decode(&msg)
err := decoder.Decode(&msg)
if err != nil {
if err == io.EOF { // connection is closed. The method to check if the connection from the client is closed should be better
t.shutDown <- true
err := t.startListen(address)
if err != nil {
t.err <- err
}
} else {
t.err <- err
}
}

switch msg.Command {
case util.PLAY_COMMAND:
Expand All @@ -69,7 +82,7 @@ func (t *TcpServer) Listen(address string) error {
t.shutDown <- true
err := t.startListen(address)
if err != nil {
return err
t.err <- err
}
case "status":
status := new(util.StatusResponse)
Expand All @@ -84,10 +97,10 @@ func (t *TcpServer) Listen(address string) error {
status.InError = t.playerInfo.InError()
}
response, _ := json.Marshal(status)
t.conn.Write(response)
t.tcpConn.Write(response)

case "alive-check":
t.conn.Write([]byte("4l0n3"))
t.tcpConn.Write([]byte("4l0n3"))
}
}
}
Expand All @@ -97,7 +110,7 @@ func (t *TcpServer) startListen(address string) error {
if err != nil {
return err
}
t.conn, err = t.listener.Accept()
t.tcpConn.Conn, err = t.listener.Accept()
if err != nil {
return err
}
Expand Down Expand Up @@ -129,10 +142,14 @@ func (t *TcpServer) Play() chan string {
return t.selectedTrack
}

func (t *TcpServer) FatalError() chan error {
return t.err
}

func (t *TcpServer) Initialize() chan util.PlayerArgs {
return t.playerArgs
}
func (t *TcpServer) Close() {
t.listener.Close()
t.conn.Close()
t.tcpConn.Close()
}

0 comments on commit bfc4661

Please sign in to comment.