質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

WebSocket

WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

Q&A

解決済

1回答

1396閲覧

Golangをサーバとして立てて、WebSocketを使ってJavaScriptで表示されたボタンを押下すると、メッセージがサーバに表示される機能を組み込んでみたのですが、上手く動きません。

TomMurphy

総合スコア13

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

WebSocket

WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

0グッド

0クリップ

投稿2022/04/07 06:38

Golangをサーバとして立てて、WebSocketを使ってJavaScriptで表示されたボタンを押下すると、メッセージがサーバに表示される機能を組み込んでみたのですが、上手く動きません。

問題の部分のプログラムだけを切り出して、試してみましたが、やはり、同じ症状が現われて、困っています。

// サーバのプログラム main.go package main import ( "fmt" "log" "net/http" "github.com/gorilla/websocket" ) var upgrader = websocket.Upgrader{} type GetLoc struct { ID int `json:"id"` Lat float64 `json:"lat"` Lng float64 `json:"lng"` TYPE string `json:"type"` // "PERSON","BUS","CONTROL POPUP int `json:"popup"` //Address string `json:"address"` } func echo2(w http.ResponseWriter, r *http.Request) { conn2, err := upgrader.Upgrade(w, r, nil) //conn2でwebsocketを作成 if err != nil { log.Println("websocket connection err:", err) return } defer conn2.Close() for { gl2 := new(GetLoc) conn2.ReadJSON(&gl2) // 戻して fmt.Println("echo2:", gl2) //time.Sleep(time.Second * 10) } } func main() { http.Handle("/", http.FileServer(http.Dir("."))) http.HandleFunc("/echo2", echo2) log.Println("server starting...", "http://localhost:5000") log.Fatal(http.ListenAndServe("localhost:5000", nil)) }
/* クライアントのindex.html */ <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>test</title> </head> <body> <form> <button id="departure">Departure</button> <button id="arrival">Arrival</button> </form> <script> const ws2 = new WebSocket('ws://localhost:5000/echo2') // ユーザ登録画面 document.getElementById("departure").onclick = function(evt) { console.log("document.getElementById departure.onclick") //var obj = {id:100,Lat:181.0, Lng:181.0,TYPE:"BUS", POPUP:100 } var obj = {id:100,lat:181.0, lng:181.0,type:"BUS", popup:100 } /* obj.id = 100; obj.lat = 181.0; obj.lng = 181.0; obj.type = "BUS"; obj.popup = 100; */ var json_obj = JSON.stringify(obj); ws2.send(json_obj) } document.getElementById("arrival").onclick = function(evt) { console.log("document.getElementById arrival.onclick") /* var obj; obj.id = 100; obj.lat = 181.0; obj.lng = 181.0; obj.type = "BUS"; obj.popup = 100; */ var obj = {id:200,lat:281.0, lng:281.0,type:"PERSON", popup:200 } var json_obj = JSON.stringify(obj); ws2.send(json_obj) } </script> </body> </html>

出力結果は以下の通りでした。

