이 름 : 바다아이
|
조회수 : 14606
짧은 주소 : https://www.bada-ie.com/su/?341591827896
https://socket.io/ 를 이용한 간단한 golang 채팅입니다.
그럭 잘 됩니다. 날린 코드니까 필요한 부분 정리하시고요..
흐름이 이렇다는 것만 아시면 됩니다. 살 붙이고 수정하는 것은 각자 몫...
응용만 잘 하시면 채팅 뿐이 아니라 더한 것도 가능하겠죠...
https://github.com/graarh/golang-socketio 하고
https://socket.io/ 여기 가셔서 여러가지 더 공부해 보세요...
golang 자체 패키지 웹소켓을 이용해서 작업할 수도 있는데
브라우저 버전마다 호환성 문제를 생각하면 당분간은 socket.io 를 이용하는 것이 나을 듯 싶습니다.
그래서 socket.io 를 이용해서 golang 으로 작업했습니다.
원래 nodejs 용인데 golang 에서도 쓸 수 있습니다.
이건 브라우저 호환은 다 되요...
그리고 실제 서비스에서는 접속자 리스트 같은 것은 sync.Mutex 등으로 lock 거셔야 합니다.
동접 부분이 있기 때문입니다. 참고하세요...
그리고 html 태그나 스크립트 같은 것은 escape 이용해서 적당히 막아야 겠죠..
서버에 필요한 golang 패키지는 go get 으로 가져오시고
아래 socket.io 에서 cdnjs url 로 링크된 부분이 느리면 해당 사이트에서 받으세요...
서버
package main
import (
"log""net/http""github.com/graarh/golang-socketio""github.com/graarh/golang-socketio/transport"
)
var listman map[string]string
var listman2 string
funcgetlist() string {
listman3 := ""for key, _ := range listman {
listman3 += key + "<br>"
}
return listman3
}
funcmain() {
listman = make(map[string]string)
server := gosocketio.NewServer(transport.GetDefaultWebsocketTransport())
type Messagestruct{
// 클라이언트 부분과 json 이름이 동일한지 잘 확인 하셔야 합니다.Clist string `json:"clist"`
Message string `json:"message"`
}
//handle connected
server.On(gosocketio.OnConnection, func(c *gosocketio.Channel) {
log.Println("New client connected")
//join them to roomc.Join("chat")
listman[c.Id()] = ""
listman2 = getlist()
str := Message{Clist: listman2, Message: "<br>--- <font color='red'>" + c.Id() +
"</font> 님이 들어오셨습니다.---<br>"}
c.BroadcastTo("chat", "message", str)
})
server.On(gosocketio.OnDisconnection, func(c *gosocketio.Channel) {
//caller is not necessary, client will be removed from rooms//automatically on disconnect//but you can remove client from room whenever you need toc.Leave("chat")
delete(listman, c.Id())
listman2 = getlist()
str := Message{Clist: listman2, Message: "<br>--- <font color='blue'>" + c.Id() +
"</font> 님이 나가셨습니다.---<br>"}
c.BroadcastTo("chat", "message", str)
log.Println("Disconnected")
})
//error catching handler
server.On(gosocketio.OnError, func(c *gosocketio.Channel) {
log.Println("Error occurs")
})
//handle custom event
server.On("send", func(c *gosocketio.Channel, msg Message) string {
msg.Clist = listman2
msg.Message = c.Id() + " :: <font color='green'>" + msg.Message + "</font>"// 전체가 아닌 접속한 소켓 아이디 한 사람에게만 메세지// channel, _ := server.GetChannel(c.Id())// channel.Emit("message", msg)// 방과 상관없이 접속한 모든 사람한테 메세지// server.BroadcastToAll("message", msg)// 특정 방에 있는 사람들에게 메세지c.BroadcastTo("chat", "message", msg)
return"OK"
})
//setup http server
serveMux := http.NewServeMux()
serveMux.Handle("/socket.io/", server)
log.Panic(http.ListenAndServe(":80", serveMux))
}
클라이언트
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.4/socket.io.js"></script>
<script>
var socket = io('ws://localhost', {
transports: ['websocket']
});
// listen for messages
socket.on('message', function(message) {
var ss = document.getElementById("listoh");
var ss2 = document.getElementById("listoh2");
signform.h.value = message.message + "<br>" + signform.h.value;
ss.innerHTML = signform.h.value;
ss2.innerHTML = message.clist + "<br>";
signform.gogo.value = "";
signform.gogo.focus();
});
socket.on('connect', function() {
// 접속되면 뭔가 할 일을 적으세요...
});
function sendman() {
var mg = {
clist: " ",
message: signform.gogo.value
};
//send something
socket.emit('send', mg, function(result) {
// alert(result);
});
returnfalse;
}
</script>
<form name="signform" onsubmit="return sendman();">
<input type="hidden" name="h">
<input type="text" name="gogo">
<input type="submit" value="쓰기"><br> 현재 소켓id 접속자 :
<div id="listoh2" style="background-color: #eeeeee"></div><br>
<div id="listoh"></div>
</form>
</body>
</html>
|
|
번 호
카테고리
제 목
이름
조회수
Copyright ⓒ 2001.12. bada-ie.com. All rights reserved.
이 사이트는 리눅스에서 firefox 기준으로 작성되었습니다. 기타 브라우저에서는 다르게 보일 수 있습니다.
[ Ubuntu + GoLang + PostgreSQL + Mariadb ]
서버위치 : 오라클 클라우드 춘천 실행시간 : 0.07291 초 to webmaster... gogo sea. gogo sea.