国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

golang網(wǎng)絡(luò)編程學(xué)習(xí)-websocket

這篇具有很好參考價值的文章主要介紹了golang網(wǎng)絡(luò)編程學(xué)習(xí)-websocket。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

golang網(wǎng)絡(luò)編程學(xué)習(xí)-websocket

網(wǎng)絡(luò)編程主要的內(nèi)容是:
1.TCP網(wǎng)絡(luò)編程
2.http服務(wù)
3.rpc服務(wù)
4.websocket服務(wù)

?一、websocket編程

1.1服務(wù)端,代碼來自網(wǎng)絡(luò),僅限于學(xué)習(xí)研究

package main

import (
	"fmt"
	"net/http"
	"os"
	"reflect"
	"time"
	"unsafe"

	"github.com/gorilla/websocket"
)

type HttpHandler struct {
	http.Handler
}

func main() {
	var httpHandler HttpHandler
	http.Handle("/connect", httpHandler)
	if err := http.ListenAndServe(":9999", nil); err != nil {
		fmt.Println("程序退出")
		os.Exit(1)
	}
}

func (httpHandler HttpHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	fmt.Println("程序進(jìn)入監(jiān)聽>>")
	var upgrader = websocket.Upgrader{
		//解決跨域問題
		CheckOrigin: func(r *http.Request) bool {
			return true
		},
	}
	conn, err := upgrader.Upgrade(w, r, nil)
	if err != nil {
		fmt.Println("upgrade error:", err)
		return
	}
	defer conn.Close()
	conn.SetReadDeadline(time.Now().Add(6 * time.Second))
	conn.SetPongHandler(func(string) error {
		fmt.Println("接收心跳響應(yīng)<<")
		conn.SetReadDeadline(time.Now().Add(6 * time.Second))
		return nil
	})
	ticker := time.NewTicker(2 * time.Second)
	go func() {
		for {
			//從定時器中獲取數(shù)據(jù)
			_ = <-ticker.C
			fmt.Println("發(fā)送心跳包>>")
			conn.WriteMessage(websocket.PingMessage, []byte{})
		}
	}()
	defer ticker.Stop()
	for {
		messageType, message, err := conn.ReadMessage()
		if err != nil {
			fmt.Println("接收異常:", err)
			break
		}
		fmt.Println(fmt.Sprintf("接收消息內(nèi)容 >>%s", message))
		respMessage := fmt.Sprintf("I am Server, %s.", time.Now().Format("2006-01-02 15:04:05"))
		err = conn.WriteMessage(messageType, String2Bytes(respMessage))
		if err != nil {
			fmt.Println("發(fā)送異常:", err)
			break
		}
	}
}

func String2Bytes(s string) []byte {
	sh := (*reflect.StringHeader)(unsafe.Pointer(&s))
	bh := reflect.SliceHeader{
		Data: sh.Data,
		Len:  sh.Len,
		Cap:  sh.Len,
	}
	return *(*[]byte)(unsafe.Pointer(&bh))
}

?文章來源地址http://www.zghlxwxcb.cn/news/detail-583645.html

服務(wù)端截圖

golang網(wǎng)絡(luò)編程學(xué)習(xí)-websocket,golang30天,golang,學(xué)習(xí),websocket

?

1.2客戶端,代碼來自網(wǎng)絡(luò),僅限于學(xué)習(xí)研究

<html>
<head>
    <meta charset="UTF-8"/>
</head>
<body>
<div>
    <button onclick="start()" style="width:80px;height:30px;line-height:24px;">開始</button>
    <button onclick="stop()" style="width:80px;height:30px;line-height:24px;">停止</button>
    <button onclick="reset()" style="width:80px;height:30px;line-height:24px;">重置</button>
