WebsocketSharpプラグインをつかって通信を成功させたいのですが、
ほぼサンプルのコードのままなのに、sendでメッセージを送ると
InvalidOperationException: The current state of the connection is not Open.
と出てしまいます。
これがコードになります。
Client側
<code>
using System;
using System.Collections.Generic;
using UnityEngine;
using WebSocketSharp;
public class WebsocketAccessor : MonoBehaviour
{
private WebSocket ws;
void Start()
{
ws = new WebSocket("ws://localhost:8088/");
ws.OnOpen += (sender, e) =>
{
Debug.Log("Opended");
};
ws.OnMessage += (sender, e) =>
{
Debug.Log("Received " + e.Data);
};
ws.OnError += (sender, e) =>
{
Debug.Log("ERROR");
};
ws.Connect ();
}
public void StartSend(string message)
{
// 送るボタンを押すと入力された文字列データを送信する
ws.Send (message);
}
private void OnDestroy()
{
// 接続を切る.
ws.Close();
}
}
サーバー側
<code>
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using WebSocketSharp;
using WebSocketSharp.Server;
//exmample
public class Program : MonoBehaviour {
void Awake () {
//var wssv = new WebSocketServer ("ws://dragonsnest.far");
var wssv = new WebSocketServer (8088);
wssv.AddWebSocketService<Laputa> ("/Laputa");
wssv.Start ();
//Console.ReadKey (true);
//wssv.Stop ();
}
}
―――――――---------------------------------
using System;
using WebSocketSharp;
using WebSocketSharp.Server;
using UnityEngine;
//example
public class Laputa : WebSocketBehavior{
protected override void OnOpen()
{
Debug.Log ("opend");
}
protected override void OnMessage (MessageEventArgs e)
{
var msg = e.Data == "BALUS"
? "I've been balused already..."
: "I'm not available now.";
Send (msg);
}
}
Open というメッセージがでないので Openになっていないのですが、
どうしてOpenにならないのでしょうか?
PCで何か設定しないとブロックされてしまっているのでしょうか?
ws = new WebSocket("ws://localhost:8088/"); URLとポートがおかしいんでしょうか?
ご教授お願いいたします。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
あんまりコード読んでないです。
お願い
質問文のソースコードはコードタグで囲ってくださいな。
1,クライアント側の接続先 WebSocketサーバーをws://echo.websocket.org/
に変更してクライアント側が正しくサーバーに接続できることを確認してくださいな。
2,サーバー側のマシンでコマンドプロンプトよりnetstat -anop tcpを実行してポート番号:8088で待ち受けているのを確認してくださいな。
3,サーバー側のコードが違います。
3-1,サーバー側のエンドポイント(/Laputa
)がクライアント(/
)と違います。
3-2,wssv
がローカル変数(var
)で宣言されています。
public class Program : MonoBehaviour {
private WebSocketServer wssv;
void Awake () {
wssv = new WebSocketServer(8088);
wssv.AddWebSocketService<Laputa>("/");
wssv.Start();
}
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
クライアント側に/Palutaをいれたら
ws = new WebSocket("ws://localhost:8088/Laputa");
解決いたしました!!!
本当にいつも回答してくださいましてありがとうございます。感謝しております!!!
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.22%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2018/04/21 11:05 編集
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がスコープから抜けて消えてしまうということですね
2018/04/21 11:09
二台の離れたコンピュータのときはそのコンピューターのリモートアドレスをいれないといけないんですよね?(例: ("ws://リモートのアドレス:8088/Laputa"); ) よければご教授お願いいたします。
2018/04/21 11:10
>3.2 Awake()終了時点で wssvがスコープから抜けて消えてしまうということですね
はい、サーバーは最終的に停止する必要があるので、ローカル変数は避けたほうが無難です。
2018/04/21 11:15
2018/04/21 11:21
1,ここが少しちがいます。localhostの名前解決はdnsでルーターもしくは自身のDNSキャッシュを使っているますが、通信自体はループバックアドレス:127.0.0.1なのでルーターを介してません。
2,リモートアドレスを入れる件は、そうです。ルーターや接続先相手のファイアウォール(FW)に注意してくださいな。
2018/04/21 11:25
2018/04/24 11:16
自分のPCのグローバルアドレスを入れたら接続ができません。
例えば自分のPCと友達のPCで通信する場合友達友達のグローバルアドレスが12.12.12.4だったとして
ws = new WebSocket("ws://12.12.12.4:8088/");
としても接続できません。
これはサーバーを構築しないとできないんでしょうか?サーバーのなかでUnityを動かすってどうやったらいいんでしょうか?CGIしかサーバー側は実装したことがありません。
2018/04/24 11:22 編集
まず、ルーターのポート番号がTCPの8088で開いていることを確認してください。確認の仕方はルーターのマニュアルとかにポート解放の仕方が書いてあるはずです。(難易度少し高めですが)あとはUPnPを使ってポート解放を自作するとかですねー。
2018/04/24 13:33
ルーター触ってみます。
2018/04/24 14:22
1.ポートの解放の設定場所がみつけられませんでしたが、フィルターされて廃棄されているパケットのポートリストに8088はありませんでした。
2. またIPv4ポートマッピングで自分のローカルIPアドレスへ8088のは来るように設定してみました。
ファイアーウォールで受信規則を追加し8088を許可する設定も追加いたしました。
セキュリテイプログラムのパケットルールにポートが8080のパケットを送受信できるように設定いたしました。
それでも接続できませんでした。
2018/04/24 14:27
2018/04/24 14:35
1,まず、プログラムの問題ではなく、ネットワークの設定だと思うのですが。
2,普通のHTTPサーバーを試しに立ててみて、接続できるかどうかでしょうか。
3,疎通テストとして、ここを使ってみるとか、https://websocket.org/echo.html
4,Unityではなく普通の.net C#のプログラムで確認してみる。
5,Unityのフォーラムにソースコード付きで質問してみる。
最初の質問と問題ももう離れていますし、個人的にはネットワーク設定のサポートセンターではないので自力でなんとかしてほしいのですが。
2018/04/24 14:44
ちょっとumyuの親切な回答に甘えてしまいました。すみませんでした。コードじゃなくネットワークの設定がおかしいと確信が得ただけでもありがたいです。とりあえず、この質問はベストアンサーを選んでクローズします。4.は是非試してみたいと思います。色々御回答していただき本当に感謝してしております。ありがとうございました!(^^)!