잠시만 기다려 주세요

     '바다아이 사이트는 윤석열 정부 탄핵을 지지합니다.'
전체검색 :  
이번주 로또 및 연금번호 발생!!   |  HOME   |  여기는?   |  바다물때표   |  알림 (19)  |  여러가지 팁 (1095)  |  추천 및 재미 (163)  |  자료실 (28)  |  
시사, 이슈, 칼럼, 평론, 비평 (799)  |  끄적거림 (142)  |  문예 창작 (719)  |  바람 따라 (75)  |  시나리오 (760)  |  드라마 대본 (248)  |  
살인!


    golang

golang - golang 채팅 예제, 소스, chat example, 웹소켓 예제... socket.io
이 름 : 바다아이   |   조회수 : 16151         짧은 주소 : 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
번 호 카테고리 제 목 이름 조회수
180 golang golang ... 바다아이 139
179 golang golang , ... 바다아이 2726
178 golang golang , map . 바다아이 2108
177 golang Golang (, , data ) , ... 바다아이 2438
176 golang golang sort ... 바다아이 2808
175 golang golang html.EscapeString html.UnescapeString input value ... 바다아이 2733
174 golang golang go.mod go.sum . GOPATH SRC not module, 1.16 . 바다아이 6258
173 golang go 1.16 ... is not in GOROOT.. GOPATH .... . 바다아이 7412
172 golang , String Formatting 바다아이 8714
171 golang rand.Intn , random, , . 바다아이 8255
170 golang golang ... 바다아이 12005
169 golang golang gopath, goroot .. golang 바다아이 8973
168 golang golang ... Force download file example 바다아이 11003
167 golang golang , , cpu, memory, disk 바다아이 12068
166 golang golang , ... GOOS, GOARCH 바다아이 9715
165 golang golang checkbox ... 바다아이 9593
164 golang golang , , http .... 바다아이 9406
163 golang golang nil , nil , nil ... 바다아이 9488
162 golang 2 golang, go , .... golang .... 바다아이 12735
161 golang golang postgresql, mysql, mariadb ... ` Grave () .. .. 바다아이 10046
160 golang golang postgresql mysql, mariadb scan , null .. 바다아이 10118
159 golang golang , iconv 바다아이 12931
158 golang golang quote escape, unquote 바다아이 10352
157 golang golang , http errorLog , , ... 바다아이 10739
156 golang golang interface , 바다아이 9807
155 golang golang struct .... 바다아이 10531
154 golang golang map map , 바다아이 10005
153 golang golang map .... .... 바다아이 9341
152 golang golang slice copy 바다아이 9529
151 golang golang goto 바다아이 10718
| |









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