Skip to content

Commit 5648253

Browse files
author
Lapp
committed
project: added jsonrpc support, added ability to send a message to yourself, users by their id and all users.
project: changed the structure of the project project: removed browser client, added CLI client Dockerfile: changed the path to the server binary file, removed the file index.html from the second build Makefile: added build and launch of the client part README.md: changed information about starting the client part, added technologies used in project & version v1.1.0
1 parent e680f85 commit 5648253

File tree

14 files changed

+273
-215
lines changed

14 files changed

+273
-215
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
.idea
2+
build/.bin

Dockerfile

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,13 @@ COPY ./ /github.com/Lapp-coder/websocket-chat
44
WORKDIR /github.com/Lapp-coder/websocket-chat
55

66
RUN go mod download
7-
RUN go build -o ./build/bin/chat ./...
7+
RUN go build -o ./build/.bin/chat ./cmd/app/server/main.go
88

99
FROM alpine:latest
1010

1111
WORKDIR /opt/
1212

13-
COPY --from=builder /github.com/Lapp-coder/websocket-chat/build/bin/chat .
14-
COPY --from=builder /github.com/Lapp-coder/websocket-chat/index.html .
13+
COPY --from=builder /github.com/Lapp-coder/websocket-chat/build/.bin/chat .
1514

1615
EXPOSE 8080
1716

Makefile

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
11
.PHONY:
22
.SILENT:
33

4-
build:
5-
go build -o ./main ./...
4+
build-server:
5+
go build -o ./build/.bin/server ./cmd/app/server/main.go
66

7-
run: build
8-
./main
7+
run-server: build-server
8+
./build/.bin/server
9+
10+
build-client:
11+
go build -o ./build/.bin/client ./cmd/app/client/main.go
12+
13+
run-client: build-client
14+
./build/.bin/client
915

1016
docker-build:
1117
docker build -t websocket-chat .

