lf/server.go

119 lines
2.0 KiB
Go
Raw Normal View History

2016-08-13 12:49:04 +00:00
package main
import (
"bufio"
"fmt"
"log"
"net"
"os"
"strconv"
2016-08-13 12:49:04 +00:00
)
var (
gCopyFile bool
2016-08-13 12:49:04 +00:00
gFileList []string
gConnList map[int]net.Conn
2016-08-13 12:49:04 +00:00
)
func serve() {
logFile, err := os.Create(gServerLogPath)
if err != nil {
panic(err)
}
defer logFile.Close()
log.SetOutput(logFile)
log.Print("hi!")
l, err := net.Listen(gSocketProt, gSocketPath)
2016-08-13 12:49:04 +00:00
if err != nil {
log.Printf("listening socket: %s", err)
return
2016-08-13 12:49:04 +00:00
}
defer l.Close()
gConnList = make(map[int]net.Conn)
2016-08-13 12:49:04 +00:00
listen(l)
}
func listen(l net.Listener) {
for {
c, err := l.Accept()
if err != nil {
log.Printf("accepting connection: %s", err)
}
2016-10-29 23:20:35 +00:00
go handleConn(c)
}
}
func handleConn(c net.Conn) {
s := bufio.NewScanner(c)
for s.Scan() {
log.Printf("listen: %s", s.Text())
word, rest := splitWord(s.Text())
switch word {
2016-10-29 23:20:35 +00:00
case "save":
s.Scan()
switch s.Text() {
case "copy":
gCopyFile = true
case "move":
gCopyFile = false
default:
log.Printf("unexpected option to copy file(s): %s", s.Text())
break
}
gFileList = nil
for s.Scan() && s.Text() != "" {
gFileList = append(gFileList, s.Text())
}
2016-10-29 23:20:35 +00:00
case "load":
if gCopyFile {
fmt.Fprintln(c, "copy")
} else {
fmt.Fprintln(c, "move")
}
for _, f := range gFileList {
fmt.Fprintln(c, f)
}
fmt.Fprintln(c)
2016-10-29 23:20:35 +00:00
case "conn":
if rest != "" {
word2, _ := splitWord(rest)
id, err := strconv.Atoi(word2)
if err != nil {
log.Print("listen: conn: client id should be a number")
} else {
gConnList[id] = c
}
} else {
log.Print("listen: conn: requires a client id")
}
case "send":
if rest != "" {
word2, rest2 := splitWord(rest)
id, err := strconv.Atoi(word2)
if err != nil {
for _, c := range gConnList {
fmt.Fprintln(c, rest)
}
} else {
if c, ok := gConnList[id]; ok {
fmt.Fprintln(c, rest2)
}
}
2016-08-13 12:49:04 +00:00
}
2016-10-29 23:20:35 +00:00
default:
log.Printf("listen: unexpected command: %s", word)
2016-08-13 12:49:04 +00:00
}
}
2016-10-29 23:20:35 +00:00
2016-08-13 12:49:04 +00:00
if s.Err() != nil {
log.Printf("listening: %s", s.Err())
2016-08-13 12:49:04 +00:00
}
c.Close()
}