上一篇介绍了一下go websocket,这篇blog主要是通过websocket写一个聊天室。
先写前端

</style>
</head>
<body>
<div id="log"></div>
<form id="form"><input type="submit" value="Send" /><input type="text" id="msg" size="64"/>
</form>
</body>
</html>

这里面有三个组件,一个log记录,一个是msg消息发送,一个是发送按钮。下面给这个两个组件添加事件,

<script type="text/javascript">
window.onload = function () {var conn;var msg = document.getElementById("msg");var log = document.getElementById("log");function appendLog(item) {var doScroll = log.scrollTop > log.scrollHeight - log.clientHeight - 1;log.appendChild(item);if (doScroll) {log.scrollTop = log.scrollHeight - log.clientHeight;}}document.getElementById("form").onsubmit = function () {if (!conn) {return false;}if (!msg.value) {return false;}conn.send(msg.value);msg.value = "";return false;};if (window["WebSocket"]) {conn = new WebSocket("ws://" + document.location.host + "/ws");conn.onclose = function (evt) {var item = document.createElement("div");item.innerHTML = "<b>Connection closed.</b>";appendLog(item);};conn.onmessage = function (evt) {var messages = evt.data.split('\n');for (var i = 0; i < messages.length; i++) {var item = document.createElement("div");item.innerText = messages[i];appendLog(item);}};} else {var item = document.createElement("div");item.innerHTML = "<b>Your browser does not support WebSockets.</b>";appendLog(item);}
};
</script>

这个里面先对发送按钮添加事件,每当按下时候执行send,将数据发送到后端;当后端发送数据到前端,就执行appendLog追加内容。好了,介绍完这个就介绍后端。后端里面先介绍主程序

func main() {flag.Parse()hub := newHub()go hub.run()http.HandleFunc("/", serveHome)http.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) {serveWs(hub, w, r)})err := http.ListenAndServe(*addr, nil)if err != nil {log.Fatal("ListenAndServe: ", err)}
}

这个里面hub是一个消息的分发器,就是把消息发送到每个客户端。这个里面把消息广播到每个聊天的client。

func (h *Hub) run() {for {select {case client := <-h.register:h.clients[client] = truecase client := <-h.unregister:if _, ok := h.clients[client]; ok {delete(h.clients, client)close(client.send)}case message := <-h.broadcast:for client := range h.clients {select {case client.send <- message:default:close(client.send)delete(h.clients, client)}}}}
}

还有一个是serverWs的实现

    go client.writePump()go client.readPump()

就是负责client的读和写。

func (c *Client) readPump() {defer func() {c.hub.unregister <- cc.conn.Close()}()c.conn.SetReadLimit(maxMessageSize)c.conn.SetReadDeadline(time.Now().Add(pongWait))c.conn.SetPongHandler(func(string) error { c.conn.SetReadDeadline(time.Now().Add(pongWait)); return nil })for {_, message, err := c.conn.ReadMessage()if err != nil {if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway) {log.Printf("error: %v", err)}break}message = bytes.TrimSpace(bytes.Replace(message, newline, space, -1))c.hub.broadcast <- message}
}

读很简单,通过ReadMessage读取
写也是类似,

