잠시만 기다려 주세요

     '책임지지 않는 윤석열 정부를 규탄한다. 입만 벌리면 거짓말.. 범죄 의혹 한트럭... 자신들의 범죄 의혹을 철저히 숨기는 윤석열 정부를 탄핵하자.'
전체검색 :  
이번주 로또 및 연금번호 발생!!   |  HOME   |  여기는?   |  바다물때표   |  알림 (16)  |  여러가지 팁 (1056)  |  추천 및 재미 (151)  |  자료실 (22)  |  
시사, 이슈, 칼럼, 평론, 비평 (600)  |  끄적거림 (129)  |  문예 창작 (705)  |  바람 따라 (69)  |  시나리오 (760)  |  드라마 대본 (248)  |  
살인!


    golang

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

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
번 호 카테고리 제 목 이름 조회수
179 golang golang , ... 바다아이 1712
178 golang golang , map . 바다아이 1324
177 golang Golang (, , data ) , ... 바다아이 1328
176 golang golang sort ... 바다아이 1559
175 golang golang html.EscapeString html.UnescapeString input value ... 바다아이 1685
174 golang golang go.mod go.sum . GOPATH SRC not module, 1.16 . 바다아이 4957
173 golang go 1.16 ... is not in GOROOT.. GOPATH .... . 바다아이 5843
172 golang , String Formatting 바다아이 7491
171 golang rand.Intn , random, , . 바다아이 6950
170 golang golang ... 바다아이 10028
169 golang golang gopath, goroot .. golang 바다아이 7613
168 golang golang ... Force download file example 바다아이 9412
167 golang golang , , cpu, memory, disk 바다아이 10700
166 golang golang , ... GOOS, GOARCH 바다아이 8482
165 golang golang checkbox ... 바다아이 8228
164 golang golang , , http .... 바다아이 8007
163 golang golang nil , nil , nil ... 바다아이 8351
162 golang 2 golang, go , .... golang .... 바다아이 11214
161 golang golang postgresql, mysql, mariadb ... ` Grave () .. .. 바다아이 8543
160 golang golang postgresql mysql, mariadb scan , null .. 바다아이 8681
159 golang golang , iconv 바다아이 11480
158 golang golang quote escape, unquote 바다아이 8882
157 golang golang , http errorLog , , ... 바다아이 8992
156 golang golang interface , 바다아이 8456
155 golang golang struct .... 바다아이 9128
154 golang golang map map , 바다아이 8660
153 golang golang map .... .... 바다아이 8178
152 golang golang slice copy 바다아이 8273
151 golang golang goto 바다아이 9127
150 golang golang slice sort , int, string, float64 바다아이 8605
| |









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