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

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

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

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

7053閲覧

WebSocketSharpを使って通信をしたい(Unity)

peter_kes

総合スコア14

WebSocket

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2018/04/20 03:43

編集2018/04/21 01:56

WebsocketSharpプラグインをつかって通信を成功させたいのですが、
ほぼサンプルのコードのままなのに、sendでメッセージを送ると
InvalidOperationException: The current state of the connection is not Open.
と出てしまいます。

これがコードになります。
Client側

C#

1<code> 2using System; 3using System.Collections.Generic; 4using UnityEngine; 5using WebSocketSharp; 6public class WebsocketAccessor : MonoBehaviour 7{ 8 private WebSocket ws; 9 10 void Start() 11 { 12 13 ws = new WebSocket("ws://localhost:8088/"); 14 15 ws.OnOpen += (sender, e) => 16 { 17 Debug.Log("Opended"); 18 }; 19 ws.OnMessage += (sender, e) => 20 { 21 Debug.Log("Received " + e.Data); 22 }; 23 24 ws.OnError += (sender, e) => 25 { 26 Debug.Log("ERROR"); 27 }; 28 ws.Connect (); 29 30 } 31 32 33 public void StartSend(string message) 34 { 35 // 送るボタンを押すと入力された文字列データを送信する 36 ws.Send (message); 37 38 } 39 private void OnDestroy() 40 { 41 // 接続を切る. 42 ws.Close(); 43 } 44} 45

サーバー側

C#

1<code> 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5using System; 6using WebSocketSharp; 7using WebSocketSharp.Server; 8 9//exmample 10public class Program : MonoBehaviour { 11 12 void Awake () { 13 14 //var wssv = new WebSocketServer ("ws://dragonsnest.far"); 15 var wssv = new WebSocketServer (8088); 16 wssv.AddWebSocketService<Laputa> ("/Laputa"); 17 wssv.Start (); 18 //Console.ReadKey (true); 19 //wssv.Stop (); 20 21 } 22 23} 24 25―――――――--------------------------------- 26using System; 27using WebSocketSharp; 28using WebSocketSharp.Server; 29using UnityEngine; 30 31//example 32public class Laputa : WebSocketBehavior{ 33 34 protected override void OnOpen() 35 { 36 Debug.Log ("opend"); 37 } 38 39 protected override void OnMessage (MessageEventArgs e) 40 { 41 var msg = e.Data == "BALUS" 42 ? "I've been balused already..." 43 : "I'm not available now."; 44 45 Send (msg); 46 } 47}

Open というメッセージがでないので Openになっていないのですが、
どうしてOpenにならないのでしょうか?
PCで何か設定しないとブロックされてしまっているのでしょうか?
ws = new WebSocket("ws://localhost:8088/"); URLとポートがおかしいんでしょうか?
ご教授お願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

あんまりコード読んでないです。

お願い
質問文のソースコードはコードタグで囲ってくださいな。

1,クライアント側の接続先 WebSocketサーバーをws://echo.websocket.org/に変更してクライアント側が正しくサーバーに接続できることを確認してくださいな。

2,サーバー側のマシンでコマンドプロンプトよりnetstat -anop tcpを実行してポート番号:8088で待ち受けているのを確認してくださいな。


3,サーバー側のコードが違います。
3-1,サーバー側のエンドポイント(/Laputa)がクライアント(/)と違います。
3-2,wssvがローカル変数(var)で宣言されています。

C#

1public class Program : MonoBehaviour { 2 private WebSocketServer wssv; 3 void Awake () { 4 wssv = new WebSocketServer(8088); 5 wssv.AddWebSocketService<Laputa>("/"); 6 wssv.Start(); 7 } 8}

投稿2018/04/20 11:18

編集2018/04/20 11:43
umyu

総合スコア5846

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

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

peter_kes

2018/04/21 02:37 編集

1,クライアント側 接続できました! Opended がコンソールに表示され、文字を送ったら Recieved 文字と帰ってきました。 2.TCP 0.0.0.0 8088 0.0.0.0 LISTENING 9806 がありました。 3.1 クライアント側を ws = new WebSocket("ws://localhost:8088/Laputa");にしたらつながりました!! 3.2 Awake()終了時点で wssvがスコープから抜けて消えてしまうということですね
peter_kes

2018/04/21 02:09

この実装は同じコンピューターをルータを介してローカルでやっていることなんですが、 二台の離れたコンピュータのときはそのコンピューターのリモートアドレスをいれないといけないんですよね?(例: ("ws://リモートのアドレス:8088/Laputa"); ) よければご教授お願いいたします。
umyu

2018/04/21 02:10

いろいろ確認ありがとうございます。 >3.2 Awake()終了時点で wssvがスコープから抜けて消えてしまうということですね はい、サーバーは最終的に停止する必要があるので、ローカル変数は避けたほうが無難です。
peter_kes

2018/04/21 02:15

なるほどです。ローカル変数にしないようにいたします。
umyu

2018/04/21 02:21

>この実装は同じコンピューターをルータを介してローカルでやっていることなんですが、 1,ここが少しちがいます。localhostの名前解決はdnsでルーターもしくは自身のDNSキャッシュを使っているますが、通信自体はループバックアドレス:127.0.0.1なのでルーターを介してません。 2,リモートアドレスを入れる件は、そうです。ルーターや接続先相手のファイアウォール(FW)に注意してくださいな。
peter_kes

2018/04/21 02:25

はああ、なるほどです。すごくわかりました。本当に御回答いただきありがとうございました。
peter_kes

2018/04/24 02:16

ws = new WebSocket("ws://localhost:8088/"); だと、同じLAN内でしかできません。 自分のPCのグローバルアドレスを入れたら接続ができません。 例えば自分のPCと友達のPCで通信する場合友達友達のグローバルアドレスが12.12.12.4だったとして ws = new WebSocket("ws://12.12.12.4:8088/");  としても接続できません。 これはサーバーを構築しないとできないんでしょうか?サーバーのなかでUnityを動かすってどうやったらいいんでしょうか?CGIしかサーバー側は実装したことがありません。
umyu

2018/04/24 02:22 編集

グローバルアドレスなので、上のコメントでも書いてますが、ルーターやFWで遮断されたのではないでしょうか? まず、ルーターのポート番号がTCPの8088で開いていることを確認してください。確認の仕方はルーターのマニュアルとかにポート解放の仕方が書いてあるはずです。(難易度少し高めですが)あとはUPnPを使ってポート解放を自作するとかですねー。
peter_kes

2018/04/24 04:33

再びすみません。ご回答ありがとうございます。セキュルテイソフトを止めて試しても駄目でした。 ルーター触ってみます。
peter_kes

2018/04/24 05:22

ルーター側触りました。 1.ポートの解放の設定場所がみつけられませんでしたが、フィルターされて廃棄されているパケットのポートリストに8088はありませんでした。 2. またIPv4ポートマッピングで自分のローカルIPアドレスへ8088のは来るように設定してみました。 ファイアーウォールで受信規則を追加し8088を許可する設定も追加いたしました。 セキュリテイプログラムのパケットルールにポートが8080のパケットを送受信できるように設定いたしました。 それでも接続できませんでした。
peter_kes

2018/04/24 05:27

ws = new WebSocket("ws://xxx.xxx.xxx.xxx:8088/Laputa"); がダメなんでしょうか?
umyu

2018/04/24 05:35

>peter_kesさんへ 1,まず、プログラムの問題ではなく、ネットワークの設定だと思うのですが。 2,普通のHTTPサーバーを試しに立ててみて、接続できるかどうかでしょうか。 3,疎通テストとして、ここを使ってみるとか、https://websocket.org/echo.html 4,Unityではなく普通の.net C#のプログラムで確認してみる。 5,Unityのフォーラムにソースコード付きで質問してみる。 最初の質問と問題ももう離れていますし、個人的にはネットワーク設定のサポートセンターではないので自力でなんとかしてほしいのですが。
peter_kes

2018/04/24 05:44

https://websocket.org/echo.htmlは、成功しています。 ちょっとumyuの親切な回答に甘えてしまいました。すみませんでした。コードじゃなくネットワークの設定がおかしいと確信が得ただけでもありがたいです。とりあえず、この質問はベストアンサーを選んでクローズします。4.は是非試してみたいと思います。色々御回答していただき本当に感謝してしております。ありがとうございました!(^^)!
guest

0

クライアント側に/Palutaをいれたら
ws = new WebSocket("ws://localhost:8088/Laputa");
解決いたしました!!!
本当にいつも回答してくださいましてありがとうございます。感謝しております!!!

投稿2018/04/21 02:11

peter_kes

総合スコア14

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問