Skip to content

Instantly share code, notes, and snippets.

@fclairamb
Created January 4, 2014 22:09
Show Gist options
  • Save fclairamb/8261405 to your computer and use it in GitHub Desktop.
Save fclairamb/8261405 to your computer and use it in GitHub Desktop.
Simple TCP line receiving Go Server
package main
import (
"bufio"
"fmt"
"io"
"log"
"net"
"os"
"runtime"
"time"
)
func main() {
runtime.GOMAXPROCS(1) // We don't need more
go Server()
select {}
}
func CounterProvider(counter chan int) {
for i := 1; ; i++ {
counter <- i
}
}
func Server() {
{ // We start by setting up logging
log.SetFlags(log.Ldate | log.Ltime | log.Lmicroseconds | log.Lshortfile)
if f, err := os.OpenFile("server.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0660); err != nil {
log.Fatal("Could not open log file ! ", err)
} else {
log.SetOutput(io.MultiWriter(f, os.Stdout))
defer f.Close()
}
}
port := 33243
ln, err := net.Listen("tcp", fmt.Sprintf(":%d", port))
if err != nil {
log.Println("Listen error: ", err)
} else {
log.Println("Listening on", port)
}
counter := make(chan int)
go CounterProvider(counter)
for {
conn, err := ln.Accept()
if err != nil {
log.Fatal("Accept error: ", err)
}
go handleConn(conn, counter)
}
}
func handleConn(conn net.Conn, counter chan int) (err error) {
defer conn.Close()
start := time.Now().UTC()
r := bufio.NewReader(conn)
nb := <-counter
log.Printf("[%d] Conn: %s\n", nb, conn.RemoteAddr())
loop:
for {
raw, _, e := r.ReadLine()
if e != nil {
err = e
break
}
line := string(raw)
log.Printf("[%d] Line: \"%s\"\n", nb, line)
switch line {
case "quit":
break loop
case "gc":
runtime.GC()
}
}
delta := time.Now().UTC().Sub(start)
if err != nil {
log.Println("error =", err)
}
log.Printf("[%d] Closed, spent time: %s\n", nb, delta)
return err
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment