Avatar Sync Servers
This repository contains two functionally identical avatar synchronization servers optimized for different use cases:
1. Python Server (avatar_sync_server.py)
- Data Format: JSON
- Language: Python 3
- Use Case: Quick setup, easy debugging, human-readable data
2. Go Server (avatar_sync_server.go)
- Data Format: Raw Binary (Little Endian)
- Language: Go
- Use Case: High performance, reduced bandwidth, production deployment
Features
Both servers provide:
- REST API for avatar data synchronization
- CORS support for web applications
- Two player slots (player1, player2)
- Real-time data exchange
- Status monitoring
Endpoints
| Endpoint | Method | Description |
|---|---|---|
/ |
GET | Status page (HTML) |
/status |
GET | Server status information |
/player1 |
GET | Retrieve Player 1 avatar data |
/player1 |
POST | Update Player 1 avatar data |
/player2 |
GET | Retrieve Player 2 avatar data |
/player2 |
POST | Update Player 2 avatar data |
Installation & Usage
Python Server
Requirements: Python 3.6+
# Run the server
python avatar_sync_server.py
# With custom host/port
python avatar_sync_server.py --host 0.0.0.0 --port 8080
Go Server
Requirements: Go 1.16+
# Install Go from https://golang.org/dl/
# Run the server
go run avatar_sync_server.go
# Or build and run
go build avatar_sync_server.go
./avatar_sync_server # Linux/macOS
avatar_sync_server.exe # Windows
Performance Comparison
| Aspect | Python (JSON) | Go (Binary) |
|---|---|---|
| Data Size | ~100% | ~60-70% |
| Parse Speed | Baseline | 3-5x faster |
| Memory Usage | Higher | Lower |
| CPU Usage | Higher | Lower |
| Setup Complexity | Simple | Moderate |
Data Format
Python Server (JSON)
{
"rootTransform": {
"worldPosition": {"x": 0.0, "y": 0.0, "z": 0.0},
"worldRotation": {"x": 0.0, "y": 0.0, "z": 0.0, "w": 1.0},
"localScale": {"x": 1.0, "y": 1.0, "z": 1.0}
},
"bones": [],
"blendShapes": [],
"timestamp": 1234567890.123,
"server_timestamp": 1234567890.456
}
Go Server (Binary)
- Fixed-size structures for efficient memory layout
- Little Endian encoding for cross-platform compatibility
- Compact representation with no text overhead
Binary Protocol Specification
| Field | Type | Size (bytes) | Description |
|---|---|---|---|
| Root Transform | struct | 40 | Position(12) + Rotation(16) + Scale(12) |
| Timestamp | float64 | 8 | Client timestamp |
| Server Time | float64 | 8 | Server timestamp |
| Bone Count | int32 | 4 | Number of bones |
| Bones | []BoneData | Variable | Bone transformations |
| Blend Count | int32 | 4 | Number of blend shapes |
| Blend Shapes | []BlendShapeData | Variable | Facial animation data |
When to Use Which Server
Choose Python Server when:
- Rapid prototyping
- Easy debugging needed
- Human-readable data preferred
- Python ecosystem integration
- Small scale deployments
Choose Go Server when:
- High performance required
- Network bandwidth is limited
- Large scale deployments
- Binary data handling preferred
- Production environments
Example Client Code
Python Client (for JSON server)
import requests
import json
# Send avatar data
data = {
"rootTransform": {
"worldPosition": {"x": 1.0, "y": 2.0, "z": 3.0},
"worldRotation": {"x": 0.0, "y": 0.0, "z": 0.0, "w": 1.0},
"localScale": {"x": 1.0, "y": 1.0, "z": 1.0}
},
"bones": [],
"blendShapes": [],
"timestamp": time.time()
}
response = requests.post('http://localhost:8080/player1', json=data)
print(response.json())
# Get avatar data
response = requests.get('http://localhost:8080/player1')
avatar_data = response.json()
Go Client (for binary server)
import (
"bytes"
"encoding/binary"
"net/http"
)
// Serialize and send binary data
avatarData := AvatarData{/* ... */}
data, _ := avatarData.SerializeAvatarData()
resp, err := http.Post("http://localhost:8080/player1",
"application/octet-stream",
bytes.NewBuffer(data))
// Receive and deserialize binary data
resp, err := http.Get("http://localhost:8080/player1")
buf := new(bytes.Buffer)
buf.ReadFrom(resp.Body)
avatarData, err := DeserializeAvatarData(buf.Bytes())
Network Information
Both servers will display network information on startup:
- Local:
http://127.0.0.1:8080 - Network:
http://[YOUR_IP]:8080 - External:
http://0.0.0.0:8080
Access the status page in your browser to verify the server is running correctly.