</div>
<div id="connect-show">未連接</div>
<div id="rec-show"></div>
</body>
<script type="text/javascript">
    var ws;
    var interval;

    function rewebsocket() {
        //ws = new WebSocket("ws://127.0.0.1:9999/connect");
        ws = new WebSocket("ws://127.0.0.1:9999/connect");
        //連接建立時觸發(fā)
        ws.onopen = function() {
            document.getElementById("connect-show").innerHTML = "連接成功";
            send(ws);
        }
        //連接關(guān)閉時觸發(fā)
        ws.onclose = function() {
            document.getElementById("connect-show").innerHTML = "連接已關(guān)閉";
        }
        //通信發(fā)生錯誤時觸發(fā)
        ws.onerror = function() {
            document.getElementById("connect-show").innerHTML = "連接通訊成功";
        }
        //客戶端接收服務(wù)端數(shù)據(jù)時觸發(fā)
        ws.onmessage = function(e) {
            var recMsg = e.data;
            var element = document.getElementById("rec-show");
            var nodes = element.childNodes;
            if (nodes && nodes.length >= 20) {
                element.removeChild(nodes[nodes.length-1])
            }
            element.innerHTML = ("<div>" + recMsg + "</div>" + element.innerHTML);
        }
    }

    //啟動
    function start() {
        if (ws == undefined || ws.readyState >= 2) {
            rewebsocket();
        }
    }

    //停止
    function stop() {
        clearInterval(interval);
        closeWebsocket(ws);
        interval = undefined;
        ws = undefined;
    }

    //重置
    function reset() {
        stop();
        document.getElementById("connect-show").innerHTML = "未連接";
        document.getElementById("rec-show").innerHTML = "";
        start();
    }

    //消息發(fā)送策略
    function send(ws) {
        interval = setInterval(() => {
            ws.send("I am client, " + getTime() + ".")
        },1000);
    }

    //獲取客戶端年月日時分秒
    function getTime() {
        return new Date( +new Date() + 8 * 3600 * 1000 ).toJSON().substr(0,19).replace("T"," ");
    }

    //關(guān)閉websocket連接
    function closeWebsocket(ws) {
        try {
            if (ws != undefined && ws.readyState < 2) {
                ws.close();
            }
        } catch (err){}
    }
</script>
</html>

golang網(wǎng)絡(luò)編程學(xué)習(xí)-websocket,golang30天,golang,學(xué)習(xí),websocket

?

golang網(wǎng)絡(luò)編程學(xué)習(xí)-websocket,golang30天,golang,學(xué)習(xí),websocket

?

?客戶端瀏覽器運(yùn)行內(nèi)容信息

?golang網(wǎng)絡(luò)編程學(xué)習(xí)-websocket,golang30天,golang,學(xué)習(xí),websocket

?

