golang聊天室

clnchanpin clnchanpin     2022-09-13     679

关键词:

近期看了一些关于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
")
            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一个简单的命令行聊天室,如irc(代码片段)

查看详情

golang✔️实战✔️聊天室☢️建议手收藏☢️(代码片段)

【Golang】✔️实战✔️聊天室☢️建议手收藏☢️概述服务端实现客户端实现日志概述今天我们会结合之前几节课的知识来综合实战一下,实现一个聊天室.服务端实现运行的时候我们可以开启一个服务端和N个客户端,来实现聊天... 查看详情

golang✔️实战✔️聊天室☢️建议手收藏☢️(代码片段)

【Golang】✔️实战✔️聊天室☢️建议手收藏☢️概述服务端实现客户端实现日志概述今天我们会结合之前几节课的知识来综合实战一下,实现一个聊天室.服务端实现运行的时候我们可以开启一个服务端和N个客户端,来实现聊天... 查看详情

golang网络聊天室案例(代码片段)

1.聊天室设计分析一.概览实现个网络聊天室(群)功能分析:上线下线聊天,其他人,自己都可以看到聊天消息查询当前聊天室用户名字who可以修改自己名字rename|Duke超时踢出技术点分析:1.socktcp编程2.map... 查看详情

golang网络聊天室案例(代码片段)

1.聊天室设计分析一.概览实现个网络聊天室(群)功能分析:上线下线聊天,其他人,自己都可以看到聊天消息查询当前聊天室用户名字who可以修改自己名字rename|Duke超时踢出技术点分析:1.socktcp编程2.map... 查看详情

golang之写一个聊天室

1.海量用户在线聊天系统2.点对点聊天3.用户登录&注册一、服务端开发1.用户管理用户id:数字用户密码:字母数字组合用户昵称:用来显示用户性别:字符串用户头像:url用户上线登录时间:字符串用户是否在线:online数据存... 查看详情

如何创建 golang 网络套接字聊天?

】如何创建golang网络套接字聊天?【英文标题】:Howtocreategolangwebsocketchat?【发布时间】:2015-03-2321:39:50【问题描述】:下午好。如何创建一个能够向选定用户发送消息的golangwebsocket聊天,而不是全部?【问题讨论】:在这里进... 查看详情

golang之一个简单的聊天机器人

翠花,上代码packagemainimport("bufio""fmt""os""strings")funcmain(){//从标准输入读取数据inputReader:=bufio.NewReader(os.Stdin)fmt.Println("Pleaseinputyourname:")//读取数据直到遇见 位置input,err:=inputReader.ReadString(‘ ‘)if 查看详情

golang的聊天服务器实践(群聊,广播)

...有用户的加入(除了第一个加入的用户),每个人说话就像聊天室一样,房间里的所有人都能看到。由于接收tcp 查看详情

Eventsource golang:如何检测客户端断开连接?

...015-11-1409:48:12【问题描述】:我正在开发基于Twitter标签的聊天室,其中包含服务器发送的事件,包https://github.com/antage/eventsource我有一个关于客户端断开连接的问题。我运行了一个gorout 查看详情

golang的缓冲channel和无缓冲channel的区别

...的时候你并不知道要同时并发多少goroutine,比如一个在线聊天室,我不知道有多少人会同时登录发消息,那么我就要比如make1000个chan作为缓冲有些情况下,程序里面的并发是你自己设计的,并且你知道确切的数量,这时候你就不... 查看详情

golang从入门到放弃

目录:1、Golang搭建Windows开发环境。 tcp聊天软件开发:2、TCP监听服务器搭建。3、TCP服务器监听用户上线。4、TCP服务器群聊消息。5、TCP服务器用户修改名字、查询用户在线以及私聊功能6、TCP客户端命令行解析,根据... 查看详情

有没有办法用golang将PDF转换为jpeg?

】有没有办法用golang将PDF转换为jpeg?【英文标题】:IsthereanywayconvertingaPDFtojpegwithgolang?【发布时间】:2019-09-2411:12:07【问题描述】:我目前正在将我的“旧”基于Python的聊天机器人重写为golang。我遇到的一个问题是我无法将PDF转... 查看详情

进一步认识golang中的并发

如果你成天与编程为伍,那么并发这个名词对你而言一定特别耳熟。需要并发的场景太多了,例如一个聊天程序,如果你想让这个聊天程序能够同时接收信息和发送信息,就一定会用到并发,无论那是什么样的并发。 并发的... 查看详情

go基础2

//https://tour.golang.orgpackagemain// 模块导入import( "fmt" "math" "runtime" "time") // redis支持“发布/订阅”的消息模式,可以基于此构建聊天室等系统// redis贡献者之一,使用该模式开发的聊天室的例子,h 查看详情

golang学习十:网络编程(代码片段)

...2.获取文件属性:3.客户端实现4.服务端实现:四、示例-并发聊天室:1模块简述2.广播用户上线3.广播用户消息4.展示在线用户:5.修改用户名:5.用户退出与超时处理:一、网络协议:1.典型协议:传输层:常见协议有TCP/UDP协议;应用层:常见的... 查看详情

gocn每日新闻(2019-10-24)

.../juejin.im/entry/5db018c3f265da4d4a30569e5.[译]用Golang编写一个简易聊天室 https://juejin.im/post/5dafb4435188256290692f05 第二季gohack黑客马拉松来啦! http://gohack2019.sxl.cn/ 编辑:崔广章订阅新闻: http://tinyletter.com/gocn  查看详情

聊天应用程序:成功重新连接到 WebSocket 服务器后该怎么办?

...天应用程序。我负责客户端(React+Redux)。服务端用的是golang(不知道这个组合好不好用,只是好 查看详情