Skip to content
This repository was archived by the owner on Oct 16, 2024. It is now read-only.

Commit e4fe77e

Browse files
committed
改了一些东西。。
1 parent b6c0a56 commit e4fe77e

File tree

4 files changed

+125
-2
lines changed

4 files changed

+125
-2
lines changed

docs/protocol.md

-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,6 @@
6060

6161
```json5
6262
{
63-
"id": "123123123123", //客户端ID,可选
6463
"username": "user", //用户名
6564
"password": "123456", //密码
6665
}

rpc/client.go

+120
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
package rpc
2+
3+
import (
4+
"bytes"
5+
"encoding/binary"
6+
"errors"
7+
"io"
8+
"net"
9+
"net/url"
10+
)
11+
12+
type Client struct {
13+
Url string
14+
15+
Encoding uint8 //JSON
16+
17+
id uint16
18+
conn net.Conn
19+
requests map[uint16]any
20+
}
21+
22+
func (c *Client) Write(pack *Pack) error {
23+
c.id++
24+
25+
c.conn.Write(pack.Header)
26+
}
27+
28+
func (c *Client) Write2(typ uint8, data any) error {
29+
header := make([]byte, 8)
30+
31+
}
32+
33+
func (c *Client) Request(request any) (response any, err error) {
34+
header := make([]byte, 8)
35+
36+
}
37+
38+
func (c *Client) receive() {
39+
buf := make([]byte, 8)
40+
for {
41+
//_ = c.conn.SetReadDeadline(time.Time{})
42+
//n, err := c.conn.Read(buf)
43+
n, err := io.ReadAtLeast(c.conn, buf, 8)
44+
if err != nil {
45+
break
46+
}
47+
if n < 8 {
48+
break
49+
}
50+
51+
if bytes.Compare(buf[:3], []byte(MAGIC)) != 0 {
52+
break
53+
}
54+
55+
l := int(binary.BigEndian.Uint16(buf[6:])) //长度
56+
if l > 0 {
57+
b := make([]byte, l)
58+
//_ = c.conn.SetReadDeadline(time.Now().Add(time.Second * 30))
59+
n, err = io.ReadAtLeast(c.conn, b, l)
60+
if err != nil {
61+
break
62+
}
63+
if n != l {
64+
//长度不够,费包
65+
break
66+
}
67+
}
68+
69+
tp := buf[3] >> 4
70+
enc := buf[3] & 0xf
71+
72+
var pack Pack
73+
pack.Decode(b)
74+
75+
}
76+
77+
//关闭连接
78+
_ = c.conn.Close()
79+
80+
}
81+
82+
func (c *Client) Open() error {
83+
//rpc://username:[email protected]:719
84+
u, err := url.Parse(c.Url)
85+
if err != nil {
86+
return err
87+
}
88+
89+
if u.Scheme != "rpc" {
90+
return errors.New("协议错误")
91+
}
92+
93+
if u.User == nil {
94+
return errors.New("缺少用户名和密码")
95+
}
96+
97+
c.conn, err = net.Dial("tcp", u.Hostname())
98+
if err != nil {
99+
return err
100+
}
101+
102+
pack := Pack{
103+
Type: CONNECT,
104+
Encoding: JSON,
105+
Content: map[string]any{
106+
"username": u.User.Username(),
107+
"password": u.User.Password(),
108+
},
109+
}
110+
111+
err = c.Write(&pack)
112+
if err != nil {
113+
return err
114+
}
115+
116+
//持续接收消息
117+
go c.receive()
118+
119+
return nil
120+
}

rpc/pack.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ var ErrNotEnough = errors.New("长度不足")
1616
type Encoder func(any) ([]byte, error)
1717
type Decoder func([]byte, any) error
1818

19-
const MAGIC = "rgc"
19+
const MAGIC = "rpc"
2020

2121
const (
2222
DISCONNECT uint8 = iota

rpc/stream.go

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package rpc
2+
3+
type Stream struct {
4+
}

0 commit comments

Comments
 (0)