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

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

ただいまの
回答率

88.22%

unityのwebsocket通信

受付中

回答 0

投稿

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

miiichat

score 70

まずこれを送ります。
① request: {"request":"RoomRequest","requestID":9292311,"roomID":0,"data":""}
ルームがなければこれが返ってきます。
② receive: {"request":"wait","requestID":9292311,"roomID":26027549}
2人目
③ request: {"request":"RoomRequest","requestID":1422276,"roomID":0,"data":""}

④ receive{"request":"connect","requestID":1422276,"roomID":26027549}
⑤ receive{"request":"connect","requestID":9292311,"roomID":26027549}

ws.OnMessage += (object sender, MessageEventArgs e) => {
            Debug.Log("receive: " + e.Data);


2人目はうまくいきますが、(④⑤どちらもdebugに出てくる)
1人目は、うまくいきません。debugに表示されません。


ひとつ前の質問でwebsocketのOnMessageでtextを操作するために
(UIとかTextとかはメインスレッド?じゃないとエラーらしいので)

SynchronizationContext context;
void Start()
    {
        context = SynchronizationContext.Current;
    }

・
・
・
context.Post(__ =>
{
    changeRoomID(data.roomID);
}, null);
context.Post(__ =>
{
    changeRoomStatus("wait");
}, null);


SynchronizationContext のことをよくも知らずに使ったんですが、これが原因だったりしますか?
④と⑤の送信する順番を変えても変化なしでした。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using WebSocketSharp;
using UniRx;
using System;
using System.Text.RegularExpressions;
using System.Linq;
using System.Threading;
[Serializable]
public class JsonData
{
  public string request;
  public int requestID;
  public int roomID;
  public string data;
}



public class PositionSync : MonoBehaviour {

    [SerializeField] private string _serverAddress;
    [SerializeField] private int _port;

    [SerializeField] private Transform _syncObjTransform;   //Share transform

    [SerializeField] private SyncPhase _nowPhase;

    private WebSocket ws;
    private int roomID;
    private int requestID;
    private string roomStatus;
    public Text messageText;
    public Text requestidtx;
    public Text roomidtx;
    public Text roomStatusTx;
    public int testint = 10;
    SynchronizationContext context;
    public enum SyncPhase {
        Idling,
        Syncing
    }

    void Start()
    {
        context = SynchronizationContext.Current;
    }

    private void Awake() {
    }

    public void OnSyncStartButtonDown() {
        var ca = "ws://192.168.33.11:8080";
        Debug.Log("Connect to " + ca);
        ws = new WebSocket(ca);

        ws.OnMessage += (object sender, MessageEventArgs e) => {
            Debug.Log("receive: " + e.Data);
            JsonData data = JsonUtility.FromJson<JsonData>(e.Data);
            if (requestID == data.requestID)
            {
            }
            if (data.request == "wait")
            {
                if (data.requestID == requestID)
                {
                    context.Post(__ =>
                    {
                        changeRoomID(data.roomID);
                    }, null);
                    context.Post(__ =>
                    {
                        changeRoomStatus("wait");
                    }, null);

                }
            } else if (data.request == "connect")
            {
                if (requestID == data.requestID)
                {
                  context.Post(__ =>
                  {
                      changeRoomStatus("connect");
                  }, null);
                  context.Post(__ =>
                  {
                      changeRoomID(data.roomID);
                  }, null);
                }
            } else if (data.request == "roomMessage")
            {
                if (data.roomID == roomID)
                {
                    print(data.data);
                }
            }
        };

        ws.OnError += (sender, e) => {
            _nowPhase = SyncPhase.Idling;
        };

        ws.OnClose += (sender, e) => {
        };

        ws.Connect();

        _nowPhase = SyncPhase.Syncing;
    }

    public void OnSyncStopButtonDown() {
        ws.Close();
    }

    public void intoRoom()
    {
        if (_nowPhase == SyncPhase.Syncing && roomStatus != "wait")
        {
            JsonData data = new JsonData();
            data.request = "RoomRequest";
            changeRequestID(UnityEngine.Random.Range(0, 9999999));
            data.requestID = requestID;
            ws.Send(JsonUtility.ToJson(data));
        }
    }

    public void sendRoomMessage(string message)
    {
        JsonData data = new JsonData();
        data.request = "roomMessage";
        data.roomID = roomID;
        data.data = message;
        ws.Send(JsonUtility.ToJson(data));
    }

    public void onPushSendButton()
    {
        if (_nowPhase == SyncPhase.Syncing && roomStatus == "connect")
        {
            sentRoomMessage(messageText.text);
        }
    }

    public void clear()
    {
        JsonData data = new JsonData();
        data.request = "databaseclear";
        changeRoomID(-1);
        changeRequestID(-1);
        changeRoomStatus("");
        messageText.text = "";
        Debug.Log("clear" + JsonUtility.ToJson(data));
        ws.Send(JsonUtility.ToJson(data));
    }

    public void changeRequestID(int i)
    {
      Text REQUESTIDTEXT = GameObject.Find("requestidtx").GetComponent<Text>();
      requestID = i;
      REQUESTIDTEXT.text = i.ToString();
    }

    public void changeRoomStatus(string s)
    {
      Text ROOMSTATUSTEXT = GameObject.Find("roomStatusTx").GetComponent<Text>();
      roomStatus = s;
      ROOMSTATUSTEXT.text = s;
    }

    public void changeRoomID(int i)
    {
      Text ROOMIDTEXT = GameObject.Find("roomidtx").GetComponent<Text>();
      roomID = i;
      ROOMIDTEXT.text = i.ToString();
    }
}
var WebSocketServer = require('ws').Server
var mongoClient = require('mongodb').MongoClient;
var assert = require('assert');


const url = 'mongodb://127.0.0.1:27017';
const dbName = 'unity_node';
var db;
mongoClient.connect(url, { useNewUrlParser: true }, function(err, client) {
  assert.equal(null, err);
  console.log("Connected correctly to server");

  db = client.db(dbName);
});


const waitRoom = function(db, requestID, callback) {
  const collection = db.collection('rooms');
  var roomID = makeRoomID(8);
  collection.insertMany([
    {status : "wait", roomid: roomID, requestID: requestID}
  ], function(err, result) {
    assert.equal(err, null);
    assert.equal(1, result.result.n);
    assert.equal(1, result.ops.length);
    console.log("Inserted 1 documents into the collection");
    callback(roomID);
  });
}
//ルームの数
const waitPlayerLength = function(db, callback) {
  const collection = db.collection('rooms');
  collection.find({'status': "wait"}).toArray(function(err, users) {
    assert.equal(err, null);
    callback(users.length);
  });
}
//とりあえず一番最初のものを
const findRoomreturnID = function(db, callback) {
  const collection = db.collection('rooms');
  collection.find({'status': "wait"}).toArray(function(err, docs) {
    collection.deleteOne({ "roomid" : docs[0]["roomid"] }, function(err, result) {
      assert.equal(err, null);
      assert.equal(1, result.result.n);
      console.log("Removed the " + docs[0]["roomid"]);
      callback(docs[0]["roomid"], docs[0]["requestID"]);
    });
  });
}

function makeRoomID (i) {
    var ID = Math.round(Math.random() * (10 ** i));
    return ID;
}

var wss = new WebSocketServer({
    host: '192.168.33.11',
    port: process.env.PORT || 8080
});

wss.on('connection', function(ws) {
    console.log("connect");


    ws.on('message', function(message) {
        console.log('received: %s', message);
        const { request, requestID, roomID, data } = JSON.parse(message);

        if (request == "RoomRequest") {
            waitPlayerLength(db, function(length) {
                console.log("length" + length);
                if (length <= 0) {
                    console.log("databaselength <= 0");
                    waitRoom (db, requestID, function(roomID){
                        ws.send(JSON.stringify({
                            request: "wait",
                            requestID: requestID,
                            roomID: roomID,
                        }));
                    });
                } else if (length >= 1) {
                    console.log("databaselength >= 1");
                    findRoomreturnID (db, function(roomID, roomhostRequestID) {
                        console.log("databaselength > 1");
                        ws.send(JSON.stringify({
                            request: "connect",
                            requestID: roomhostRequestID,
                            roomID: roomID,
                        }));
                        ws.send(JSON.stringify({
                            request: "connect",
                            requestID: requestID,
                            roomID: roomID,
                        }));
                }
            });
        }

        if (request === "roomMessage")
        {
            wss.clients.forEach(client => {
                if (client !== ws)
                    client.send(JSON.stringify({
                        request: "roomMessage",
                        roomID: roomID,
                        data: data
                    }));
            });
        }

        if (request === "databaseclear")
        {
            const collection = db.collection('rooms');
            collection.deleteMany({}, function(err, result) {
            assert.equal(err, null);
            console.log("Removed the all");
          });
        }

    });
});
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

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

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

    詳細な説明はこちら

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

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

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

まだ回答がついていません

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

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

関連した質問

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