使用go的基础库
服务端 websocket.go
package main
import (
"fmt"
"net/http"
"os"
"time"
"golang.org/x/net/websocket"
)
//错误处理函数
func checkErr(err error, extra string) bool {
if err != nil {
formatStr := " Err : %s\n"
if extra != "" {
formatStr = extra + formatStr
}
fmt.Fprintf(os.Stderr, formatStr, err.Error())
return true
}
return false
}
func svrConnHandler(conn *websocket.Conn) {
request := make([]byte, 128)
defer conn.Close()
go func() {
for {
conn.Write([]byte("World !"))
time.Sleep(time.Second * 10)
}
}()
for {
readLen, err := conn.Read(request)
if checkErr(err, "Read") {
break
}
//socket被关闭了
if readLen == 0 {
fmt.Println("Client connection close!")
break
} else {
//输出接收到的信息
fmt.Println(string(request[:readLen]))
time.Sleep(time.Second)
//发送
conn.Write([]byte("World !"))
}
}
}
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, "web.html")
})
http.Handle("/ws", websocket.Handler(svrConnHandler))
err := http.ListenAndServe(":1234", nil)
checkErr(err, "ListenAndServe")
fmt.Println("Func finish.")
}
客户端:web.html
<!-- websockets.html -->
<input id="input" type="text" />
<button onclick="send()">Send</button>
<pre id="output"></pre>
<script>
var input = document.getElementById("input");
var output = document.getElementById("output");
var socket = new WebSocket("ws://localhost:1234/ws");
socket.onopen = function () {
output.innerHTML += "Status: Connected\n";
};
socket.onmessage = function (e) {
output.innerHTML += "Server: " + e.data + "\n";
};
function send() {
socket.send(input.value);
input.value = "";
}
</script>