在go语言中实现一个程序从不同的端口提供HTTP和Websocket服务功能代码示例
在go语言中实现一个能够在不同端口监听和服务HTTP/Web-socket流量的功能。
需求:
实现程序使用的端口分开,以服务于HTTP和Web-socket流量。
解决思路:
为一个端口设置http.NewServeMux()和http.ListenAndServe(),并将其作为go-routine启动。
例如,
在程序中用一个go-routine来处理web socket流量,用主程序来处理HTTP流量。
注意:
你可以使用另一个HTTP服务器来代替web-socket吗?
是的,当然可以。
示例代码:
package main
import (
"fmt"
"golang.org/x/net/websocket"
"io"
"net/http"
)
func homeHandler(w http.ResponseWriter, r *http.Request) {
html := `<!DOCTYPE html>
<html>
<head>
<title>一个HTTP和Websocket服务的端口不同的例子</title>
<script src="http://code.jquery.com/jquery-1.11.3.min.js"></script>
<script>
$(function() {
// 使用端口8082,而不是8080
var ws = new WebSocket("ws://localhost:8082/");
var $ul = $('#msg-list');
$('#sendBtn').click(function(){
var data = $('#name').val();
ws.send(data);
console.log("通过Websocket通过端口8082向HTTP服务器发送数据 :" + data);
$('<li>').text(data).appendTo($ul);
});
});
</script>
</head>
<body>
<input id="name" type="text" />
<input type="button" id="sendBtn" value="send"></input>
<ul id="msg-list"></ul>
</body></html>`
w.Write([]byte(fmt.Sprintf(html)))
}
func wsHandler(ws *websocket.Conn) {
fmt.Println("Receive data from : ", ws.LocalAddr())
fmt.Println("Sending data to : ", ws.RemoteAddr())
//回应
io.Copy(ws, ws)
}
func main() {
mxWS := http.NewServeMux()
mxWS.Handle("/", websocket.Handler(wsHandler))
fmt.Println("在:8082上监听并提供websocket服务")
go func() {
http.ListenAndServe(":8082", mxWS)
}()
mxHTTP := http.NewServeMux()
mxHTTP.HandleFunc("/", homeHandler)
fmt.Println("在 :8080上监听并提供HTTP服务")
http.ListenAndServe(":8080", mxHTTP)
}
运行代码并将你的浏览器指向
http://localhost:8080
看看效果:
按发f12打开开发者视图,查看控制台信息。
相关文章