基于Golang的WebSocket Server

基于Golang的WebSocket Server

Golang版本的 WebSocket已经在官方包中了,不过没有放入Go安装程序中,需要独立下载, go websocket package 下载地址: https://code.google.com/p/go/source/checkout?repo=net

如果安装了hg,通过如下方式安装: go get code.google.com/p/go.net/websocket

一个golang websocket echo server 例子如下:

 

01
02
03 package main
04
05 import (
06     "code.google.com/p/go.net/websocket"
07     "fmt"
08     "log"
09     "net/http"
10 )
11
12 func Echo(ws *websocket.Conn) {
13     var err error
14
15     for {
16         var reply string
17
18         if err = websocket.Message.Receive(ws, &reply); err != nil {
19             fmt.Println("Can't receive")
20             break
21         }
22
23         fmt.Println("Received back from client: " + reply)
24
25         msg := "Received:  " + reply
26         fmt.Println("Sending to client: " + msg)
27
28         if err = websocket.Message.Send(ws, msg); err != nil {
29             fmt.Println("Can't send")
30             break
31         }
32     }
33 }
34
35 func main() {
36     http.Handle("/", websocket.Handler(Echo))
37
38     if err := http.ListenAndServe(":9999", nil); err != nil {
39         log.Fatal("ListenAndServe:", err)
40     }
41 }

客服端测试:

01
02       <script type="text/javascript">
03          var sock = null;
04          var wsuri = "ws://127.0.0.1:9999";
05
06          window.onload = function() {
07
08             console.log("onload");
09
10             sock = new WebSocket(wsuri);
11
12             sock.onopen = function() {
13                console.log("connected to " + wsuri);
14             }
15
16             sock.onclose = function(e) {
17                console.log("connection closed (" + e.code + ")");
18             }
19
20             sock.onmessage = function(e) {
21                console.log("message received: " + e.data);
22             }
23          };
24
25          function send() {
26             var msg = document.getElementById('message').value;
27             sock.send(msg);
28          };
29       </script>
30       <h1>WebSocket Echo Test</h1>
31       <form>
32          <p>
33             Message: <input id="message" value="Hello, world!" type="text">
34          </p>
35       </form>
36       <button onclick="send();">Send Message</button>

golang http server

作者: 日期: Post in Golang,Tags: , , 2012年08月3日1 条评论

今天将Golang及GoEclipse都升级了最新的了,结果出了点问题。不能正常使用,不过最后莫名其妙的好了,我也就不再理会之前是什么原因导致的了。

在创建 go source file的时候,看到一个选项:Command Source File -> Simple Web Server

goeclipse

点击创建后,默认代码如下:

01
02
03 package main
04
05 import (
06     "fmt"
07     "net/http"
08 )
09
10 // Default Request Handler
11 func defaultHandler(w http.ResponseWriter, r *http.Request) {
12     fmt.Fprintf(w, "<h1>Hello %s!</h1>", r.URL.Path[1:])
13 }
14
15 func main() {
16     http.HandleFunc("/", defaultHandler)
17     http.ListenAndServe(":8080", nil)
18 }

这样,一个基本的Golang 的http server demo就出来了. 访问http://127.0.0.1:8080/则可以看到结果了。

可见,目前golang与Python twisted、Node.js等在同类功能上,都差不多一样方便了。

添加一个新的handle, 例如得到服务器的环境变量, 代码如下:

01
02
03
04 package main
05
06 import (
07     "fmt"
08     "net/http"
09     "os"
10 )
11
12
13 // Default Request Handler
14 func defaultHandler(w http.ResponseWriter, r *http.Request) {
15     fmt.Fprintf(w, "<h1>Hello %s!</h1>", r.URL.Path[1:])
16 }
17
18 // getEnv Request Handler
19 func getEnv(writer http.ResponseWriter, req *http.Request) {
20     env := os.Environ()
21     writer.Write([]byte("<h1>本机环境变量</h1><br>"))
22     for _, v := range env {
23         writer.Write([]byte(v + "<br>"))
24     }
25     writer.Write([]byte("<br>"))
26 }
27
28 func main() {
29     http.HandleFunc("/", defaultHandler)
30     http.HandleFunc("/get", getEnv)
31     http.ListenAndServe(":8080", nil)
32 }

访问地址: http://127.0.0.1:8080/get 即可。

 

 

Python WebSocket Server

作者: 日期: Post in HTML5, Python, 游戏开发,Tags: , , , 2012年07月20日 发表评论 (0)查看评论

手机中,使用HTML5中引入的WebSocket技术来取代PC端基于flash的socket还是比较方便的(为了统一,直接使用websocket更方便,不支持websocket可以使用flash socket作为代理)。 我使用了Python + PHP作为服务端程序。

python版本的 WebSocket有好多,基于gevent或者twisted.web的都有。 我在查找过程中,发现了一个如下一个工具:http://autobahn.ws/   Autobahn provides Open-Source client and server implementations of WebSocket and WAMP.

其中,AutobahnPython 是我需要的.   AutobahnPython is a WebSocket / WAMP client and server framework based on Twisted. It’s conformant, scalable and flexible.

一个echo server例子如下:

 

01
02 import sys
03
04 from twisted.internet import reactor
05 from twisted.python import log
06
07 from autobahn.websocket import WebSocketServerFactory, \
08                                WebSocketServerProtocol, \
09                                listenWS
10
11 class EchoServerProtocol(WebSocketServerProtocol):
12
13     def onMessage(self, msg, binary):
14         print "sending echo:", msg
15         self.sendMessage(msg, binary)
16
17 if __name__ == '__main__':
18
19     log.startLogging(sys.stdout)
20
21     factory = WebSocketServerFactory("ws://192.168.0.102:9009", debug = False)
22     factory.protocol = EchoServerProtocol
23     listenWS(factory)
24
25     reactor.run()

Related posts:

  1. 基于Golang的WebSocket Server Golang版本的 WebSocket已经在官方包中了,不过没有放入Go安装程序 …继续阅读 »…
  2. Flash/Python Socket 之前使用Python socket都从socket.socket server_ …继续阅读 »…
  3. python 调用so dll动态链接库 ctypes使得python能够直接调用c语言开发的动态链接库,非常强大。 为了 …继续阅读 »…
  4. golang http server 今天将Golang及GoEclipse都升级了最新的了,结果出了点问题。不能正常 …继续阅读 »…
此条目发表在 未分类 分类目录。将固定链接加入收藏夹。

评论功能已关闭。