golang(5):编写WebSocket服务,client和html5调用

golang(5):编写WebSocket服务,client和html5调用

大家好,又见面了,我是全栈君。

本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/46882777 转载请必须注明出处!

1。关于websocket

HTML5定义了WebSocket协议,能更好的节省server资源和带宽并达到实时通讯。
在JavaEE7中也实现了WebSocket协议。
在 WebSocket API,浏览器和server仅仅须要要做一个握手的动作。然后,浏览器和server之间就形成了一条高速通道。

两者之间就直接能够数据互相传送。

參考:
http://baike.baidu.com/link?

url=gSdXNTHdO4W0jS-lqdo3VOL0VDTyTh7YLXV1amAT5cEsMIgn5u0Sbay4fMJeqOiX4vaWn9E4ttit3Dxv2A_KGK

2,安装websocket

使用的golang官方的net包以下的websocket,地址:
https://github.com/golang/net

首先设置go_path变量,參考:
http://blog.csdn.net/freewebsys/article/details/46695513

下载net包,安装websocket模块

#所有模块下载
go get github.com/golang/net
#做下软连接把github目录以下的映射到golang.org下,否则其它模块如html安装不上。
ln -s /usr/local/go_path/src/github.com/golang/net /usr/local/go_path/src/golang.org/x/net
#安装websocket模块
go install golang.org/x/net/websocket

这个模块的包结构都统一成golang.org/x/net。使用import “golang.org/x/net/websocket”引入。

文档在:(godoc是很不错的站点,所有golang的文档都在上面。


https://godoc.org/golang.org/x/net/websocket

3。代码和执行

代码:
https://github.com/golang-samples/websocket
server代码:终于还是挂在httpserver上面的。

package main

import (
    "golang.org/x/net/websocket"
    "fmt"
    "log"
    "net/http"
)

func echoHandler(ws *websocket.Conn) {
    msg := make([]byte, 512)
    n, err := ws.Read(msg)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Receive: %s\n", msg[:n])

    send_msg := "[" + string(msg[:n]) + "]"
    m, err := ws.Write([]byte(send_msg))
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Send: %s\n", msg[:m])
}

func main() {
    http.Handle("/echo", websocket.Handler(echoHandler))
    http.Handle("/", http.FileServer(http.Dir(".")))

    err := http.ListenAndServe(":8080", nil)

    if err != nil {
        panic("ListenAndServe: " + err.Error())
    }
}

clientwebsocket调用代码:

package main

import (
    "golang.org/x/net/websocket"
    "fmt"
    "log"
)

var origin = "http://127.0.0.1:8080/"
var url = "ws://127.0.0.1:8080/echo"

func main() {
    ws, err := websocket.Dial(url, "", origin)
    if err != nil {
        log.Fatal(err)
    }
    message := []byte("hello, world!你好")
    _, err = ws.Write(message)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Send: %s\n", message)

    var msg = make([]byte, 512)
    m, err := ws.Read(msg)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Receive: %s\n", msg[:m])

    ws.Close()//关闭连接
}

client使用websocket.Dial(url, “”, origin) 进行websocket连接,可是origin參数并没有实际调用。
使用websocket进行数据的发送和接受。

很有意思的事情是,假设client和服务端都是用go写,用的都是websocket这个对象。

函数调用都是一样的。仅仅只是一个写一个读数据而已。

4。html5调用

使用jquery了。用百度的cdn:
http://cdn.code.baidu.com/
html5页面代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8"/>
    <title>Sample of websocket with golang</title>
    <script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>

    <script> $(function() { var ws = new WebSocket("ws://localhost:8080/echo"); ws.onmessage = function(e) { $('<li>').text(event.data).appendTo($ul); }; var $ul = $('#msg-list'); $('#sendBtn').click(function(){ var data = $('#name').val(); ws.send(data); }); }); </script>
</head>
<body>
<input id="name" type="text"/>
<input type="button" id="sendBtn" value="send"/>
<ul id="msg-list"></ul>
</body>
</html>

当点击button按钮之后,websocket收到onmessage事件,然后把数据显示到页面。
golang(5):编写WebSocket服务,client和html5调用
浏览器显示websocket连接状态。

golang(5):编写WebSocket服务,client和html5调用

5,总结

本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/46882777 转载请必须注明出处!

使用golang开发websocket很easy。
很方便。由于nodejs做server的时候会出现server负载突然高的情况。并且nodejs的库很杂和多,解决起来可能比較麻烦。

我还是比較倾向于用golang开发。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115968.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 周立功的《深入浅出ARM7》上_看门狗

    周立功的《深入浅出ARM7》上_看门狗周立功的《深入浅出ARM7》上_看门狗1.看门狗概述看门狗(WD,Watchdog)包括一个4分频的预分频器和一个32位计数器。时钟通过预分频器输入定时器。定时器递减计数。定时器递减的最小值为0x

    2022年7月1日
    26
  • 如何使用SQL Server配置管理器

    如何使用SQL Server配置管理器SQLServerconfigurationmanagerisatoolprovidedbyMicrosoftSQLServer.WhenweinstallSQLServer,itisinstalledautomatically.Itisusedforthefollowingpurposes.SQLServer配置管理器是Mic…

    2022年7月20日
    12
  • QTcpSocket – client[通俗易懂]

    QTcpSocket – client[通俗易懂]#include”mainwindow.h”#include”ui_clientWindow.h”#include<QMessageBox>#include<QDateTime>MainWindow::MainWindow(QWidget*parent):QMainWindow(parent),ui(newUi::clientW…

    2025年10月15日
    6
  • 字符串正则匹配leetcode_正则在线检验

    字符串正则匹配leetcode_正则在线检验原题链接给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。‘.’ 匹配任意单个字符‘*’ 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。示例 1:输入:s = “aa” p = “a”输出:false解释:”a” 无法匹配 “aa” 整个字符串。示例 2:输入:s = “aa” p = “a*”输出:true解释:因为 ‘*’ 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是

    2022年8月8日
    7
  • 双边滤波算法_双边滤波的原理

    双边滤波算法_双边滤波的原理双边滤波算法

    2022年8月4日
    9
  • windows 同步其他windows时间 w32time

    windows 同步其他windows时间 w32time一 介绍 nbsp nbsp 在 windows 平台下有 w32time 服务 w32time 服务有两种模式 服务器模式 客户端模式 默认只开启客户端模式 用于和其他的时间服务器同步 作为时间服务器 需要开启服务器模式 二 服务器设置 nbsp nbsp 1 修改注册表 nbsp nbsp nbsp 键值 HKEY LOCAL MACHINE SYSTEM CurrentContr Services W32Time TimeProv

    2025年7月28日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号