想了解【Egret】WebSocket的使用说明的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于websocketeof的相关问题,此外,我们还将为您介绍关于ajax与websocket的区
想了解【Egret】 WebSocket 的使用说明的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于websocket eof的相关问题,此外,我们还将为您介绍关于ajax与websocket的区别以及websocket常用使用方式、ajax与websocket的区别以及websocket常用使用方式 介绍、c# – 在.Net Core中将Nexmo连接到Websocket失败(远程方关闭了WebSocket)、Go实战--golang中使用WebSocket实时聊天室(gorilla/websocket、nkovacs/go-socket.io)的新知识。
本文目录一览:- 【Egret】 WebSocket 的使用说明(websocket eof)
- ajax与websocket的区别以及websocket常用使用方式
- ajax与websocket的区别以及websocket常用使用方式 介绍
- c# – 在.Net Core中将Nexmo连接到Websocket失败(远程方关闭了WebSocket)
- Go实战--golang中使用WebSocket实时聊天室(gorilla/websocket、nkovacs/go-socket.io)
【Egret】 WebSocket 的使用说明(websocket eof)
在Egret里可以使用WebSocket ,也可以使用socket.io
首先先深入了解一下 WebSocket 在Egret里的机制,看这篇文章:
主要讲解Egret里使用WebSocket和protoBuf
http://www.cnblogs.com/yangxiao/p/4686729.html
ajax与websocket的区别以及websocket常用使用方式
笔者近期在公司的项目中渐渐的接触了一些比较高级的业务逻辑处理,其中比较有意思的地方就是前端接受后台给与的推送问题。
一般前端与后端的交互主要是使用ajax进行异步操作调用交互,比较有趣的是这种交互方式一般都是单项交互的--
-及前端给后端发出请求后端接受请求后执行操作,即便前端可以接受后端给予的返回值,但是与后端交互的主动权始终是放在前端手里面。
而这样就会遇到两个有意思的问题--
1.前端如果调用的接口后端操作事件过长可能会导致返回操作响应时间过长,如果此时用户单击其他页面的时候就会导致返回操作无法正常解决。
2.如果后端有什么比较重要的问题需要推送给前端消息,这个时候前端是无法接收到的。
面对这两个问题的主流解决办法分别为
针对第一条我们会给整个页面做一个加载中的动画并且锁定住整个页面从而强迫用户等待到整个后端返回值结束后再将页面解锁。
而对于第二点我们就要引入我们今天所讲的websocket这个概念。
一.什么是websocket
websocket协议在2008年诞生,2011年成为国际标准。所有浏览器都已经支持了。
它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。
而他与常规的ajax最大的不同在于他可以双向接受和发送
一.websocket的简单使用
对于我们前端来说websocket的使用方式非常简单,协议标识符是ws
(如果加密,则为wss
),服务器网址就是 URL。我们只需要自己定义一个ws服务就可以了
代码如下
var ws = new WebSocket("URL路径");
ws.onopen = function(evt) {
console.log("打开成功");
ws.send("Hello WORD!");
};
ws.onmessage = function(evt) {
console.log( "Received Message: " + evt.data);
ws.close();
};
ws.onclose = function(evt) {
console.log("服务关闭");
};
如以上代码所示我们成功的创建了一个简单的名字为WS的websocket服务并且想后台定义的路径中发送了一条hello word的简讯并且会在接收到推送的时候打印Received Message
在你的ws服务打开以后会在前端的内一直处于挂起状态,由于现在框架横行,当你的框架或者说前端项目经过node编译或者运行时候你可以把ws服务写在所有页面的模板中就可以让项目只要处于被打开状态就能一直运行
这个时候你需要写接受推送消息即可,判断后端给你推送消息的类型并且做出相应的操作,完全不需要有ajax异步操作等待返回值或者返回值后自己操作时间太长而让用户等待太久的烦恼。而这一技术现在也普遍的用在了
在线聊天室和一些需要接受推送提示的地方。
不过值得注意的是一般情况下如果推送量较为大的话公司会选择一些比较大的云服务来做,比如笔者的公司就是使用的融云服务来做的,等笔者有空的话会专门开一次坑讲一讲融云服务的教程
ajax与websocket的区别以及websocket常用使用方式 介绍
笔者近期在公司的项目中渐渐的接触了一些比较高级的业务逻辑处理,其中比较有意思的地方就是前端接受后台给与的推送问题。
一般前端与后端的交互主要是使用ajax进行异步操作调用交互,比较有趣的是这种交互方式一般都是单项交互的--
-及前端给后端发出请求后端接受请求后执行操作,即便前端可以接受后端给予的返回值,但是与后端交互的主动权始终是放在前端手里面。
而这样就会遇到两个有意思的问题--
1.前端如果调用的接口后端操作事件过长可能会导致返回操作响应时间过长,如果此时用户单击其他页面的时候就会导致返回操作无法正常解决。
2.如果后端有什么比较重要的问题需要推送给前端消息,这个时候前端是无法接收到的。
面对这两个问题的主流解决办法分别为针对第一条我们会给整个页面做一个加载中的动画并且锁定住整个页面从而强迫用户等待到整个后端返回值结束后再将页面解锁。
而对于第二点我们就要引入我们今天所讲的websocket这个概念。
一.什么是websocket
websocket协议在2008年诞生,2011年成为国际标准。所有浏览器都已经支持了。
它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。
而他与常规的ajax最大的不同在于他可以双向接受和发送
一.websocket的简单使用
对于我们前端来说websocket的使用方式非常简单,协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。我们只需要自己定义一个ws服务就可以了
代码如下
var ws = new WebSocket("URL路径"); ws.onopen = function(evt) { console.log("打开成功"); ws.send("Hello WORD!"); }; ws.onmessage = function(evt) { console.log( "Received Message: " + evt.data); ws.close(); }; ws.onclose = function(evt) { console.log("服务关闭"); };
如以上代码所示我们成功的创建了一个简单的名字为WS的websocket服务并且想后台定义的路径中发送了一条hello word的简讯并且会在接收到推送的时候打印Received Message
在你的ws服务打开以后会在前端的内一直处于挂起状态,由于现在框架横行,当你的框架或者说前端项目经过node编译或者运行时候你可以把ws服务写在所有页面的模板中就可以让项目只要处于被打开状态就能一直运行
这个时候你需要写接受推送消息即可,判断后端给你推送消息的类型并且做出相应的操作,完全不需要有ajax异步操作等待返回值或者返回值后自己操作时间太长而让用户等待太久的烦恼。而这一技术现在也普遍的用在了
在线聊天室和一些需要接受推送提示的地方。
不过值得注意的是一般情况下如果推送量较为大的话公司会选择一些比较大的云服务来做,比如笔者的公司就是使用的融云服务来做的,等笔者有空的话会专门开一次坑讲一讲融云服务的教程
总结
以上所述是小编给大家介绍的ajax与websocket的区别以及websocket常用使用方式 介绍,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!
c# – 在.Net Core中将Nexmo连接到Websocket失败(远程方关闭了WebSocket)
截至目前,我只是尝试这个Sample Code(简单地回复了调用者所说的内容),并按照“文档”Here通过Nexmo连接到这个websocket.
我成功地向nexmo发送了一个动作“connect”.在调用Nexmo购买的号码时,它正确地重定向到端点(api / nexmo / socket),如使用断点时所示,但是当它在Echo方法中到达webSocket.ReceiveAsync时它会挂起.
using System; using System.Net.WebSockets; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json.Linq; namespace MyProject.Web.Controllers { [Route("api/[controller]")] [ApiController] public class NexmoController : ControllerBase { private WebSocket _webSocket; [HttpGet("answer")] public IActionResult AnswerHandler() { const string host = "MY_NGROK_URL"; const string locale = "fr-FR"; var nccos = new JArray(); var nccoConnect = new JObject() { { "action","connect" },{ "endpoint",new JArray(new JObject{ { "type","websocket" },{ "uri",$"wss://{host}/api/nexmo/socket"},{ "content-type","audio/l16;rate=16000"},{ "headers",new JObject { { "language",locale },{ "callerID","MY_NUMBER_HARDCODED_WHILE_TESTING" } } } }) } }; nccos.Add(nccoConnect); return Content(nccos.ToString(),"application/json"); } [HttpPost("event")] public IActionResult EventHandler() { return Ok(); } [HttpGet("socket")] public async Task GetAudio() { if (HttpContext.WebSockets.IsWebSocketRequest) { _webSocket = await HttpContext.WebSockets.AcceptWebSocketAsync(); await Echo(HttpContext,_webSocket); } else { HttpContext.Response.StatusCode = 400; } } //copy Paste from the Sample Code private async Task Echo(HttpContext context,WebSocket webSocket) { var buffer = new byte[1024 * 4]; //Breakpoint : ReceiveAsync generates an exception WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer),CancellationToken.None); while (!result.CloseStatus.HasValue) { await webSocket.SendAsync(new ArraySegment<byte>(buffer,result.Count),result.MessageType,result.EndOfMessage,CancellationToken.None); result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer),CancellationToken.None); } await webSocket.CloseAsync(result.CloseStatus.Value,result.CloseStatusDescription,CancellationToken.None); } } }
这里捕到的异常:
System.Net.WebSockets.WebSocketException (0x80004005): The remote
party closed the WebSocket connection without completing the close
handshake. —> System.Net.WebSockets.WebSocketException (0x80004005):
The remote party closed the WebSocket connection without completing
the close handshake.
更多例外:
at System.Net.WebSockets.ManagedWebSocket.ThrowIfEOFUnexpected(Boolean
throwOnPrematureClosure)
at System.Net.WebSockets.ManagedWebSocket.EnsureBufferContainsAsync(Int32
minimumrequiredBytes,CancellationToken cancellationToken,Boolean
throwOnPrematureClosure)
at System.Net.WebSockets.ManagedWebSocket.ReceiveAsyncPrivate[TWebSocketReceiveResultGetter,TWebSocketReceiveResult](Memory`1
payloadBuffer,
TWebSocketReceiveResultGetter resultGetter) at
System.Net.WebSockets.ManagedWebSocket.ReceiveAsyncPrivate[TWebSocketReceiveResultGetter,
TWebSocketReceiveResultGetter resultGetter) at
….Controllers.NexmoController.Echo(HttpContext context,
WebSocket webSocket) in
C:…\Controllers\NexmoController.cs:line
97 at ….Controllers.NexmoController.GetAudio() in
C:…\Controllers\NexmoController.cs:line
68 at lambda_method(Closure,Object ) at
Microsoft.Extensions.Internal.ObjectMethodExecutorAwaitable.Awaiter.GetResult()
at
Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor.AwaitableResultExecutor.Execute(IActionResultTypeMapper
mapper,ObjectMethodExecutor executor,Object controller,Object[]
arguments) at System.Threading.Tasks.ValueTask`1.get_Result() at
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeActionMethodAsync()
at
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeNextActionFilterasync()
at
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ActionExecutedContext
context) at
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State&
next,Scope& scope,Object& state,Boolean& isCompleted) at
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterasync()
at
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter()
at
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext
context) at
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(State& next,
Scope& scope,Boolean& isCompleted) at
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync()
at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync()
at Microsoft.AspNetCore.Routing.EndpointMiddleware.Invoke(HttpContext
httpContext) at
Microsoft.AspNetCore.Routing.EndpointRoutingMiddleware.Invoke(HttpContext
httpContext) at
Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext
context) at
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext
context)
什么想法发生了什么?或者我如何解决这个问题?
我真的不明白这里的问题是什么.
我还尝试检查Websocket的WebSocketState,并将其设置为“Open”.
有关信息,我自己测试了示例代码(websocket回应用户的输入)并且它可以工作.
解决方法
> ngrock不支持websockets(不是免费),所以我们在azure上发布了我们的应用程序.
>我们需要实例化websocket
StartUp而不是我们的控制器(如sample code
listed in the original post).我们已经采用了“Echo”方法
另一个类(更多是为了保持良好的结构)并设置它
静态的.
现在一切正常:)
澄清:ngrock不适用于安全的websockets(wss)
Go实战--golang中使用WebSocket实时聊天室(gorilla/websocket、nkovacs/go-socket.io)
生命不止,继续 go go go!!!
其实,早就应该跟大家分享golang中关于websocket的使用,但是一直不知道从何入手,也不能够很清晰的描述出来。
今天就浅尝辄止,通过第三方库实现websocket。
WebSocket
WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。
WebSocket通信协议于2011年被IETF定为标准RFC 6455,并被RFC7936所补充规范。
WebSocket协议支持(在受控环境中运行不受信任的代码的)客户端与(选择加入该代码的通信的)远程主机之间进行全双工通信。用于此的安全模型是Web浏览器常用的基于原始的安全模式。 协议包括一个开放的握手以及随后的TCP层上的消息帧。 该技术的目标是为基于浏览器的、需要和服务器进行双向通信的(服务器不能依赖于打开多个HTTP连接(例如,使用XMLHttpRequest或iframe和长轮询))应用程序提供一种通信机制。
gorilla/websocket
A WebSocket implementation for Go.
github地址:
https://github.com/gorilla/websocket
Star: 4307
获取:
go get github.com/gorilla/websocket
Server
其中,用到了satori/go.uuid:
Go实战–golang生成uuid(The way to go)
server.go
package main import ( "encoding/json" "fmt" "net/http" "github.com/gorilla/websocket" "github.com/satori/go.uuid" ) type ClientManager struct { clients map[*Client]bool broadcast chan []byte register chan *Client unregister chan *Client } type Client struct { id string socket *websocket.Conn send chan []byte } type Message struct { Sender string `json:"sender,omitempty"` Recipient string `json:"recipient,omitempty"` Content string `json:"content,omitempty"` } var manager = ClientManager{ broadcast: make(chan []byte),register: make(chan *Client),unregister: make(chan *Client),clients: make(map[*Client]bool),} func (manager *ClientManager) start() { for { select { case conn := <-manager.register: manager.clients[conn] = true jsonMessage,_ := json.Marshal(&Message{Content: "/A new socket has connected."}) manager.send(jsonMessage,conn) case conn := <-manager.unregister: if _,ok := manager.clients[conn]; ok { close(conn.send) delete(manager.clients,conn) jsonMessage,_ := json.Marshal(&Message{Content: "/A socket has disconnected."}) manager.send(jsonMessage,conn) } case message := <-manager.broadcast: for conn := range manager.clients { select { case conn.send <- message: default: close(conn.send) delete(manager.clients,conn) } } } } } func (manager *ClientManager) send(message []byte,ignore *Client) { for conn := range manager.clients { if conn != ignore { conn.send <- message } } } func (c *Client) read() { defer func() { manager.unregister <- c c.socket.Close() }() for { _,message,err := c.socket.ReadMessage() if err != nil { manager.unregister <- c c.socket.Close() break } jsonMessage,_ := json.Marshal(&Message{Sender: c.id,Content: string(message)}) manager.broadcast <- jsonMessage } } func (c *Client) write() { defer func() { c.socket.Close() }() for { select { case message,ok := <-c.send: if !ok { c.socket.WriteMessage(websocket.CloseMessage,[]byte{}) return } c.socket.WriteMessage(websocket.TextMessage,message) } } } func main() { fmt.Println("Starting application...") go manager.start() http.HandleFunc("/ws",wsPage) http.ListenAndServe(":12345",nil) } func wsPage(res http.ResponseWriter,req *http.Request) { conn,error := (&websocket.Upgrader{CheckOrigin: func(r *http.Request) bool { return true }}).Upgrade(res,req,nil) if error != nil { http.NotFound(res,req) return } client := &Client{id: uuid.NewV4().String(),socket: conn,send: make(chan []byte)} manager.register <- client go client.read() go client.write() }
Go Client
package main import ( "flag" "fmt" "net/url" "time" "github.com/gorilla/websocket" ) var addr = flag.String("addr","localhost:12345","http service address") func main() { u := url.URL{Scheme: "ws",Host: *addr,Path: "/ws"} var dialer *websocket.Dialer conn,_,err := dialer.Dial(u.String(),nil) if err != nil { fmt.Println(err) return } go timeWriter(conn) for { _,err := conn.ReadMessage() if err != nil { fmt.Println("read:",err) return } fmt.Printf("received: %s\n",message) } } func timeWriter(conn *websocket.Conn) { for { time.Sleep(time.Second * 2) conn.WriteMessage(websocket.TextMessage,[]byte(time.Now().Format("2006-01-02 15:04:05"))) } }
HTML Client
test_websocket.html
<html> <head> <title>Golang Chat</title> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> <script type="text/javascript"> $(function() { var conn; var msg = $("#msg"); var log = $("#log"); function appendLog(msg) { var d = log[0] var doScroll = d.scrollTop == d.scrollHeight - d.clientHeight; msg.appendTo(log) if (doScroll) { d.scrollTop = d.scrollHeight - d.clientHeight; } } $("#form").submit(function() { if (!conn) { return false; } if (!msg.val()) { return false; } conn.send(msg.val()); msg.val(""); return false }); if (window["WebSocket"]) { conn = new WebSocket("ws://localhost:12345/ws"); conn.onclose = function(evt) { appendLog($("<div><b>Connection Closed.</b></div>")) } conn.onmessage = function(evt) { appendLog($("<div/>").text(evt.data)) } } else { appendLog($("<div><b>WebSockets Not Support.</b></div>")) } }); </script> <style type="text/css"> html { overflow: hidden; } body { overflow: hidden; padding: 0; margin: 0; width: 100%; height: 100%; background: gray; } #log { background: white; margin: 0; padding: 0.5em 0.5em 0.5em 0.5em; position: absolute; top: 0.5em; left: 0.5em; right: 0.5em; bottom: 3em; overflow: auto; } #form { padding: 0 0.5em 0 0.5em; margin: 0; position: absolute; bottom: 1em; left: 0px; width: 100%; overflow: hidden; } </style> </head> <body> <div id="log"></div> <form id="form"> <input type="submit" value="发送" /> <input type="text" id="msg" size="64"/> </form> </body> </html>
运行:
运行server,运行client,浏览器打开html文件:
实时聊天室
下面分享一个基于websocket的实时聊天室:
https://github.com/scotch-io/go-realtime-chat
main.go:
package main import ( "log" "net/http" "github.com/gorilla/websocket" ) var clients = make(map[*websocket.Conn]bool) // connected clients var broadcast = make(chan Message) // broadcast channel // Configure the upgrader var upgrader = websocket.Upgrader{ CheckOrigin: func(r *http.Request) bool { return true },} // Define our message object type Message struct { Email string `json:"email"` Username string `json:"username"` Message string `json:"message"` } func main() { // Create a simple file server fs := http.FileServer(http.Dir("../public")) http.Handle("/",fs) // Configure websocket route http.HandleFunc("/ws",handleConnections) // Start listening for incoming chat messages go handleMessages() // Start the server on localhost port 8000 and log any errors log.Println("http server started on :8000") err := http.ListenAndServe(":8000",nil) if err != nil { log.Fatal("ListenAndServe: ",err) } } func handleConnections(w http.ResponseWriter,r *http.Request) { // Upgrade initial GET request to a websocket ws,err := upgrader.Upgrade(w,r,nil) if err != nil { log.Fatal(err) } // Make sure we close the connection when the function returns defer ws.Close() // Register our new client clients[ws] = true for { var msg Message // Read in a new message as JSON and map it to a Message object err := ws.ReadJSON(&msg) if err != nil { log.Printf("error: %v",err) delete(clients,ws) break } // Send the newly received message to the broadcast channel broadcast <- msg } } func handleMessages() { for { // Grab the next message from the broadcast channel msg := <-broadcast // Send it out to every client that is currently connected for client := range clients { err := client.WriteJSON(msg) if err != nil { log.Printf("error: %v",err) client.Close() delete(clients,client) } } } }
app.js:
new Vue({ el: '#app',data: { ws: null,// Our websocket newMsg: '',// Holds new messages to be sent to the server chatContent: '',// A running list of chat messages displayed on the screen email: null,// Email address used for grabbing an avatar username: null,// Our username joined: false // True if email and username have been filled in },created: function() { var self = this; this.ws = new WebSocket('ws://' + window.location.host + '/ws'); this.ws.addEventListener('message',function(e) { var msg = JSON.parse(e.data); self.chatContent += '<div>' + '<img src="' + self.gravatarURL(msg.email) + '">' // Avatar + msg.username + '</div>' + emojione.toImage(msg.message) + '<br/>'; // Parse emojis var element = document.getElementById('chat-messages'); element.scrollTop = element.scrollHeight; // Auto scroll to the bottom }); },methods: { send: function () { if (this.newMsg != '') { this.ws.send( JSON.stringify({ email: this.email,username: this.username,message: $('<p>').html(this.newMsg).text() // Strip out html } )); this.newMsg = ''; // Reset newMsg } },join: function () { if (!this.email) { Materialize.toast('You must enter an email',2000); return } if (!this.username) { Materialize.toast('You must choose a username',2000); return } this.email = $('<p>').html(this.email).text(); this.username = $('<p>').html(this.username).text(); this.joined = true; },gravatarURL: function(email) { return 'http://www.gravatar.com/avatar/' + CryptoJS.MD5(email); } } });
index.html:
<!DOCTYPE html> <html lang="en"> <head> <Meta charset="UTF-8"> <title>Simple Chat</title> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.97.8/css/materialize.min.css"> <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/emojione/2.2.6/assets/css/emojione.min.css"/> <link rel="stylesheet" href="/style.css"> </head> <body> <header> <nav> <div class="nav-wrapper"> <a href="/" class="brand-logo right">Simple Chat</a> </div> </nav> </header> <main id="app"> <div class="row"> <div class="col s12"> <div class="card horizontal"> <div id="chat-messages" class="card-content" v-html="chatContent"> </div> </div> </div> </div> <div class="row" v-if="joined"> <div class="input-field col s8"> <input type="text" v-model="newMsg" @keyup.enter="send"> </div> <div class="input-field col s4"> <button class="waves-effect waves-light btn" @click="send"> <i class="material-icons right">chat</i> Send </button> </div> </div> <div class="row" v-if="!joined"> <div class="input-field col s8"> <input type="email" v-model.trim="email" placeholder="Email"> </div> <div class="input-field col s8"> <input type="text" v-model.trim="username" placeholder="Username"> </div> <div class="input-field col s4"> <button class="waves-effect waves-light btn" @click="join()"> <i class="material-icons right">done</i> Join </button> </div> </div> </main> <footer class="page-footer"> </footer> <script src="https://unpkg.com/vue@2.1.3/dist/vue.min.js"></script> <script src="https://cdn.jsdelivr.net/emojione/2.2.6/lib/js/emojione.min.js"></script> <script src="https://code.jquery.com/jquery-2.1.1.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/md5.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.97.8/js/materialize.min.js"></script> <script src="/app.js"></script> </body> </html>
style.css:
body { display: flex; min-height: 100vh; flex-direction: column; } main { flex: 1 0 auto; } #chat-messages { min-height: 10vh; height: 60vh; width: 100%; overflow-y: scroll; }
nkovacs/go-socket.io
github地址:
https://github.com/nkovacs/go-socket.io
获取:
go get github.com/nkovacs/go-socket.io
main.go
package main import ( "log" "net/http" "github.com/nkovacs/go-socket.io" ) func main() { server,err := socketio.NewServer(nil) if err != nil { log.Fatal(err) } server.On("connection",func(so socketio.socket) { log.Println("on connection") so.Join("chat") so.On("chat message",func(msg string) { log.Println("emit:",so.Emit("chat message",msg)) so.broadcastTo("chat","chat message",msg) }) so.On("disconnection",func() { log.Println("on disconnect") }) }) server.On("error",func(so socketio.socket,err error) { log.Println("error:",err) }) http.Handle("/socket.io/",server) http.Handle("/",http.FileServer(http.Dir("./public"))) log.Println("Serving at localhost:12345...") log.Fatal(http.ListenAndServe(":12345",nil)) }
index.html
<!doctype html> <html> <head> <title>Socket.IO chat</title> <style> * { margin: 0; padding: 0; Box-sizing: border-Box; } body { font: 13px Helvetica,Arial; } form { background: #000; padding: 3px; position: fixed; bottom: 0; width: 100%; } form input { border: 0; padding: 10px; width: 90%; margin-right: .5%; } form button { width: 9%; background: rgb(130,224,255); border: none; padding: 10px; } #messages { list-style-type: none; margin: 0; padding: 0; } #messages li { padding: 5px 10px; } #messages li:nth-child(odd) { background: #eee; } </style> </head> <body> <ul id="messages"></ul> <form action=""> <input id="m" autocomplete="off" /><button>Send</button> </form> <script> var socket = io(); $('form').submit(function(){ socket.emit('chat message',$('#m').val()); $('#m').val(''); return false; }); socket.on('chat message',function(msg){ $('#messages').append($('<li>').text(msg)); }); </script> </body> </html>
浏览器输入:
http://localhost:12345/
今天关于【Egret】 WebSocket 的使用说明和websocket eof的介绍到此结束,谢谢您的阅读,有关ajax与websocket的区别以及websocket常用使用方式、ajax与websocket的区别以及websocket常用使用方式 介绍、c# – 在.Net Core中将Nexmo连接到Websocket失败(远程方关闭了WebSocket)、Go实战--golang中使用WebSocket实时聊天室(gorilla/websocket、nkovacs/go-socket.io)等更多相关知识的信息可以在本站进行查询。
本文标签: