Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 1 addition & 3 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,7 @@
*.dll
*.so
*.dylib
!*.*

# Test binary, build with `go test -c`
*.test

# Output of the go coverage tool, specifically when used with LiteIDE
*.out
9 changes: 9 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
FROM golang:latest

EXPOSE 9090

COPY src/server/server /usr/local/bin/server

COPY src/client/client /usr/local/bin/client

ENTRYPOINT ["/usr/local/bin/server"]
39 changes: 39 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
SERVER_PATH = ./src/server
SERVER_BIN = server

CLIENT_PATH = ./src/client
CLIENT_BIN = client

SEARCH_GOFILES := $(shell find -type f -name "*.go")

build: clean client server docker

.PHONY: test
test:
go test -coverprofile=coverage.out $(SERVER_PATH) $(CLIENT_PATH)

.PHONY: check
check:
goimports -e -l $(SEARCH_GOFILES)
golint -set_exit_status $(SEARCH_GOFILES)
go vet $(SERVER_PATH)
go vet $(CLIENT_PATH)

.PHONY: run
run: buid
sudo docker run -d gohomework
#docker exec -i $(docker ps -qf ancestor=gohomework --last=1) /usr/local/bin/client

clean:
rm -rf $(SERVER_PATH)/$(SERVER_BIN)
rm -rf $(CLIENT_PATH)/$(CLIENT_BIN)

client:
go build -o $(CLIENT_PATH)/$(CLIENT_BIN) $(CLIENT_PATH)/client.go

server:
go build -o $(SERVER_PATH)/$(SERVER_BIN) $(SERVER_PATH)/server.go

.PHONY: docker
docker: server client
sudo docker build -t "gohomework" .
Binary file added Project.pdf
Binary file not shown.
26 changes: 26 additions & 0 deletions README.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
INSTALLATION AND RUN INSTRUCTIONS
===============================================================================

Linux Installation Instructions
------------------------------------------------------------------------------
Open a console and type:
"sudo make"

Linux Run Instructions
------------------------------------------------------------------------------
Server run:
Open a console and type:
"sudo docker run gohomework"
or
Open a console and type:
"sudo make run"

Client run:
Open a console and type:
docker exec -i ID /usr/local/bin/client
where ID is the ID of the running container gohomework
or
Open a console and type:
docker exec -i $(docker ps -qf ancestor=gohomework --last=1) /usr/local/bin/client
for the latest running container gohomewrok

1 change: 1 addition & 0 deletions VERSION
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
0.4
34 changes: 34 additions & 0 deletions coverage.out
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
mode: set
_/home/vpirtan/GoHomework/src/server/server.go:13.13,19.16 6 1
_/home/vpirtan/GoHomework/src/server/server.go:23.2,28.6 4 1
_/home/vpirtan/GoHomework/src/server/server.go:19.16,22.3 2 0
_/home/vpirtan/GoHomework/src/server/server.go:28.6,30.17 2 1
_/home/vpirtan/GoHomework/src/server/server.go:33.3,33.28 1 1
_/home/vpirtan/GoHomework/src/server/server.go:30.17,32.4 1 0
_/home/vpirtan/GoHomework/src/server/server.go:37.38,43.6 6 1
_/home/vpirtan/GoHomework/src/server/server.go:43.6,45.17 2 1
_/home/vpirtan/GoHomework/src/server/server.go:50.3,51.22 2 1
_/home/vpirtan/GoHomework/src/server/server.go:75.3,76.23 2 1
_/home/vpirtan/GoHomework/src/server/server.go:45.17,48.4 2 1
_/home/vpirtan/GoHomework/src/server/server.go:52.14,53.26 1 1
_/home/vpirtan/GoHomework/src/server/server.go:59.14,60.26 1 1
_/home/vpirtan/GoHomework/src/server/server.go:65.14,66.26 1 1
_/home/vpirtan/GoHomework/src/server/server.go:72.11,73.63 1 0
_/home/vpirtan/GoHomework/src/server/server.go:53.26,56.5 2 1
_/home/vpirtan/GoHomework/src/server/server.go:56.10,58.5 1 0
_/home/vpirtan/GoHomework/src/server/server.go:60.26,62.5 1 1
_/home/vpirtan/GoHomework/src/server/server.go:62.10,64.5 1 0
_/home/vpirtan/GoHomework/src/server/server.go:66.26,69.5 2 1
_/home/vpirtan/GoHomework/src/server/server.go:69.10,71.5 1 0
_/home/vpirtan/GoHomework/src/client/client.go:11.13,21.23 10 0
_/home/vpirtan/GoHomework/src/client/client.go:25.9,29.13 5 0
_/home/vpirtan/GoHomework/src/client/client.go:21.23,24.10 2 0
_/home/vpirtan/GoHomework/src/client/client.go:29.13,32.31 3 0
_/home/vpirtan/GoHomework/src/client/client.go:35.17,35.34 1 0
_/home/vpirtan/GoHomework/src/client/client.go:43.17,44.31 2 0
_/home/vpirtan/GoHomework/src/client/client.go:47.17,47.33 1 0
_/home/vpirtan/GoHomework/src/client/client.go:32.31,34.18 1 0
_/home/vpirtan/GoHomework/src/client/client.go:35.34,37.49 2 0
_/home/vpirtan/GoHomework/src/client/client.go:41.25,41.45 1 0
_/home/vpirtan/GoHomework/src/client/client.go:37.49,40.26 2 0
_/home/vpirtan/GoHomework/src/client/client.go:44.31,46.18 1 0
48 changes: 48 additions & 0 deletions src/client/client.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package main

