なんで、JSON.parse()で、パースができないのだろう? と3時間くらい悩んだあげく、大文字を小文字変換されていることに、ようやく気がつきました。
ひどくない?
気がつかなかった私が悪いの?
/*
// server4.go
// Copyright 2015 The Gorilla WebSocket Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// +build ignore
// 使い方
// go run server2.go (適当なシェルから)
// http://localhost:8080 (ブラウザ起動)
*/
package main
import (
"flag"
"html/template"
"log"
"net/http"
"github.com/gorilla/websocket"
)
// GetLoc GetLoc
type GetLoc struct {
ID int `json:"id"`
Lat float64 `json:"lat"`
Lng float64 `json:"lng"`
//Address string `json:"address"`
}
//var addr = flag.String("addr", "localhost:8080", "http service address")
var addr = flag.String("addr", "0.0.0.0:8080", "http service address") // テスト
var upgrader = websocket.Upgrader{} // use default options
func echo(w http.ResponseWriter, r *http.Request) {
c, err := upgrader.Upgrade(w, r, nil) // cはサーバのコネクション
if err != nil {
log.Print("upgrade:", err)
return
}
defer c.Close()
for {
//mt, message, err := c.ReadMessage() // クライアントからのメッセージの受信(mtはクライアント識別子)
_, _, err := c.ReadMessage() // クライアントからのメッセージの受信(mtはクライアント識別子)
if err != nil {
log.Println("read:", err)
break
}
// JSONを無理やり入れてみた
gl := GetLoc{
ID: 1,
Lat: 35.653976,
Lng: 139.796842,
}
//log.Printf("recv_serv: %s", gl)
//err = c.WriteJSON(mt, gl)
err = c.WriteJSON(gl)
if err != nil {
log.Println("write:", err)
break
}
/*
log.Printf("recv_serv: %s", message) // 受信したメッセージの表示
err = c.WriteMessage(mt, message) // 受信したメッセージの返送
if err != nil {
log.Println("write:", err)
break
}
*/
}
}
func home(w http.ResponseWriter, r *http.Request) {
homeTemplate.Execute(w, "ws://"+r.Host+"/echo")
}
func main() {
flag.Parse()
log.SetFlags(0)
http.HandleFunc("/echo", echo) // echo関数を登録 (サーバとして必要)
http.HandleFunc("/", home) // home関数を登録
log.Fatal(http.ListenAndServe(*addr, nil)) // localhost:8080で起動をセット
}
var homeTemplate = template.Must(template.New("").Parse(`
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script>
var print = function(message) {
var d = document.createElement("div");
d.textContent = message;
output.appendChild(d);
};
//引数にはミリ秒を指定します。(例:5秒の場合は5000)
function sleep(a){
var dt1 = new Date().getTime();
var dt2 = new Date().getTime();
while (dt2 < dt1 + a){
dt2 = new Date().getTime();
}
return;
}
ws = new WebSocket("{{.}}");
// 送信5発(3秒単位)を送信
ws.onopen = function (event) {
for (let i = 0; i < 5; i++){
ws.send("Ebata is great");
print("send: Ebata is great");
print("Start sleep");
sleep(1000);
print("End sleep");
}
}
// 受信すると、勝手にここに飛んでくる
ws.onmessage = function (event) {
//console.log(event.data);
print("RESPONSE: " + event.data);
var obj = JSON.parse(event.data);
// test code (JSON.parse()が大文字を無視することを確認するテスト)
//const json = '{"ID":1, "Lat":35.653976, "Lng":139.796842}';
//print("json:" + json);
//var obj = JSON.parse(json);
print("obj:" + obj);
print("ID:" + obj.id); // obj.IDなら読み取れない
print("Lat:" + obj.lat); // obj.Latなら読み取れない
print("Lng:" + obj.lng); // obj.Lngなら読み取れない
}
// サーバを止めると、ここに飛んでくる
ws.onclose = function(event) {
print("CLOSE");
ws = null;
}
</script>
</head>
<body>
<div id="output"></div>
</body>
</html>
`))