기본 콘텐츠로 건너뛰기

[golang/websocket] websocket sample

0.소스 올린 이유.
샘플이라고 올라와 있지만, 실제로는  접속 실패 오류가 떠서 한참 구글링 했습니다.
server1.go 실행하고 client1.go 로 동작 확인하고, 웹 동작은 크롬 브라우저에서 websocket_client1.html 동작 확인 했습니다.

아래는 WebSocket 동작 샘플 소스 이며,
아래 링크에 있는 샘플들을 참고 했습니다.

https://github.com/gorilla/websocket
https://github.com/gorilla/websocket/tree/main/examples/chat
https://stackoverflow.com/questions/4361173/http-headers-in-websockets-client-api
https://www.golinuxcloud.com/golang-websocket/
https://www.tutorialspoint.com/webrtc/webrtc_rtcpeerconnection_apis.htm



server1.go


package main


import (

"fmt"

"log"

"net/http"


"github.com/gorilla/websocket"

)


// var upgrader = websocket.Upgrader{}

var upgrader = websocket.Upgrader{

ReadBufferSize:  1024,

WriteBufferSize: 1024,

        // 아래 CheckOrigin 항목이 없으면, 크롬에서 클라이언트 올렸을때 접속 안됨.

CheckOrigin: func(r *http.Request) bool {

        return true

    },

}

func main() {

http.HandleFunc("/echo", func(w http.ResponseWriter, r *http.Request) {

conn, err := upgrader.Upgrade(w, r, nil) // error ignored for sake of simplicity

if err != nil {

log.Println("upgrade:", err)

log.Println("w:", w)

log.Println("r:", r)

return

}


for {

// Read message from browser

msgType, msg, err := conn.ReadMessage()

if err != nil {

log.Println("read:", err)

return

}


// Print the message to the console

fmt.Printf("%s sent: %s\n", conn.RemoteAddr(), string(msg))


// Write message back to browser

if err = conn.WriteMessage(msgType, msg); err != nil {

log.Println("write:", err)

return

}

}

})


http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {

fmt.Fprintf(w, "This is GolinuxCloud's websocket server")

})


sPort := ":9090"

log.Println("server port ", sPort)

http.ListenAndServe(sPort, nil)

}

websocket_client1.html


<!DOCTYPE html>
<html>
<head>
    <title>ws</title>
    <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
</head>
<body>
<!-- websockets.html -->
<input id="input" type="text" />
<button onclick="send()">Send</button>
<pre id="output"></pre>
</body>
<script>
    var input = document.getElementById("input");
    var output = document.getElementById("output");
    var socket = new WebSocket("ws://localhost:9090/echo");
    //var socket = new WebSocket("ws://10.120.10.102:9090/echo");

    socket.onopen = function () {
        output.innerHTML += "Status: Connected\n";
    };

    socket.onmessage = function (e) {
        output.innerHTML += "Server: " + e.data + "\n";
    };

    function send() {
        socket.send(input.value);
        input.value = "";
    }
</script>
</html>

client1.go


// #go run client1.go localhost:9090 echo
package main

import (
"bufio"
"fmt"
"log"
"net/url"
"os"
"os/signal"
"time"

"github.com/gorilla/websocket"
)

var SERVER = ""
var PATH = ""
var TIMESWAIT = 0
var TIMESWAITMAX = 5
var in = bufio.NewReader(os.Stdin)

func getInput(input chan string) {
result, err := in.ReadString('\n')
if err != nil {
log.Println(err)
return
}
input <- result
}

func main() {
arguments := os.Args
if len(arguments) != 3 {
fmt.Println("Need SERVER + PATH!")
return
}
SERVER = arguments[1]
PATH = arguments[2]
fmt.Println("Connecting to:", SERVER, "at", PATH)
interrupt := make(chan os.Signal, 1)
signal.Notify(interrupt, os.Interrupt)

input := make(chan string, 1)
go getInput(input)
URL := url.URL{Scheme: "ws", Host: SERVER, Path: PATH}
c, _, err := websocket.DefaultDialer.Dial(URL.String(), nil)
if err != nil {
log.Println("Error:", err)
return
}
defer c.Close()
done := make(chan struct{})
go func() {
defer close(done)
for {
_, message, err := c.ReadMessage()
if err != nil {
log.Println("ReadMessage() error:", err)
return
}
log.Printf("Received: %s", message)
}
}()

for {
select {
case <-time.After(4 * time.Second):
log.Println("Please give me input!", TIMESWAIT)
TIMESWAIT++
if TIMESWAIT > TIMESWAITMAX {
//syscall.Kill(syscall.Getpid(), syscall.SIGINT)
}
case <-done:
return
case t := <-input:
err := c.WriteMessage(websocket.TextMessage, []byte(t))
if err != nil {
log.Println("Write error:", err)
return
}
TIMESWAIT = 0
go getInput(input)
case <-interrupt:
log.Println("Caught interrupt signal - quitting!")
err := c.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, ""))

if err != nil {
log.Println("Write close error:", err)
return
}
select {
case <-done:
case <-time.After(2 * time.Second):
}
return
}
}
}




