Golang(10)Web Service - Web Socket
Golang(10)Web Service - Web Socket
8.1 Socket
2 types of socket, TCP Socket, UDP Socket. IP, port, TCP/UDP.
8.2 WebSocket
Implement the Push Notification to Browsers
https://github.com/astaxie/build-web-application-with-golang/blob/master/ebook/08.2.md
iOS and Android can support web socket too.
http://www.elabs.se/blog/66-using-websockets-in-native-ios-and-android-apps
Install the the go.net package
>go get code.google.com/p/go.net/websocket
Error Message:
go: missing Mercurial command. See http://golang.org/s/gogetcmd package code.google.com/p/go.net/websocket: exec: "hg": executable file not found in $PATH
Solution:
https://code.google.com/p/go-wiki/wiki/GoGetTools
>sudo port install mercurial
Error Message:
Error: org.macports.extract for port py27-docutils returned: command execution failed Error: Failed to install py27-docutils
:error:extract Failed to install py27-docutils :debug:extract couldn't open "/System/Library/Frameworks/Tcl.framework/Versions/8.5/Resources/tclIndex": no such file or directory while executing
Solution:
>sudo port clean
>sudo port selfupdate
>sudo port install py27-docutils
>sudo port install mercurial
>>go get code.google.com/p/go.net/websocket
Follow the document, but I get these error when I try to connect to web socket server.
Error Message:
failed: Error during WebSocket handshake: Unexpected response code: 403
Solution:
Make them the same domain name.
Go Server Side
package main
import (
"code.google.com/p/go.net/websocket"
"fmt"
"log"
"net/http"
)
func Echo(ws *websocket.Conn) {
var err error
for {
var reply string
if err = websocket.Message.Receive(ws, &reply); err != nil {
fmt.Println("Can't receive")
break
}
fmt.Println("Received back from client: " + reply)
msg := "Received: " + reply
fmt.Println("Sending to client: " + msg)
if err = websocket.Message.Send(ws, msg); err != nil {
fmt.Println("Can't send")
break
}
}
}
func main() {
http.Handle("/", http.FileServer(http.Dir(".")))
http.Handle("/socket", websocket.Handler(Echo))
if err := http.ListenAndServe("127.0.0.1:8008", nil); err != nil {
log.Fatal("ListenAndServe:", err)
}
}
HTML Client Side
<html>
<head></head>
<body>
<script type="text/javascript">
var sock = null;
var wsuri = "ws://127.0.0.1:8008/socket";
window.onload = function() {
console.log("onload");
sock = new WebSocket(wsuri);
sock.onopen = function() {
console.log("connected to " + wsuri);
}
sock.onclose = function(e) {
console.log("connection closed (" + e.code + ")");
}
sock.onmessage = function(e) {
console.log("message received: " + e.data);
}
};
function send() {
var msg = document.getElementById('message').value;
sock.send(msg);
};
</script>
<h1>WebSocket Echo Test</h1>
<form>
<p>
Message: <input id="message" type="text" value="Hello, world!">
</p>
</form>
<button onclick="send();">Send Message</button>
</body>
</html>
8.3 REST
…soon...
8.4 RCP (Remote Procedure Call Protocol)
…snip...
References:
https://github.com/astaxie/build-web-application-with-golang/blob/master/ebook/08.0.md
web socket push notification
http://html5hacks.com/blog/2013/04/21/push-notifications-to-the-browser-with-server-sent-events/
http://stackoverflow.com/questions/15884480/static-html-page-created-the-websocket-connection-golang-server-directly