>go run main.go go run main.go 2022/04/07 15:22:48 server starting... http://localhost:5000 // ブラウザにhttp://localhost:5000 と入れて、"Depature"ボタン押下 echo2: &{100 181 181 BUS 100} echo2: &{0 0 0 0} echo2: &{0 0 0 0} echo2: &{0 0 0 0} echo2: &{0 0 0 0} echo2: &{0 0 0 0} echo2: &{0 0 0 0} echo2: &{0 0 0 0} echo2: &{0 0 0 0} echo2: &{0 0 0 0} echo2: &{0 0 0 0} echo2: &{0 0 0 0} echo2: &{0 0 0 0} echo2: &{0 0 0 0} echo2: &{0 0 0 0} ...... (1000個ほど表示) echo2: &{0 0 0 0} echo2: &{0 0 0 0} 2022/04/07 15:22:57 http: panic serving 127.0.0.1:57232: repeated read on failed websocket connection goroutine 19 [running]: net/http.(*conn).serve.func1() c:/go/src/net/http/server.go:1801 +0xb9 panic({0x7262e0, 0x7c9b80}) c:/go/src/runtime/panic.go:1047 +0x266 github.com/gorilla/websocket.(*Conn).NextReader(0xc000128580) c:/go/pkg/mod/github.com/gorilla/websocket@v1.4.2/conn.go:1001 +0x269 github.com/gorilla/websocket.(*Conn).ReadJSON(0x7cbf00, {0x71d340, 0xc000007fd0}) c:/go/pkg/mod/github.com/gorilla/websocket@v1.4.2/json.go:50 +0x27 main.echo2({0x7d0a88, 0xc0001500e0}, 0x0) c:/Users/ebata/goga/1-12-1/main.go:32 +0x10e net/http.HandlerFunc.ServeHTTP(0x0, {0x7d0a88, 0xc0001500e0}, 0x0) c:/go/src/net/http/server.go:2046 +0x2f net/http.(*ServeMux).ServeHTTP(0x0, {0x7d0a88, 0xc0001500e0}, 0xc000138100) c:/go/src/net/http/server.go:2424 +0x149 net/http.serverHandler.ServeHTTP({0xc00007b0e0}, {0x7d0a88, 0xc0001500e0}, 0xc000138100) c:/go/src/net/http/server.go:2878 +0x43b net/http.(*conn).serve(0xc0000ce000, {0x7d19e0, 0xc00007aff0}) c:/go/src/net/http/server.go:1929 +0xb08 created by net/http.(*Server).Serve c:/go/src/net/http/server.go:3033 +0x4e8 // "Arrival"ボタンを押下 echo2: &{200 281 281 PERSON 200} echo2: &{0 0 0 0} echo2: &{0 0 0 0} ...... (1000個ほど表示) echo2: &{0 0 0 0} echo2: &{0 0 0 0} 2022/04/07 15:23:00 http: panic serving 127.0.0.1:57242: repeated read on failed websocket connection goroutine 20 [running]: net/http.(*conn).serve.func1() c:/go/src/net/http/server.go:1801 +0xb9 panic({0x7262e0, 0x7c9b80}) c:/go/src/runtime/panic.go:1047 +0x266 github.com/gorilla/websocket.(*Conn).NextReader(0xc0000c8420) c:/go/pkg/mod/github.com/gorilla/websocket@v1.4.2/conn.go:1001 +0x269 github.com/gorilla/websocket.(*Conn).ReadJSON(0x7cbf00, {0x71d340, 0xc0000bff60}) c:/go/pkg/mod/github.com/gorilla/websocket@v1.4.2/json.go:50 +0x27 main.echo2({0x7d0a88, 0xc0000b40e0}, 0x0) c:/Users/ebata/goga/1-12-1/main.go:32 +0x10e net/http.HandlerFunc.ServeHTTP(0x0, {0x7d0a88, 0xc0000b40e0}, 0x0) c:/go/src/net/http/server.go:2046 +0x2f net/http.(*ServeMux).ServeHTTP(0x0, {0x7d0a88, 0xc0000b40e0}, 0xc00009e300) c:/go/src/net/http/server.go:2424 +0x149 net/http.serverHandler.ServeHTTP({0xc000088330}, {0x7d0a88, 0xc0000b40e0}, 0xc00009e300) c:/go/src/net/http/server.go:2878 +0x43b net/http.(*conn).serve(0xc0000ce0a0, {0x7d19e0, 0xc00007aff0}) c:/go/src/net/http/server.go:1929 +0xb08 created by net/http.(*Server).Serve c:/go/src/net/http/server.go:3033 +0x4e8

何か基本的な宣言を忘れているのかもしれませんが、私は見つけることができませんでした。
本件、ご教示頂けますよう、何卒よろしくお願い申し上げます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

正確な理由は分かりませんが、以下のようにすることで解決することが分かりました。

/* クライアントのindex.html */ (中略) var json_obj = JSON.stringify(obj); ws2.send(json_obj) return false }

と、"return false"を一行加えることで、以下のように表示されるようになりました。

echo2: &{100 181 181 BUS 100} echo2: &{100 181 181 BUS 100} echo2: &{100 181 181 BUS 100} echo2: &{200 281 281 PERSON 200} echo2: &{200 281 281 PERSON 200} echo2: &{200 281 281 PERSON 200} echo2: &{200 281 281 PERSON 200}

まだ、正確に理解しているとはいいかねますが、取り急ぎ、ご報告致します。

投稿2022/04/07 13:08

TomMurphy

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問