Golangでページを再読み込みするとWebsocket Serverが落ちる
GoとWebsocketの練習として写真を投稿するWebアプリケーションを作っています。
写真の投稿などはうまくできるのですが、
一度、ブラウザがhtmlを読み込んだ後、もう一度ブラウザにhtmlを再読み込み(更新)させると、websocket.JSON.Receive
がEOF
となりServerが落ちてしまいます。
なぜこのようなことが起こるのでしょうか?
ajaxを使ってもこのWeb Applicationは作れると思いますが、今回は練習のため、意図的にWebSocketを使いました。
Serverのコード
package main
import (
"database/sql"
"fmt"
"github.com/go-gorp/gorp"
_ "github.com/mattn/go-sqlite3"
"golang.org/x/net/websocket"
"log"
"net/http"
)
type Picture struct {
Id int64
Data []byte
Name string
}
var debug = true
var photodb = "./db/photo.sqlite3"
func main() {
http.Handle("/layouts/css/", http.StripPrefix("/layouts/css/", http.FileServer(http.Dir("layouts/css"))))
http.HandleFunc("/chat", func(w http.ResponseWriter, req *http.Request) {
s := websocket.Server{Handler: websocket.Handler(data_handle)}
s.ServeHTTP(w, req)
})
fmt.Println(":8249")
http.ListenAndServe(":8249", nil)
}
func InitDb() (*gorp.DbMap, error) {
db, err := sql.Open("sqlite3", photodb)
if err != nil {
fmt.Println(err)
return nil, err
}
dbmap := &gorp.DbMap{Db: db, Dialect: gorp.SqliteDialect{}}
dbmap.AddTableWithName(Picture{}, "picture").SetKeys(true, "Id")
err = dbmap.CreateTablesIfNotExists()
if err != nil {
return nil, err
}
return dbmap, nil
}
func insertPic(pic *Picture) {
dbmap, err := InitDb()
if err != nil {
log.Fatalln("InitDb error:", err)
}
err = dbmap.Insert(pic)
if err != nil {
log.Fatalln("Insert error:", err)
}
}
func data_receive(ws *websocket.Conn) {
for {
var b Picture
if err := websocket.JSON.Receive(ws, &b); err != nil {
if debug {
fmt.Println(b)
}
log.Fatalln("Receive error: ", err)
} else {
insertPic(&b)
err = websocket.JSON.Send(ws, b)
if err != nil {
fmt.Println("Send error:", err)
}
}
}
}
func data_handle(ws *websocket.Conn) {
data_receive(ws)
}
JavaScript
var ws = new WebSocket("ws://localhost:8249/chat")
var img = document.getElementById("img");
var f = document.getElementById("file");
var file_reader = new FileReader();
f.onchange = function () {
var filelist = this.files;
var file = filelist[0];
file_reader.onload = function (e) {
var data = e.target.result;
var b64 = data.slice(data.indexOf(",") + 1);
var s = {"Name": file.name, "Data": b64};
console.log(s);
ws.send(JSON.stringify(s));
}
file_reader.readAsDataURL(file);
}
ws.onmessage = function (e) {
var obj = console.log(e.data);
}
html
<!DOCTYPE html>
<html lang="ja">
<head>
<title>Websocket json</title>
<meta charset="utf-8">
</head>
<body>
<input type="file" id="file" accept="image/*">
<img id="img">
<script src="websocket_json.js"></script>
</body>
</html>