1.客戶端代碼:
package main
import(
"golang.org/x/net/websocket"
"fmt"
"net/http"
"flag"
)
type WSServer struct {
ListenAddr string
}
func (this *WSServer)handler(conn *websocket.Conn){
fmt.Printf("a new ws conn: %s->%s\n", conn.RemoteAddr().String(), conn.LocalAddr().String())
var err error
for {
var reply string
err = websocket.Message.Receive(conn, &reply)
if err != nil {
fmt.Println("receive err:",err.Error())
break
}
fmt.Println("Received from client: " + reply)
if err = websocket.Message.Send(conn, reply); err != nil {
fmt.Println("send err:", err.Error())
break
}
}
}
func (this *WSServer)start()(error){
http.Handle("/ws", websocket.Handler(this.handler))
fmt.Println("begin to listen")
err := http.ListenAndServe(this.ListenAddr, nil)
if err != nil {
fmt.Println("ListenAndServe:", err)
return err
}
fmt.Println("start end")
return nil
}
func main(){
addr := flag.String("a", "0.0.0.0:6610", "websocket server listen address")
flag.Parse()
wsServer := &WSServer{
ListenAddr : *addr,
}
wsServer.start()
fmt.Println("------end-------")
}
2.服務器端代碼
package main
import (
"flag"
"fmt"
"time"
"golang.org/x/net/websocket"
)
var addr = flag.String("addr", "127.0.0.1:6610", "http service address")
func main() {
flag.Parse()
url := "ws://"+ *addr + "/ws"
origin := "test://1111111/"
ws, err := websocket.Dial(url, "", origin)
if err != nil {
fmt.Println(err)
}
go timeWriter(ws)
for {
var msg [512]byte
_, err := ws.Read(msg[:])//此處阻塞,等待有數據可讀
if err != nil {
fmt.Println("read:", err)
return
}
fmt.Printf("received: %s\n", msg)
}
}
func timeWriter(conn *websocket.Conn) {
for {
time.Sleep(time.Second * 2)
websocket.Message.Send(conn, "hello world")
}
}
需要注意的是origin必須以“http://1111111/” 這種標準的URI格式,否則報錯“invalid URI for r.equest”。
還需要注意的是,客戶端和服務器端ip地址應該是你的本機地址,端口號一樣。服務器端ip地址可以寫成0.0.0.0
本地客戶端服務器端通信,需要在dos命令行中敲入route add 本機ip mask 255.255.255.255 網關ip metric 1
3 .抓包
首先,運行客戶端程序,生成可執行文件exe。
其次,運行服務器端程序,準備監聽客戶端的請求。
然後,運行客戶端程序,準備用wireshark進行抓包。
進入wireshark,在過濾器中填入ip.addr==本機地址ip and tcp.port=6610 進行過濾,之後捕獲分組即可。其中可以看到,tcp的三次握手,http的請求。之後就是發送的tcp和websocket包,左鍵點擊追蹤流即可查詢到包裏的發送內容。