잠시만 기다려 주세요

HOME   |  여기는?   |  바다물때표   |  여러가지 팁 (888)  |  추천 및 재미 (154)  |  자료실 (20)  |  끄적거림 (520)  |  시나리오 (760)  |  드라마 대본 (248)  |  

2020년 09월 28일
무엇보다 스스로 감정 통제를 잘하고 말이 없어야 한다. - 바다아이
 




    golang

golang - golang 채팅 예제, 소스, chat example, 웹소켓 예제... socket.io
이 름 : 바다아이   |   조회수 : 3291         짧은 주소 : 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

func getlist() string {
	listman3 := ""
	for key, _ := range listman {
		listman3 += key + "<br>"
	}
	return listman3
}

func main() {

	listman = make(map[string]string)
	server := gosocketio.NewServer(transport.GetDefaultWebsocketTransport())

	type Message struct {
		// 클라이언트 부분과 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 room
		c.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 to
		c.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);
            });
            return false;
        }
    </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>
| |


      1 page / 6 page
번 호 카테고리 제 목 이름 조회수
173 golang , String Formatting 바다아이 272
172 golang rand.Intn , random, , . 바다아이 272
171 golang golang ... 바다아이 1436
170 golang golang gopath, goroot .. 바다아이 1114
169 golang golang ... Force download file example 바다아이 1588
168 golang golang , , cpu, memory, disk 바다아이 2311
167 golang golang , ... GOOS, GOARCH 바다아이 1634
166 golang golang checkbox ... 바다아이 1863
165 golang golang , , http .... 바다아이 1805
164 golang golang nil , nil , nil ... 바다아이 1901
163 golang 2 golang, go , .... golang .... 바다아이 2701
162 golang golang postgresql, mysql, mariadb ... ` Grave () .. .. 바다아이 1982
161 golang golang postgresql mysql, mariadb scan , null .. 바다아이 2065
160 golang golang , iconv 바다아이 2219
159 golang golang quote escape, unquote 바다아이 2134
158 golang golang , http errorLog , , ... 바다아이 2238
157 golang golang interface , 바다아이 2167
156 golang golang struct .... 바다아이 2301
155 golang golang map map , 바다아이 2157
154 golang golang map .... .... 바다아이 2125
153 golang golang slice copy 바다아이 2089
152 golang golang goto 바다아이 2166
151 golang golang slice sort , int, string, float64 바다아이 2230
150 golang URL Parsing, url . parse 바다아이 2302
149 golang golang , interface{} ... 바다아이 2219
148 golang golang interface to string, , , map slice json 바다아이 2069
147 golang golang How to convert JSON string to map and slice, json 바다아이 2221
146 golang golang , file write, Writing Files 바다아이 2345
145 golang golang Insert Line or String to File, , , , , 바다아이 2097
144 golang golang replace 바다아이 2185
| |








Copyright ⓒ 2001.12. bada-ie.com. All rights reserved.
이 사이트는 리눅스에서 firefox 기준으로 작성되었습니다. 기타 브라우저에서는 다르게 보일 수 있습니다.
[ FreeBSD + GoLang + PostgreSQL ]
서버위치 : vultr.com 서울  실행시간 : 0.26798
to webmaster... gogo sea. gogo sea.