package main
import (
"github.com/Baiguoshuai1/shadiaosocketio"
"github.com/Baiguoshuai1/shadiaosocketio/websocket"
"log"
"net/http"
"time"
)
type Message struct {
Id int `json:"id"`
Channel string `json:"channel"`
}
type Desc struct {
Text string `json:"text"`
}
func main() {
server := shadiaosocketio.NewServer(*websocket.GetDefaultWebsocketTransport())
server.On(shadiaosocketio.OnConnection, func(c *shadiaosocketio.Channel) {
log.Println("[server] connected! id:", c.Id())
log.Println("[server]", c.RemoteAddr().Network()+" "+c.RemoteAddr().String()+
" --> "+c.LocalAddr().Network()+" "+c.LocalAddr().String())
c.Join("room")
server.BroadcastTo("room", "/admin", Message{1, "new members!"})
time.Sleep(100 * time.Millisecond)
c.BroadcastTo("room", "/admin", Message{2, "hello everyone!"})
_ = c.Emit("message", Message{10, "{\"chinese\":\"中文才是最屌的\"}"})
// return [][]byte
result, err := c.Ack("/ackFromServer", time.Second*5, "go", 3)
if err != nil {
log.Println("[server] ack cb err:", err)
return
}
log.Println("[server] ack cb:", result)
time.Sleep(3 * time.Second)
log.Println("ReadBytes", c.ReadBytes())
log.Println("WriteBytes", c.WriteBytes())
})
server.On(shadiaosocketio.OnDisconnection, func(c *shadiaosocketio.Channel, reason websocket.CloseError) {
log.Println("[server] received disconnect", c.Id(), "code:", reason.Code, "text:", reason.Text)
})
server.On("message", func(c *shadiaosocketio.Channel, arg1 string, arg2 Message, arg3 int, arg4 bool) {
log.Println("[server] received message:", "arg1:", arg1, "arg2:", arg2, "arg3:", arg3, "arg4:", arg4)
})
// listen ack event
server.On("/ackFromClient", func(c *shadiaosocketio.Channel, msg Message, num int) (int, Desc, string) {
log.Println("[server] received ack:", msg, num)
return 1, Desc{Text: "resp"}, "server"
})
serveMux := http.NewServeMux()
serveMux.Handle("/socket.io/", server)
serveMux.Handle("/", http.FileServer(http.Dir("assets")))
log.Println("[server] starting server...")
log.Panic(http.ListenAndServe(":2233", serveMux))
}
<!doctype html>
<html>
<head>
<title>Socket.IO chat</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body { font: 13px Helvetica, Arial; }
form { background: #000; padding: 3px; position: fixed; bottom: 0; width: 100%; }
form input { border: 0; padding: 10px; width: 90%; margin-right: .5%; }
form button { width: 9%; background: rgb(130, 224, 255); border: none; padding: 10px; }
#messages { list-style-type: none; margin: 0; padding: 0; }
#messages li { padding: 5px 10px; }
#messages li:nth-child(odd) { background: #eee; }
</style>
</head>
<body>
<ul id="messages"></ul>
<form action="">
<input id="m" autocomplete="off" /><button>Send</button>
</form>
<script src="https://unpkg.com/[email protected]/dist/socket.io.min.js"></script>
<script src="https://code.jquery.com/jquery-1.11.1.js"></script>
<script>
var socket = io("ws://127.0.0.1:2233",{transports: ['websocket']})
// listen for messages
socket.on('message', function(msg) {
console.log('[client] received msg:', msg);
});
// sending ack response
socket.on('/ackFromServer', function(a, b, f) {
console.log('[client] received ack:', a , b);
f({ id: 5, channel: 'js channel' }, 6)
});
socket.on('/admin', function(msg) {
console.log('[client] received admin msg:', msg);
});
socket.on('connect', function () {
console.log('[client] socket connected');
socket.emit('message', "js", { id: 1, channel: "js" }, 2);
// ack
socket.emit('/ackFromClient', { id: 3, channel: "js ack" }, 4, (a, b, c) => {
console.log('[client] ack cb:', a, b, c)
});
});
socket.on('disconnect', function (e) {
console.log('[client] socket disconnect', e);
});
socket.on('connect_error', function (e) {
console.log('[client] connect_error', e)
});
</script>
</body>
</html>