GOLANG和websocket 写的简易聊天室

main.go

package main

import (
	"fmt"
	"net/http"
	"time"

	"golang.org/x/net/websocket"
)

type Connect struct {
	wc *websocket.Conn
	sc chan []byte
}

var H = make(map[*Connect]bool, 2)

func (c *Connect) writer() {
	for msg := range c.sc {

		fmt.Printf("%#v\n", c.sc)

		c.wc.Write(msg)

	}
}

func (c *Connect) reader() {
	for range time.NewTicker(time.Second).C {

		buf := make([]byte, 1500)
		n, err := c.wc.Read(buf)
		if err != nil {
			fmt.Println(err)
		}

		fmt.Println(string(buf[:n]))
		if len(string(buf[:n])) < 1 {
			continue
		}

		for conn := range H {
			// fmt.Printf("%#v\n", conn)
			conn.sc <- buf[:n]
		}

	}
}

func msg(wc *websocket.Conn) {

	c := &Connect{
		wc: wc,
		sc: make(chan []byte),
	}

	// H = Hub{r: make(chan *Connect, 100)}

	if c.wc != nil {
		H[c] = true
	}

	go c.writer()
	c.reader()
}

func main() {

	http.Handle("/", http.FileServer(http.Dir("./")))

	http.Handle("/msg", websocket.Handler(msg))

	fmt.Println("start server at 8081")

	http.ListenAndServe(":8081", nil)
}

index.html

<html>
    <head>
        <title>socket test</title>
    </head>

    <script>
        const socket = new WebSocket(`ws://${window.location.host}/msg`);

        socket.onmessage = e => {
            document.getElementById("msg").innerHTML += e.data + "<br />";
        }
        
        function submit() {
            let inputmsg  = document.getElementById("name").value +"说:" +document.getElementById("input").value;

            console.log(inputmsg)

            socket.send(inputmsg)
        }
    </script>

    <body>
        <div> Name:<input type="text" id="name" value="小明" /> </div>
        <div> Massage:<input type="text" id="input" /> <input type="submit" onclick="submit()"> </div>
        Content:

        <div id="msg"></div>
        
    </body>
</html>

在这里插入图片描述
技术支持:
http://www.qiaihua.com

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值