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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java异常面试题(2020最新版)

    Java异常面试题(2020最新版)文章目录Java异常架构与异常关键字Java异常简介Java异常架构1.Throwable2.Error(错误)3.Exception(异常)运行时异常编译时异常4.受检异常与非受检异常受检异常非受检异常Java异常关键字Java异常处理声明异常抛出异常捕获异常如何选择异常类型常见异常处理方式直接抛出异常封装异常再抛出捕获异常自定义异常try-catch-finallytry-with-r…

    2022年5月19日
    27
  • 对java老师的评价及建议_对老师的评价和建议

    对java老师的评价及建议_对老师的评价和建议篇一:学生对教师评语学生对教师的评价()老师授课的方式非常适合我们,他根据本课程知识结构的特点,重点突出,层次分明。理论和实际相结合,通过例题使知识更条理化。但授课速度有点快,来不及记录。()老师授课有条理,有重点,对同学既热情又严格,是各位老师学习的榜样。()老师上课有时非常幽默,有时非常严格,不过还是非常有教授风度的,不妨自己来听听嘛!大家很崇拜他哦!=()老师治学严谨,要求严格,能深入了解学…

    2022年7月7日
    20
  • KAZE特征的理解

    KAZE特征的理解毕设要做图像配准,计划使用KAZE特征进行特征点的检测,以下是我对KAZE算法原理的理解,有什么不对的地方,希望提出来大家相互讨论学习。一、KAZE算法的由来KAZE算法是由法国学者在在2012年的ECCV会议中提出的,是一种比SIFT更稳定的特征检测算法。KAZE的取名是为了纪念尺度空间分析的开创者—日本学者Iijima。KAZE在日语中是‘风’的谐音,寓意是就像风的形成是空气在空间中非线性…

    2022年6月29日
    33
  • JAVA链表中的回文链表结构

    JAVA链表中的回文链表结构作为一个java初学者,最近遇到了回文链表结构这个难题,经过一番学习总算搞清楚个大概。先来说一下什么是回文链表,会问链表在我们生活中经常能够遇到。会问链表的结构就是例如:1->2->3->2->1。我们将它反转过来还是与原链表相同,这种就称为回文结构。具体方法:1.先找到链表的中间位置2.然后将中间位置的链表反转3.从两边向中间遍历代码如图classNode{publi…

    2022年5月7日
    52
  • OFFSet_offtheroad

    OFFSet_offtheroad#defineoffsetof(s,m)(size_t)&reinterpret_cast<constvolatilechar&>((((s*)0)->m))该宏用于求结构体中一个成员在该结构体中的偏移量。第一个参数是结构体的名字,第二个参数是结构体成员的名字。该宏返回结构体structNames中成员memberName(m)的偏移量。偏移量…

    2022年8月22日
    9
  • 用js来实现那些数据结构02(数组篇02-数组方法)

    上一篇文章简单的介绍了一下js的类型,以及数组的增删方法。这一篇文章,我们一起来看看数组还有哪些用法,以及在实际工作中我们可以用这些方法来做些什么。由于其中有部分内容并不常用,所以我尽量缩小篇幅。在这

    2022年3月25日
    47

发表回复

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

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