mirror of
https://github.com/originalmk/archat-server.git
synced 2024-11-20 09:38:50 +00:00
92 lines
1.9 KiB
Go
92 lines
1.9 KiB
Go
|
package client
|
||
|
|
||
|
import (
|
||
|
"bufio"
|
||
|
"encoding/json"
|
||
|
"log"
|
||
|
"net"
|
||
|
"time"
|
||
|
|
||
|
cm "krzyzanowski.dev/p2pchat/common"
|
||
|
)
|
||
|
|
||
|
type ClientContext struct {
|
||
|
reader *bufio.Reader
|
||
|
writer *bufio.Writer
|
||
|
}
|
||
|
|
||
|
func perform[T cm.Request, U cm.Response](cliCtx *ClientContext, request T) (U, error) {
|
||
|
reqJsonBytes, err := json.Marshal(request)
|
||
|
|
||
|
if err != nil {
|
||
|
return *new(U), err
|
||
|
}
|
||
|
|
||
|
reqBytes := make([]byte, 0)
|
||
|
reqBytes = append(reqBytes, request.GetRID())
|
||
|
reqBytes = append(reqBytes, reqJsonBytes...)
|
||
|
reqBytes = append(reqBytes, '\n')
|
||
|
|
||
|
_, err = cliCtx.writer.Write(reqBytes)
|
||
|
|
||
|
if err != nil {
|
||
|
return *new(U), err
|
||
|
}
|
||
|
|
||
|
err = cliCtx.writer.Flush()
|
||
|
|
||
|
if err != nil {
|
||
|
return *new(U), err
|
||
|
}
|
||
|
|
||
|
resBytes, err := cliCtx.reader.ReadBytes('\n')
|
||
|
|
||
|
if err != nil {
|
||
|
return *new(U), err
|
||
|
}
|
||
|
|
||
|
var res U
|
||
|
json.Unmarshal(resBytes, &res)
|
||
|
return res, nil
|
||
|
}
|
||
|
|
||
|
func RunClient() {
|
||
|
conn, err := net.Dial("tcp", ":8080")
|
||
|
|
||
|
if err != nil {
|
||
|
log.Println("[Client] err connecting")
|
||
|
return
|
||
|
}
|
||
|
|
||
|
defer func() {
|
||
|
_ = conn.Close()
|
||
|
}()
|
||
|
|
||
|
br := bufio.NewReader(conn)
|
||
|
bw := bufio.NewWriter(conn)
|
||
|
cliCtx := &ClientContext{br, bw}
|
||
|
|
||
|
log.Println("[Client] connected to server")
|
||
|
time.Sleep(time.Second * 1)
|
||
|
|
||
|
echoRes, err := perform[cm.EchoRequest, cm.EchoResponse](cliCtx, cm.EchoRequest{EchoByte: 5})
|
||
|
|
||
|
if err != nil {
|
||
|
log.Fatalln("[Client] error performing echo")
|
||
|
}
|
||
|
|
||
|
log.Printf("[Client] echo sent (5), got %d\n", echoRes)
|
||
|
|
||
|
authRes, _ := perform[cm.AuthRequest, cm.AuthResponse](cliCtx, cm.AuthRequest{Nickname: "maciek", Password: "9maciek1"})
|
||
|
log.Printf("[Client] authenticated: %t\n", authRes.IsSuccess)
|
||
|
|
||
|
listRes, _ := perform[cm.ListPeersRequest, cm.ListPeersResponse](cliCtx, cm.ListPeersRequest{})
|
||
|
log.Println("[Client] printing all peers:")
|
||
|
|
||
|
for _, peer := range listRes.PeersInfo {
|
||
|
log.Printf("[Client] Peer#%d from %s, hasNick: %t, nick: %s", peer.ID, peer.Addr, peer.HasNickaname, peer.Nickname)
|
||
|
}
|
||
|
|
||
|
time.Sleep(time.Second * 10)
|
||
|
}
|