README.md

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,18 @@
1-
# Чат на вебсокетах
2-
[![Release](https://img.shields.io/badge/release-v1.0.1-blue)](https://github.com/Lapp-coder/go-pocket-sdk/releases)
1+
# Чат
2+
[![Release](https://img.shields.io/badge/release-v1.1.0-blue)](https://github.com/Lapp-coder/go-pocket-sdk/releases)
3+
4+
### При создании этого приложения были использованны следующие технологии:
5+
* Go 1.16.6
6+
* Протокол Websocket
7+
* Протокол JSON-RPC
8+
* Docker
9+
* Git
10+
* Makefile
311

412
### Для запуска сервера используйте следующую команду
513
```make docker-build && docker run --name=chat -e CHAT_HOST=<host> -e CHAT_PORT=<port> -p <port>>:<port> --rm websocket-chat```
614

715
### Для запуска сервера с конфигурацией по умолчанию
816
```make docker-run```
917

10-
#### P.S: Клиентом можно воспользоваться перейдя на корневую страницу сайта.
18+
#### P.S: Для запуска клиента используйте команду ```make run-client```

cmd/app/client/main.go

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package main
2+
3+
import (
4+
"bufio"
5+
"fmt"
6+
"github.com/Lapp-coder/websocket-chat/pkg/jrpc"
7+
"github.com/gorilla/websocket"
8+
"github.com/sirupsen/logrus"
9+
"net/rpc"
10+
"net/rpc/jsonrpc"
11+
"os"
12+
"strings"
13+
)
14+
15+
const (
16+
url = "ws://localhost:8080/chat"
17+
)
18+
19+
func main() {
20+
ws, _, err := websocket.DefaultDialer.Dial(url, nil)
21+
if err != nil {
22+
logrus.Fatal(err)
23+
}
24+
defer ws.Close()
25+
26+
_, msg, err := ws.ReadMessage()
27+
if err != nil {
28+
logrus.Fatal(err)
29+
}
30+
31+
id := string(msg)
32+
33+
client := jsonrpc.NewClient(ws.UnderlyingConn())
34+
defer client.Close()
35+
36+
go getUnreadMessages(id, client)
37+
38+
fmt.Println(
39+
`
40+
Введите id того пользоваетеля, которому хотите отправить сообщение. ( чтобы узнать свой id, введите команду /getmyid )
41+
Вы также можете отправить сообщение сразу нескольким пользователям, просто укажите их id через запятую.
42+
Для отправки сообщения всем пользователем введите *.
43+
Для отправки сообщения самому себе введите echo.
44+
45+
Для того, чтобы отправить сообщение, выберете получателя (по принципу выше) и через %$4^b введите ваше сообщение.
46+
Пример: echo %$4^b Hello, World!
47+
`)
48+
49+
scanner := bufio.NewScanner(os.Stdin)
50+
for {
51+
scanner.Scan()
52+
text := scanner.Text()
53+
54+
switch text {
55+
case "/getmyid":
56+
fmt.Println("Ваш id:", id)
57+
default:
58+
sending := strings.Split(text, " %$4^b ")
59+
if len(sending) == 0 {
60+
logrus.Error("Неккоректный формат входных данных")
61+
continue
62+
}
63+
64+
args := jrpc.SendMessageArgs{ID: id, Ids: sending[0], Message: sending[1]}
65+
if err = client.Call("Handler.SendMessage", args, nil); err != nil {
66+
logrus.Fatal(err)
67+
}
68+
}
69+
}
70+
}
71+
72+
func getUnreadMessages(id string, client *rpc.Client) {
73+
for {
74+
args := jrpc.GetMessagesArgs{ID: id}
75+
var result *[]string
76+
if err := client.Call("Handler.GetMessages", args, &result); err != nil {
77+
logrus.Fatal(err)
78+
} else if len(*result) != 0 {
79+
for _, msg := range *result {
80+
logrus.Println(msg)
81+
}
82+
}
83+
}
84+
}

main.go renamed to cmd/app/server/main.go

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,20 @@ package main
22

33
import (
44
"context"
5+
"github.com/Lapp-coder/websocket-chat/internal/app/server"
56
"github.com/sirupsen/logrus"
6-
"html/template"
7+
"net/rpc"
78
"os"
89
"os/signal"
910
"syscall"
1011
)
1112

1213
func main() {
13-
indexTemplate = template.Must(template.ParseFiles("index.html"))
14-
hub := newHub()
15-
handler := newHandler(hub)
16-
handler.initRoutes()
17-
go hub.listen()
14+
hub := server.NewHub()
15+
handler := server.NewHandler(hub)
16+
rpc.Register(handler)
17+
handler.InitRoutes()
18+
go hub.Listen()
1819

1920
host := os.Getenv("CHAT_HOST")
2021
port := os.Getenv("CHAT_PORT")
@@ -23,9 +24,9 @@ func main() {
2324
}
2425

2526
// Запуск сервера в go-рутине для его плавной остановки
26-
srv := newServer(host + ":" + port)
27+
srv := server.NewServer(host + ":" + port)
2728
go func() {
28-
if err := srv.start(); err != nil {
29+
if err := srv.Start(); err != nil {
2930
logrus.Errorf("failed to start server: %s", err.Error())
3031
}
3132
}()
@@ -40,7 +41,7 @@ func main() {
4041
logrus.Info("server shutdown")
4142

4243
// Плавная остановка сервера
43-
if err := srv.shutdown(context.Background()); err != nil {
44+
if err := srv.Shutdown(context.Background()); err != nil {
4445
logrus.Errorf("failed to graceful shutdown server: %s", err.Error())
4546
}
4647
}

connection.go

Lines changed: 0 additions & 38 deletions
This file was deleted.

handler.go

Lines changed: 0 additions & 50 deletions
This file was deleted.

index.html

Lines changed: 0 additions & 88 deletions
This file was deleted.

0 commit comments

Comments
 (0)