import (
"bufio"
"flag"
"fmt"
"net"
"os"
)

func main() {
var portFlag string
flag.StringVar(&portFlag, "port", "9090", "Server port. Defalt: 9090")
flag.StringVar(&portFlag, "p", "9090", "Server port. Defalt: 9090")
var hostFlag string
flag.StringVar(&hostFlag, "host", "127.0.0.1", "Server host. Defalt: 127.0.0.1")
flag.StringVar(&hostFlag, "h", "127.0.0.1", "Server host. Defalt: 127.0.0.1")
flag.Parse()
conn, err := net.Dial("tcp", hostFlag+":"+portFlag)
if err != nil {
fmt.Println(err)
return
}
defer conn.Close()
serverWriter := bufio.NewWriter(conn)
serverReader := bufio.NewReader(conn)
comandReader := bufio.NewReader(os.Stdin)
for {
fmt.Print("> ")
command, err := comandReader.ReadString('\n')
if err != nil {
fmt.Println(err)
}
if command != "" {
n, err := serverWriter.WriteString(command)
if n == 0 || err != nil {
fmt.Println(err)
return
}
serverWriter.Flush()
}
reply, err := serverReader.ReadString('\n')
if err != nil {
fmt.Println(err)
}
fmt.Print(reply)
}
}
2 changes: 2 additions & 0 deletions src/client/client_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
package main

79 changes: 79 additions & 0 deletions src/server/server.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
package main

import (
"bufio"
"flag"
"fmt"
"log"
"net"
"strings"
)


func main() {
var portFlag string
flag.StringVar(&portFlag, "port", "9090", "Server port. Defalt: 9090")
flag.StringVar(&portFlag, "p", "9090", "Server port. Defalt: 9090")
flag.Parse()
listener, err := net.Listen("tcp", ":"+portFlag)
if err != nil {
fmt.Println(err)
return
}
defer listener.Close()

log.Printf("Server is running on %s\n", portFlag)
log.Println("Ready to accept connections")

for {
conn, err := listener.Accept()
if err != nil {
log.Fatalln(err)
}
go handleConnection(conn)
}
}

func handleConnection(conn net.Conn) {
defer conn.Close()
log.Println("Connection from", conn.RemoteAddr())
dataBase := make(map[string]string)
clientReader := bufio.NewReader(conn)
clientWriter := bufio.NewWriter(conn)
for {
command, err := clientReader.ReadString('\n')
if err != nil {
fmt.Println(err)
return
}

commands := strings.Split(command[:len(command)-1], " ")
switch commands[0] {
case "set":
if len(commands) == 3 {
dataBase[commands[1]] = commands[2]
clientWriter.WriteString("Ok")
} else {
clientWriter.WriteString("Wrong command. Right: set [key] [value]")
}
case "get":
if len(commands) == 2 {
clientWriter.WriteString("\"" + dataBase[commands[1]] + "\"")
} else {
clientWriter.WriteString("Wrong command. Right: get [key]")
}
case "del":
if len(commands) == 2 {
delete(dataBase, commands[1])
clientWriter.WriteString("Ok")
} else {
clientWriter.WriteString("Wrong command. Right: det [key]")
}
default:
clientWriter.WriteString("unknown command: " + commands[0])
}
clientWriter.WriteString("\n")
clientWriter.Flush()

}
}
43 changes: 43 additions & 0 deletions src/server/server_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package main

import (
"testing"
"bufio"
"net"
"time"
)


var tests = map[string] string {
"set a b\n" : "Ok\n",
"get a\n" : "\"b\"\n",
"del a\n" : "Ok\n",
}

func TestHandleConnection(t *testing.T){
go main()
time.Sleep(time.Millisecond)
conn, err := net.Dial("tcp", "127.0.0.1:9090")
if err != nil {
t.Error(err)

}
defer conn.Close()
serverWriter := bufio.NewWriter(conn)
serverReader := bufio.NewReader(conn)

for reqst, resp := range tests{
n, err := serverWriter.WriteString(reqst)
if n == 0 || err != nil {
t.Error(err)
}
serverWriter.Flush()
reply, err := serverReader.ReadString('\n')
if err != nil {
t.Error(err)
}
if reply != resp {
t.Error("Excepted ", resp, " got", reply)
}
}
}