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

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

ただいまの
回答率

90.48%

  • Unity

    4186questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • WebSocket

    173questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 842

peter_kes

score 4

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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

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();
    }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/21 11:05 編集

    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がスコープから抜けて消えてしまうということですね

    キャンセル

  • 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

    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しかサーバー側は実装したことがありません。

    キャンセル

  • 2018/04/24 11:22 編集

    グローバルアドレスなので、上のコメントでも書いてますが、ルーターやFWで遮断されたのではないでしょうか?
    まず、ルーターのポート番号が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

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

    キャンセル

  • 2018/04/24 14:35

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

    最初の質問と問題ももう離れていますし、個人的にはネットワーク設定のサポートセンターではないので自力でなんとかしてほしいのですが。

    キャンセル

  • 2018/04/24 14:44

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Unity

    4186questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • WebSocket

    173questions

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