到了這里,關(guān)于golang網(wǎng)絡(luò)編程學(xué)習(xí)-websocket的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Go語言網(wǎng)絡(luò)編程(socket編程)WebSocket編程

    WebSocket是一種在單個TCP連接上進(jìn)行全雙工通信的協(xié)議 WebSocket使得客戶端和服務(wù)器之間的數(shù)據(jù)交換變得更加簡單,允許服務(wù)端主動向客戶端推送數(shù)據(jù) 在WebSocket API中,瀏覽器和服務(wù)器只需要完成一次握手,兩者之間就直接可以創(chuàng)建持久性的連接,并進(jìn)行雙向數(shù)據(jù)傳輸 需要安裝第

    2024年02月09日
    瀏覽(93)
  • python網(wǎng)絡(luò)編程之websocket

    我們知道一般我們的請求都是http請求,由客戶端發(fā)起,然后待服務(wù)端返回數(shù)據(jù)之后,這一個請求就結(jié)束了。但是,有些情況下,服務(wù)端需要主動給客戶端發(fā)消息(比如推送一些消息),服務(wù)端與客戶端需要進(jìn)行雙向交流,此時,http就顯得有些無能為力了。所以就有了全雙工

    2024年02月10日
    瀏覽(20)
  • Java網(wǎng)絡(luò)Socket編程-websocket

    實(shí)現(xiàn)一個用于監(jiān)測 WebSocket 連接狀態(tài)的線程類,其作用是通過創(chuàng)建一個 WebSocket 客戶端,連接到指定的 WebSocket 地址,并監(jiān)測連接的狀態(tài)。 代碼中的 WebSocketThread 類繼承自 Thread ,意味著它可以在單獨(dú)的線程中執(zhí)行。該線程類使用 Tyrus 提供的 @ClientEndpoint 注解來標(biāo)識這是一個

    2024年02月08日
    瀏覽(22)
  • Go語言網(wǎng)絡(luò)編程入門:TCP、HTTP、JSON序列化、Gin、WebSocket、RPC、gRPC示例

    Go語言網(wǎng)絡(luò)編程入門:TCP、HTTP、JSON序列化、Gin、WebSocket、RPC、gRPC示例

    在本文中,我們將介紹Go語言中的網(wǎng)絡(luò)編程的不同方式,包括TCP、HTTP、Gin框架、WebSocket、RPC、gRPC的介紹與連接實(shí)例,并對所有示例代碼都給出了詳細(xì)的注釋,最后對每種模式進(jìn)行了總結(jié)。 TCP(傳輸控制協(xié)議)是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議,提供

    2024年02月16日
    瀏覽(28)
  • 學(xué)習(xí)網(wǎng)絡(luò)編程N(yùn)o.4【socket編程實(shí)戰(zhàn)】

    學(xué)習(xí)網(wǎng)絡(luò)編程N(yùn)o.4【socket編程實(shí)戰(zhàn)】

    北京時間:2023/8/19/23:01,耍了好幾天,主要?dú)w咎于《我欲封天》這本小說,聽了幾個晚上之后逐漸入門,在閑暇時間又看了一下,小高潮直接來臨,最終在三個晝夜下追完了,哈哈哈!沒辦法呀,哎!末200章有些些爛尾,結(jié)局合乎情理,總的來說優(yōu)秀,畢竟耳根的名號擺在哪

    2024年02月11日
    瀏覽(19)
  • 學(xué)習(xí)網(wǎng)絡(luò)編程N(yùn)o.1【網(wǎng)絡(luò)基礎(chǔ)知識】

    學(xué)習(xí)網(wǎng)絡(luò)編程N(yùn)o.1【網(wǎng)絡(luò)基礎(chǔ)知識】

    北京時間:2023/8/4/22:40,天蒼蒼野茫茫,風(fēng)吹造地見牛羊,此時心潮澎湃,非常開心,啊哈哈哈!因為就在剛剛我們終于把系統(tǒng)編程方面的知識給學(xué)完了,啊哈哈哈!真是功夫不負(fù)有心人呀!嗚嗚嗚,仰天而泣,算了,不能發(fā)神經(jīng),哈哈!今天把最后一節(jié)有關(guān)多線程知識的課

    2024年02月14日
    瀏覽(27)
  • 【Java學(xué)習(xí)筆記】 68 - 網(wǎng)絡(luò)——TCP編程、UDP編程

    【Java學(xué)習(xí)筆記】 68 - 網(wǎng)絡(luò)——TCP編程、UDP編程

    https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter21/src 目錄 項目代碼 網(wǎng)絡(luò) 一、網(wǎng)絡(luò)相關(guān)概念 1.網(wǎng)絡(luò)通訊 2.網(wǎng)絡(luò) 3.IP地址 4.域名 5.端口號 6.網(wǎng)絡(luò)通訊協(xié)議 TCP協(xié)議:傳輸控制協(xié)議 UDP協(xié)議: 二、InetAddress類 1.相關(guān)方法 三、Socket 1.基本介紹 2.TCP網(wǎng)絡(luò)通信編程 基本介紹 應(yīng)用案例

    2024年02月04日
    瀏覽(26)
  • 4.14日網(wǎng)絡(luò)編程學(xué)習(xí)

    IP地址:指互聯(lián)網(wǎng)協(xié)議地址(Internet Protocol Address),俗稱IP。 要想使網(wǎng)絡(luò)中的計算機(jī)能夠進(jìn)行通信,必須為每臺計算機(jī)指定一個標(biāo)識號,通過這個標(biāo)識號來指定接受數(shù)據(jù)的計算機(jī)或者發(fā)送數(shù)據(jù)的計算機(jī)。 在TCP/IP協(xié)議中,這個標(biāo)識號就是IP地址,它可以唯一標(biāo)識一臺計算機(jī),目

    2024年04月15日
    瀏覽(23)
  • Java基礎(chǔ)學(xué)習(xí)(17)網(wǎng)絡(luò)編程

    Java基礎(chǔ)學(xué)習(xí)(17)網(wǎng)絡(luò)編程

    解釋: 在網(wǎng)絡(luò)通信協(xié)議下,不同計算機(jī)上運(yùn)行的程序,進(jìn)行的數(shù)據(jù)傳輸 應(yīng)用場景 : 即時通信、網(wǎng)游對戰(zhàn)、金融證券、國際貿(mào)易、郵件、等等 不管是什么場景,都是計算機(jī)跟計算機(jī)之間通過網(wǎng)絡(luò)進(jìn)行 數(shù)據(jù)傳輸 Java中可以使用 java.net 包下的技術(shù)輕松開發(fā)出常見的網(wǎng)絡(luò)應(yīng)用程序

    2024年02月05日
    瀏覽(29)
  • 學(xué)習(xí)網(wǎng)絡(luò)編程N(yùn)o.10【深入學(xué)習(xí)HTTPS】

    學(xué)習(xí)網(wǎng)絡(luò)編程N(yùn)o.10【深入學(xué)習(xí)HTTPS】

    北京時間:2023/11/14/18:45,因為種種原因,上個月的文章昨天才更新,目前處于刷題前夕,算法課在看了。這次和以前不一樣,因為以前對知識框架沒有很好的理念,并不清楚相關(guān)知識要學(xué)到什么時候才算完,大部分時間都花在了總結(jié)博客中,而這次我們已經(jīng)將主線課程全部學(xué)

    2024年02月05日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包