go語言客戶端和服務器端通信以及wireshark抓包

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包,左鍵點擊追蹤流即可查詢到包裏的發送內容。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章