댓글

이 블로그의 인기 게시물

이클립스 실행 오류와 eclipse.ini 수정

1. 실행시 Java was started but returned exit code=13 에러가 날때 --> Win7 64bit를 사용중인데, 이 오류가 발생하고 있었습니다. 제가 자바도 이클립스용도 32비트 버젼을 사용중이었는데, 자바만 64비트용으로 설치를 했더니, 생긴 문제였습니다. 이클립스 64비트를 설치하시면 해결됩니다. 2.이클립스 폴더내 eclipse.ini 기본값(보통 아래 처럼 되어 있습니다.) -startup plugins/org.eclipse.equinox.launcher_1.1.0.v20100507.jar --launcher.library plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.1.R36x_v20100810 -product org.eclipse.epp.package.jee.product --launcher.defaultAction openFile --launcher.XXMaxPermSize 256M -showsplash org.eclipse.platform --launcher.XXMaxPermSize 256m --launcher.defaultAction openFile -vmargs -Dosgi.requiredJavaVersion=1.5 -Xms40m -Xmx512m 3.실행하자 마자 javaw.exe 찾기 실패시  --> jdk가 설치된 경로(javaw.exe가 있는 경로)를 추가해준다. 맨 아래쪽에 삽입하니 안되더군요.(왜죠?) -vmargs 윗부분에 삽입했습니다. 다른 블로그님 들 글에선 open 위쪽에 쓰니 괜찮다는 글도 있으니 참고하세요. -vm c:\Program Files\java\jre6\bin\javaw.exe 4.이클립스 속도 향상을 위한 추가값 출처:  http://blog.naver.com/sungback/90097516641 검색도중 이클립스 속도 향상 정보를 발

[c#.net] WPF 사용 중 xaml관련 실행시 오류 와 대처 방법

wpf 사용 중 xaml관련 실행시 오류 가 발생해서 자그마치 2일을 소비 했다..--;; 오류 내용은 아래와 같다. ================================== 'System.Windows.Markup.XamlParseException' 형식의 첫째 예외가 PresentationFrameWork.dll에서 발생했습니다. 추가 정보: '지정된 바인딩 제약 조건과 일치하는 'PapaZone.MainWindow' 형식에 대한 생성자 호출에서 예외가 throw 되었습니다.' 줄 번호 '21' 및 줄 위치 '9' 이 예외에 대한 처리기가 있으면 프로그램을 안전하게 계속할 수 있습니다. [] 이 예외 형식이 throw되면 중단 ================================== 위 Xaml 오류 메세지만으로는 내용 추적 불가하여, 도대체 뭔가 했다. 검색해도 뚜렷한 답변은 없었지만, 여러가지 의견을 종합해 보면 아래와 같다. 1. xmlns 관련 파일 과 관련된 파일 로딩 실패 이거나, 2. 신규로 추가된 namespace 에 속한 태그 사용시 오류로 판단되어 태그 하나씩 삽입하며 테스트 해봐야 한다고 함. 해결한 지금에 원인을 보면, xaml 에서 clr-namespace 로 추가된 항목들이 로딩에 실패해서 발생한 것이며, 추가된 항목은 있었으나, 이것과 연결된 파일이 없어서 로딩되지 않는 것이 문제였다. 오늘도 즐거운 하루~~

[MSSQL] SQL Server 에 원격 접속을 못하는 경우 조치 방법

[MSSQL] SQL Server 에 원격 접속을 못하는 경우 조치 방법 내부 오류 추적 결과 다음과 같이 나옴. [Microsoft][ODBC Driver 13 for SQL Server]TCP Provider: 대상 컴퓨터에서 연결을 거부했으므로 연결하지 못했습니다. SqlState : 08001, NativeError : 10061 오류 원인과 처리 1.SQL 서버 로그인 계정 틀린 경우 -> A.SQL Managerment Studio에서 사용할 DB 접속 '로그인' 사용할 계정의 아이디/암호 확인 2.TCP/IP 접속 권한이 없는 경우 -> A.SQL Server 구성 관리자를 실행에서 TCP/IP 허용 되어 있는지 확인 B. 서비스 포트 값이 (보통 1433) 맞는지 확인 C. 외부에서 접속하는 경우에는 방화벽 허용 되엉 있는지 확인 C. 서비스 재시작 3.Windows 인증 모드만 허용 인 경우 -> A.SQL Managerment Studio에서 사용할 DB 접속하고, 우클릭 하여 속성 정보 확인해서 B.연결에서 인증모드 '로그인' 사용할 계정의 아이디/암호 확인 4.'exec Sp_ReadErrorLog' 명령어를 사용해서, 로그인 실패 로그를 확인해서 원인을 분석한다.