# OmniSocketGo

Linux only. Go 1.22.

如果目标机器只运行 `server`，只需要编译并拷贝 `server` 二进制。
如果目标机器只运行 `peer`，只需要编译并拷贝 `peer` 二进制。

`go build ./cmd/server` 和 `go build ./cmd/peer` 会把各自依赖到的功能一起编译进最终二进制，不需要再单独编译 `cmd/internal/...` 包。

- `server` 二进制会包含它依赖到的转发、协议、传输等代码
- `peer` 二进制会包含它依赖到的注册、交互发送、接收落盘、协议、传输等代码
- 只有没有被这个可执行程序引用的其他命令，才不在该二进制里，比如 `cmd/latencysummary`

## Build

按目标架构分别编译。
  mkdir -p bin
  go build -o bin/server ./cmd/server
  go build -o bin/peer ./cmd/peer
  go build -o bin/latencysummary ./cmd/latencysummary

### Linux amd64

```bash
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o bin/server-linux-amd64 ./cmd/server
```

### Linux arm64

```bash
CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -o bin/peer-linux-arm64 ./cmd/peer
```

### Linux armv7

```bash
CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=7 go build -o bin/server-linux-armv7 ./cmd/server
CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=7 go build -o bin/peer-linux-armv7 ./cmd/peer
```

## Deploy

把对应架构的二进制拷到目标机器，并赋予可执行权限。

```bash
scp bin/server-linux-amd64 user@server-host:~/omnisocket/server
scp bin/peer-linux-amd64 user@peer-host:~/omnisocket/peer
```

```bash
ssh user@server-host 'chmod +x ~/omnisocket/server'
ssh user@peer-host 'chmod +x ~/omnisocket/peer'
```

## Run On Different Machines

`server` 所在机器监听 `0.0.0.0:9000`。

```bash
~/omnisocket/server -listen 0.0.0.0:9000
```

每个 `peer` 所在机器连接 `server` 的实际 IP，例如 `192.168.1.50:9000`。

### peer-a

```bash
~/omnisocket/peer \
  -id peer-a \
  -server 192.168.1.50:9000 \
  -inbox-dir /tmp/peer-a-inbox
```

### peer-b

```bash
~/omnisocket/peer \
  -id peer-b \
  -server 192.168.1.50:9000 \
  -inbox-dir /tmp/peer-b-inbox
```

## Interactive Commands

`peer` 启动后可以在终端里持续使用同一条长连接发送多次消息。

```text
help
text peer-b hello
text peer-a hi
file peer-b /tmp/test.bin
quit
```
