近期看了一些关于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 聊天室的更多相关文章

  1. websocket+golang聊天室

    原文地址: http://www.niu12.com/article/3 websocket+golang聊天室 main.go和index.html放在同一目录下 main.go package m ...

  2. Golang聊天室

    一.前期准备 前期准备 需要 import "net"包 IP 类型,其中一个重要的方法是 IP.ParseIP(ipaddr string)来判断是否是合法的 IP 地址 TCP ...

  3. Golang语言快速上手到综合实战高并发聊天室

    需要的联系我:QQ:1844912514 Go是Google开发的一种编译型,可并行化,并具有垃圾回收功能的编程语言.2015,Go迎来了全迸发的一年.时隔一年,回头再看,Go已跻身主流编程语言行列. ...

  4. golang简易版聊天室

    功能需求: 创建一个聊天室,实现群聊和单聊的功能,直接输入为群聊,@某人后输入为单聊 效果图: 群聊:   单聊: 服务端: package main import ( "fmt" ...

  5. go 聊天室简单版总结

    /* * 思路:在登录成功时将用户的id存进在线用户列表中的key value中链接的ws为空,并保存用户的信息. * 当跳转到聊天室时,将用户和聊天室链接的ws存进在线用户列表中的 * 问题:如何在 ...

  6. 网络编程-基于Websocket聊天室(IM)系统

    目录 一.HTML5 - Websocket协议 二.聊天室(IM)系统的设计 2.1.使用者眼中的聊天系统 2.2.开发者眼中的聊天系统 2.3.IM系统的特性 2.4.心跳机制:解决网络的不确定性 ...

  7. 利用Node.js的Net模块实现一个命令行多人聊天室

    1.net模块基本API 要使用Node.js的net模块实现一个命令行聊天室,就必须先了解NET模块的API使用.NET模块API分为两大类:Server和Socket类.工厂方法. Server类 ...

  8. php+websocket搭建简易聊天室实践

    1.前言 公司游戏里面有个简单的聊天室,了解了之后才知道是node+websocket做的,想想php也来做个简单的聊天室.于是搜集各种资料看文档.找实例自己也写了个简单的聊天室. http连接分为短 ...

  9. 基于select的python聊天室程序

    python网络编程具体参考<python select网络编程详细介绍>. 在python中,select函数是一个对底层操作系统的直接访问的接口.它用来监控sockets.files和 ...

随机推荐

  1. Aras Innovator 11 sp2 IE客户端设置

    在上一篇文章<Aras Innovator 11 sp2 安装>后,服务器算是安装好了,还需要在使用的客户端进行设置才可以正常使用Aras Innovator 该篇为IE设置,还有< ...

  2. Python和xml简介

    python提供越来越多的技术来支持xml,本文旨在面向初学利用Python处理xml的读者,以教程的形式介绍一些基本的xml出来概念.前提是读者必须知道一些xml常用术语. 先决条件 本文所有的例子 ...

  3. JQuery动态添加多个tab页标签

    jQuery是一个兼容多浏览器的js库,核心理念是write less,do more(写的更少,做的更多),jQuery使用户能更方便地处理HTML documents.events.实现动画效果, ...

  4. 线段树+扫描线【bzoj1645】[USACO07OPEN]城市的地平线City Horizon

    Description 约翰带着奶牛去都市观光.在落日的余晖里,他们看到了一幢接一幢的摩天高楼的轮廓在地平线 上形成美丽的图案.以地平线为 X 轴,每幢高楼的轮廓是一个位于地平线上的矩形,彼此间可能有 ...

  5. Gauss 消元(模板)

    /* title:Gauss消元整数解/小数解整数矩阵模板 author:lhk time: 2016.9.11 没学vim的菜鸡自己手打了 */ #include<cstdio> #in ...

  6. [HDU1532]Drainage Ditches

    最大流模板题 今天补最大流,先写道模板题,顺便写点对它的理解 最大流问题就是给一个幽香有向图,每一条边有容量,问若从$s$点放水,最多会有多少水流到$t$ 为了解决整个问题,第一步我们当然要找到一条路 ...

  7. 【深搜+set使用学习】POJ3050-Hopscotch

    [题目大意] 给出一个5*5的方格,求出从任意一点出发走6步组成的不同序列数. [思路] dfs的水题,当作set使用方法的初次学习.每次从任意一点出发进行一次dfs,将序列加入set,最后输出set ...

  8. 20162307 实验四 Android程序设计

    实验四 <Android程序设计> 北京电子科技学院(BESTI) 实 验 报 告 课程:程序设计与数据结构 班级:1623 姓名:张韵琪 学号:20162307 指导教师:娄佳鹏老师.王 ...

  9. Java并发(四):happens-before

    happens-before 一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须存在happens-before关系 happen-before原则是JMM中非常重要的原则,它是判断数据是 ...

  10. Java学习笔记(10)

    目前多态情况下不能访问子类特有的成员 如果需要访问子类特有的成员,那么需要进行类型强制转换,转换为子类的类型然后再进行调用 基本数据类型的转换: 小数据类型------------->大数据类型 ...