近期看了一些关于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. 错误:在maven install是抛出 “1.5不支持diamond运算符,请使用source 7或更高版本以启用diamond运算符”

    Maven默认用的是JDK1.5去编译 diamond运算符,有的书翻译为菱形,有的书写的是钻石语法,指的是JDK1.7的一个新特性 List<String> list = new Arr ...

  2. Windows10 Docker加速

    参考地址:https://blog.csdn.net/wanderlustlee/article/details/80216588 在刚开始使用时,有可能因为网络的问题导致整个镜像的下载过程不是太顺畅 ...

  3. Ionic-wechat项目边开发边学(四):可伸缩输入框,下拉刷新, 置顶删除

    摘要 上一篇文章主要介绍了ion-list的使用, ion-popup的使用, 通过sass自定义样式, localStorage的使用, 自定义指令和服务. 这篇文章实现的功能有消息的置顶与删除, ...

  4. 嵌套循环连接(Nested Loops Joins)

    The nested loops join, also called nested iteration, uses one join input as the outer input table(sh ...

  5. [hdu-4946] Area of Mushroom 计算几何 凸包

    大致题意: 平面上有n个人,给你每个人的坐标和一个速度v,如果某个人比其他所有人都先到达某点,则该点就被这个人掌控,求谁掌控者无限大的面积. 首先 速度最大的人,抛弃其他人,速度小的人必定无法得到无限 ...

  6. 【HDU 5730】Shell Necklace

    http://acm.hdu.edu.cn/showproblem.php?pid=5730 分治FFT模板. DP:\(f(i)=\sum\limits_{j=0}^{i-1}f(j)\times ...

  7. JZYZOJ1384 种花小游戏 状压dp

    http://172.20.6.3/Problem_Show.asp?id=1384  最开始以为是dfs然后超时了,然后调了半天调成dp,还不如再写一遍... 代码 #include<iost ...

  8. bzoj 2286(虚树+树形dp) 虚树模板

    树链求并又不会写,学了一发虚树,再也不虚啦~ 2286: [Sdoi2011]消耗战 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 5002  Sol ...

  9. hdu 5755(Gauss 消元) &poj 2947

    Gambler Bo Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Tota ...

  10. AGC 020 B - Ice Rink Game

    题面在这里! 倒着维护可以取的范围区间,判一下可不可能无解即可. #include<bits/stdc++.h> #define ll long long using namespace ...