func (c *Client) writePump() {ticker := time.NewTicker(pingPeriod)defer func() {ticker.Stop()c.conn.Close()}()for {select {case message, ok := <-c.send:c.conn.SetWriteDeadline(time.Now().Add(writeWait))if !ok {// The hub closed the channel.c.conn.WriteMessage(websocket.CloseMessage, []byte{})return}w, err := c.conn.NextWriter(websocket.TextMessage)if err != nil {return}w.Write(message)// Add queued chat messages to the current websocket message.n := len(c.send)for i := 0; i < n; i++ {w.Write(newline)w.Write(<-c.send)}if err := w.Close(); err != nil {return}case <-ticker.C:c.conn.SetWriteDeadline(time.Now().Add(writeWait))if err := c.conn.WriteMessage(websocket.PingMessage, []byte{}); err != nil {return}}}
}

那么这个聊天室就写好了。

基于go websocket写一个聊天室相关推荐

  1. java 聊天室开源_用java WebSocket做一个聊天室

    最近一个项目中,需要用到Java的websocket新特性,于是就学了一下,感觉这技术还挺好玩的,瞬间知道网页上面的那些在线客服是怎么做的了. 先看图: 实现了多客户机进行实时通讯. 下面看代码项目结 ...

  2. php 利用redis写一个聊天室,使用Redis完成聊天室功能

    Redis提供了Pub/Sub(发布/订阅)模式的消息机制.发布者向指定频道发布消息,订阅了该频道的订阅者就可以获取消息.通过该机制,我们可以完成聊天室.公告牌等功能. 首先,来介绍下关于pub/su ...

  3. WebSocket实现一个聊天室

    相关参考: 阮一峰老师:WebSocket 教程 MDN:WebSocket 简书:nodejs-websocket介绍 文章目录 一.WebSocket 介绍 二.WebSocket 基本使用 2. ...

  4. Springboot+WebSocket实现一个聊天室

    具体步骤 为什么需要 WebSocket? 区别 引入依赖 配置config 客户端 客户端 为什么需要 WebSocket? 因为 HTTP 协议有一个缺陷:通信只能由客户端发起 举例来说,我们想了 ...

  5. php 利用redis写一个聊天室,Redis实现多人多聊天室功能

    本文为大家分享了Redis支持多人多聊天室功能的设计代码,供大家参考,具体内容如下 设计原理 左边的一个数据域,代表两个聊天室,聊天室id分别是827,729 在聊天室827里,有2个人,分别是jas ...

  6. Linux下基于socket和多线程的聊天室小程序

    转载:http://blog.csdn.net/robot__man/article/details/52460733 要求:基于TCP编写,一个聊天室最多100人.  客户端:  1.用户需要登录, ...

  7. 基于Node.js + WebSocket 的简易聊天室

    代码地址如下: http://www.demodashi.com/demo/13282.html Node.js聊天室运行说明 Node.js的本质就是运行在服务端的JavaScript.Node.j ...

  8. javaweb课程设计:基于websocket的网络聊天室(所有的资源和代码还有详细步骤我都会提供)

    1 课程设计目的和任务 本项目的是实现在web应用上进行多人聊天,为以后在大型项目中实现客服在线服务做一个测试,提前了解HTML5新特性,熟练掌握websocket技术. 2 课程设计的主要内容 实现 ...

  9. [源码和文档分享]基于Netty和WebSocket的Web聊天室

    一.背景 伴随着Internet的发展与宽带技术的普及,人们可以通过Internet交换动态数据,展示新产品,与人进行沟通并进行电子商务贸易.作为构成网站的重要组成部分,留言管理系统为人们的交流提供了 ...

  10. workerman-chat(PHP开发的基于Websocket协议的聊天室框架)(thinkphp也是支持socket聊天的)...

    workerman-chat(PHP开发的基于Websocket协议的聊天室框架)(thinkphp也是支持socket聊天的) 一.总结 1.下面链接里面还有一个来聊的php聊天室源码可以学习 2. ...

最新文章

  1. [YTU]_2008( 简单编码)
  2. ALV动态列Demo
  3. latex箭头表示符号
  4. JAVA并发编程学习笔记之CAS操作
  5. webpack --- 发布环境的配置 代码压缩 代码分类
  6. C语言课后习题(21)
  7. exe可执行程序及堆栈分配(转载)
  8. 对python的意思_python的意思
  9. jdbc 连接 mysql 的字符串
  10. 软考计算机网络初级试题答案,2015年下半年中级软考《计算机网络—网络工程师》试题及答案...
  11. 信息安全从业者工作规划及能力建设
  12. 云盘万能钥匙破解去后门版Cracked By 8848
  13. 静态市盈率和动态市盈率
  14. u盘最大单个文件支持多少g_USB 文件传输单个文件最大能用多少G???
  15. 鲁迅朱安:留给世纪的背影
  16. 求最大公约数c语言实验心得,C语言编程实训报告(合集)
  17. 计算机为什么检测不到u盘启动项,电脑无法识别U盘启动BIOS里面找不到U盘启动项...
  18. iOS 蓝牙连接小米手环
  19. 通过需求条目的层次去解决问题
  20. 论文格式之编辑页眉页码

热门文章

  1. 如何修改PDF文件,怎样将PDF文件拆分
  2. me909嵌入式linux,linux4.1.4上移植ME909s-821,MU609 4G模块驱动
  3. 2023年天津天狮学院专升本专业课考试延期的通知
  4. python输出二进制数_Python计算二进制数及输出补码
  5. 数模2019暑期培训Day1
  6. 【Android自动化测试】Robot Framework+adb框架(四)——L2层关键字
  7. oracle表空间缩减操作手册
  8. Java-Preferences用法-入门
  9. 5.Django路由path和re_path详解
  10. OSChina 周一乱弹 ——连自己老婆的双胞胎妹妹都不放过