分享
golang 聊天室
lucifer_qiao · · 6073 次点击 · · 开始浏览这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。
最近看了一些关于golang的资料,发现它的WEBSOCKT实现真起来真的很容易,下面是代码
go.net/websocket是需要安装的,这个自己装上就行
packagemain
import(
"container/list"
"fmt"
"go.net/websocket"
"io"
"net/http"
)
varconnidint
varconns*list.List
funcChat(ws*websocket.Conn){
deferws.Close()
item:=conns.PushBack(ws)
deferconns.Remove(item)
varerrerror
for{
vardatastring
iferr=websocket.Message.Receive(ws,&data);err!=nil{
fmt.Printf("disconnected\n")
break
}
SendMessage(item,fmt.Sprintf("%s",data))
}
}
funcSendMessage(self*list.Element,datastring){
//for_,item:=rangeconns{
foritem:=conns.Front();item!=nil;item=item.Next(){
ws,ok:=item.Value.(*websocket.Conn)
if!ok{
panic("itemnot*websocket.Conn")
}
ifitem==self{
continue
}
io.WriteString(ws,data)
}
}
// 客户端默认显示页面
funcClient(whttp.ResponseWriter,r*http.Request){
html:=`<!doctypehtml>
<html>
<head>
<metahttp-equiv="Content-Type"content="text/html;charset=utf-8"/>
<title>golangwebsocketchatroom</title>
<scriptlanguage="javascript"type="text/javascript">
varsock=null;
varwsuri="ws://192.168.1.163:7878/chat";//这里的IP如果是局域测试的话,需要换成自己的
window.onload=function(){
console.log("onload");
sock=newWebSocket(wsuri);
sock.onopen=function(e){
console.log("connectedto"+wsuri);
}
sock.onclose=function(e){
console.log("connectionclosed("+e.code+")");
}
sock.onmessage=function(e){
console.log("messagereceived:"+e.data);
document.getElementById("list").innerHTML+=e.data;
vardiv=document.getElementById("list")
div.scrollTop=div.scrollHeight;
}
}
functionsend(){
varwho=document.getElementById('who').value;
if(who.length==0){
document.getElementById('who').focus();
return
}
varmsg=document.getElementById('msg').value;
if(msg.length==0){
document.getElementById('msg').focus();
return
}
vardata=who+"say:"+msg+"<br/><br/>";
document.getElementById('msg').value="";
document.getElementById('who').value="";
vardiv=document.getElementById("list")
div.innerHTML+=data;
div.scrollTop=div.scrollHeight;
sock.send(data);
}
</script>
</head>
<body>
<divid="list"style="height:300px;overflow-y:scroll;border:1pxsolid#CCC;">
</div>
<div>
whoareyou
<inputtype="text"id="who"size="60"/>
yourmessage
<inputtype="text"id="msg"size="60"/>
<buttononclick="send()">send</button>
</div>
</body>
</html>`
io.WriteString(w,html)
}
funcmain(){
conns=list.New()
http.Handle("/chat",websocket.Handler(Chat))
http.HandleFunc("/",Client)
err:=http.ListenAndServe(":7878",nil)
iferr!=nil{
panic("ListenAndServe:"+err.Error())
}
}
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信6073 次点击
添加一条新回复
(您需要 后才能回复 没有账号 ?)
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
最近看了一些关于golang的资料,发现它的WEBSOCKT实现真起来真的很容易,下面是代码
go.net/websocket是需要安装的,这个自己装上就行
packagemain
import(
"container/list"
"fmt"
"go.net/websocket"
"io"
"net/http"
)
varconnidint
varconns*list.List
funcChat(ws*websocket.Conn){
deferws.Close()
item:=conns.PushBack(ws)
deferconns.Remove(item)
varerrerror
for{
vardatastring
iferr=websocket.Message.Receive(ws,&data);err!=nil{
fmt.Printf("disconnected\n")
break
}
SendMessage(item,fmt.Sprintf("%s",data))
}
}
funcSendMessage(self*list.Element,datastring){
//for_,item:=rangeconns{
foritem:=conns.Front();item!=nil;item=item.Next(){
ws,ok:=item.Value.(*websocket.Conn)
if!ok{
panic("itemnot*websocket.Conn")
}
ifitem==self{
continue
}
io.WriteString(ws,data)
}
}
// 客户端默认显示页面
funcClient(whttp.ResponseWriter,r*http.Request){
html:=`<!doctypehtml>
<html>
<head>
<metahttp-equiv="Content-Type"content="text/html;charset=utf-8"/>
<title>golangwebsocketchatroom</title>
<scriptlanguage="javascript"type="text/javascript">
varsock=null;
varwsuri="ws://192.168.1.163:7878/chat";//这里的IP如果是局域测试的话,需要换成自己的
window.onload=function(){
console.log("onload");
sock=newWebSocket(wsuri);
sock.onopen=function(e){
console.log("connectedto"+wsuri);
}
sock.onclose=function(e){
console.log("connectionclosed("+e.code+")");
}
sock.onmessage=function(e){
console.log("messagereceived:"+e.data);
document.getElementById("list").innerHTML+=e.data;
vardiv=document.getElementById("list")
div.scrollTop=div.scrollHeight;
}
}
functionsend(){
varwho=document.getElementById('who').value;
if(who.length==0){
document.getElementById('who').focus();
return
}
varmsg=document.getElementById('msg').value;
if(msg.length==0){
document.getElementById('msg').focus();
return
}
vardata=who+"say:"+msg+"<br/><br/>";
document.getElementById('msg').value="";
document.getElementById('who').value="";
vardiv=document.getElementById("list")
div.innerHTML+=data;
div.scrollTop=div.scrollHeight;
sock.send(data);
}
</script>
</head>
<body>
<divid="list"style="height:300px;overflow-y:scroll;border:1pxsolid#CCC;">
</div>
<div>
whoareyou
<inputtype="text"id="who"size="60"/>
yourmessage
<inputtype="text"id="msg"size="60"/>
<buttononclick="send()">send</button>
</div>
</body>
</html>`
io.WriteString(w,html)
}
funcmain(){
conns=list.New()
http.Handle("/chat",websocket.Handler(Chat))
http.HandleFunc("/",Client)
err:=http.ListenAndServe(":7878",nil)
iferr!=nil{
panic("ListenAndServe:"+err.Error())
}
}