ページ

2009年11月18日

GoでHTTPサーバ その3 Cometもどき

GoでHTTPサーバの続きです。とって言っても、チャットサーバをHTTPっぽくしただけです。URLで/listenにアクセスすると、ずっと待ち続けます。URLが/say?message=なんかのメッセージにアクセスすると、「なんかのメッセージ」がlistenで待っているクライアントに配信されるだけです。


package main

import (
"http";
"log";
"io";
)

func startServer() {
// initialize
queue := make(chan string);
listen_chan := make(map [*http.Conn] chan string);

go func() {
for {
mesg := <- queue;
for _, c := range listen_chan {
c <- mesg;
}
}
}();

// http handlers
http.Handle("/", http.HandlerFunc(func(c *http.Conn, req *http.Request) {
path := req.URL.Path;
log.Stdout("Request URL: " + path);
http.ServeFile(c, req, "." + path);
}));
http.Handle("/listen", http.HandlerFunc(func(c *http.Conn, req *http.Request) {
reciever := make(chan string);
listen_chan[c] = reciever;
mesg := <- reciever;
io.WriteString(c, mesg);
listen_chan[c] = nil, false;
}));
http.Handle("/say", http.HandlerFunc(func(c *http.Conn, req *http.Request) {
mesg := req.FormValue("message");
queue <- mesg;
body := "Message \"" + mesg + "\" was sent";
io.WriteString(c, body);
}));

err := http.ListenAndServe(":1972", nil);
if err != nil {
log.Stderr(err.String());
return;
}
}

func main() {
log.Stdout("starting server...");
startServer()
}

0 件のコメント: