golang 聊天室
近期看了一些关于golang的资料。发现它的WEBSOCKT实现真起来真的非常easy。以下是代码
go.net/websocket是须要安装的,这个自己装上即可
package main
import (
"container/list"
"fmt"
"go.net/websocket"
"io"
"net/http"
)
var connid int
var conns *list.List
func Chat(ws *websocket.Conn) {
defer ws.Close()
item := conns.PushBack(ws)
defer conns.Remove(item)
var err error
for {
var data string
if err = websocket.Message.Receive(ws, &data); err != nil {
fmt.Printf("disconnected\n")
break
}
SendMessage(item, fmt.Sprintf("%s", data))
}
}
func SendMessage(self *list.Element, data string) {
//for _, item := range conns {
for item := conns.Front(); item != nil; item = item.Next() {
ws, ok := item.Value.(*websocket.Conn)
if !ok {
panic("item not *websocket.Conn")
}
if item == self {
continue
}
io.WriteString(ws, data)
}
}
// client默认显示页面
func Client(w http.ResponseWriter, r *http.Request) {
html := `<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>golang websocket chatroom</title>
<script language="javascript"type="text/javascript">
var sock=null;
var wsuri ="ws://192.168.1.163:7878/chat"; //这里的IP假设是局域測试的话。须要换成自己的
window.onload = function(){
console.log("onload");
sock = new WebSocket(wsuri);
sock.onopen=function(e){
console.log("connected to "+wsuri);
}
sock.onclose=function(e){
console.log("connection closed (" + e.code + ")");
}
sock.onmessage=function(e){
console.log("message received: " + e.data);
document.getElementById("list").innerHTML += e.data;
var div = document.getElementById("list")
div.scrollTop = div.scrollHeight;
}
}
function send () {
var who = document.getElementById('who').value;
if (who.length == 0){
document.getElementById('who').focus();
return
}
var msg = document.getElementById('msg').value;
if (msg.length == 0){
document.getElementById('msg').focus();
return
}
var data = who + " say: " + msg + "<br/><br/>";
document.getElementById('msg').value="";
document.getElementById('who').value="";
var div = document.getElementById("list")
div.innerHTML += data;
div.scrollTop = div.scrollHeight;
sock.send(data);
}
</script>
</head>
<body>
<div id="list" style="height: 300px;overflow-y: scroll;border: 1px solid #CCC;">
</div>
<div>
who are you
<input type="text" id="who" size="60" />
your message
<input type="text" id="msg" size="60" />
<button onclick="send()">send</button>
</div>
</body>
</html>`
io.WriteString(w, html)
}
func main() {
conns = list.New()
http.Handle("/chat", websocket.Handler(Chat))
http.HandleFunc("/", Client)
err := http.ListenAndServe(":7878", nil)
if err != nil {
panic("ListenAndServe: " + err.Error())
}
}
golang 聊天室的更多相关文章
- websocket+golang聊天室
原文地址: http://www.niu12.com/article/3 websocket+golang聊天室 main.go和index.html放在同一目录下 main.go package m ...
- Golang聊天室
一.前期准备 前期准备 需要 import "net"包 IP 类型,其中一个重要的方法是 IP.ParseIP(ipaddr string)来判断是否是合法的 IP 地址 TCP ...
- Golang语言快速上手到综合实战高并发聊天室
需要的联系我:QQ:1844912514 Go是Google开发的一种编译型,可并行化,并具有垃圾回收功能的编程语言.2015,Go迎来了全迸发的一年.时隔一年,回头再看,Go已跻身主流编程语言行列. ...
- golang简易版聊天室
功能需求: 创建一个聊天室,实现群聊和单聊的功能,直接输入为群聊,@某人后输入为单聊 效果图: 群聊: 单聊: 服务端: package main import ( "fmt" ...
- go 聊天室简单版总结
/* * 思路:在登录成功时将用户的id存进在线用户列表中的key value中链接的ws为空,并保存用户的信息. * 当跳转到聊天室时,将用户和聊天室链接的ws存进在线用户列表中的 * 问题:如何在 ...
- 网络编程-基于Websocket聊天室(IM)系统
目录 一.HTML5 - Websocket协议 二.聊天室(IM)系统的设计 2.1.使用者眼中的聊天系统 2.2.开发者眼中的聊天系统 2.3.IM系统的特性 2.4.心跳机制:解决网络的不确定性 ...
- 利用Node.js的Net模块实现一个命令行多人聊天室
1.net模块基本API 要使用Node.js的net模块实现一个命令行聊天室,就必须先了解NET模块的API使用.NET模块API分为两大类:Server和Socket类.工厂方法. Server类 ...
- php+websocket搭建简易聊天室实践
1.前言 公司游戏里面有个简单的聊天室,了解了之后才知道是node+websocket做的,想想php也来做个简单的聊天室.于是搜集各种资料看文档.找实例自己也写了个简单的聊天室. http连接分为短 ...
- 基于select的python聊天室程序
python网络编程具体参考<python select网络编程详细介绍>. 在python中,select函数是一个对底层操作系统的直接访问的接口.它用来监控sockets.files和 ...
随机推荐
- Interllij IDEA 使用Git工具
1.git简介 git是目前流行的分布式版本管理系统.它拥有两套版本库,本地库和远程库,在不进行合并和删除之类的操作时这两套版本库互不影响.也因此其近乎所有的操作都是本地执行,所以在断网的情况下任然可 ...
- HDU 6373 Pinball
Pinball Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total S ...
- 【java回调】同步/异步回调机制的原理和使用方法
回调(callback)在我们做工程过程中经常会使用到,今天想整理一下回调的原理和使用方法. 回调的原理可以简单理解为:A发送消息给B,B处理完后告诉A处理结果.再简单点就是A调用B,B调用A. 那么 ...
- BZOJ 2225 [Spoj 2371]Another Longest Increasing(CDQ分治)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2225 [题目大意] 给定N个数对(xi,yi),求最长上升子序列的长度. 上升序列定义 ...
- 【构造】【贪心】hdu6090 Rikka with Graph
给你n个点,让你连m条边,使得任意两两点对之间的最短路的和最小(两点若不可达,最短路记作n). 初始时ans=n*n*(n-1). 先尽量连成菊花图,每连一次让答案减小2*((n-2)*(i-1)+( ...
- 【拓扑排序】CDOJ1635 琵琶弦上说相思,当时明月在,曾照彩云归
对于两个相邻的字符串 Si和Si+1 ,如果它们的前k-1位都相同,第k位不相同,那么,在字典序中 Si,k一定在 Si+1,k前面 建立有向边从 Si,k到 Si+1,k,进行拓扑排序 为了保证字典 ...
- mongodb安装和配置,遇到问题和解决方法
自己不知道怎么的,心血来潮想重新来安装和配置一下mongodb,之前自己也是按照别人的来整的,印象不深刻.第二遍安装配置遇到很多问题. 弄了两个多小时,期间遇到很多问题: 遇到的主要问题 1.拒绝访问 ...
- LOG收集系统(一):原日志至收集
Date: 20140207Auth: Jin 设置一个LOG收集系统1. 收集原生(不解析,不压缩)的业务日志和WEB日志(NGINX,PHP)2. 提供给开发,测试直接阅读和下载 需求分析原生日志 ...
- Ubuntu 16.04/CentOS 6.9安装Node.js 6.9.5
Ubuntu: CentOS: wget https://nodejs.org/dist/v6.9.5/node-v6.9.5-linux-x64.tar.xz tar -xvf node-v6.9. ...
- httpWebRequest 文件下载
服务版本: go file system ssdb github: https://github.com/dtxlink/gfs 上一篇: 一个 go 文件服务器 ssdb 通过 httpWebReq ...