你要单个app内通讯还是多个app内通讯

Hololens支持单机版的C/S架构的进程之间通信吗?

    win10 里使用 socket需要用 Windows.Networking下的类库实现,我们如果直接在Unity C# 脚本里 using Windows.Networking是不可以的,Unity编辑器在编译的时候是不能通过的。Windows.Networking 这是属于 WinRT API,只有在VS里才能被编译。

    所以,如果要在Unity开发HoloLens程序使用 WinRT API 需要用 #if WINDOWS_UWP …… #endif 对相应的代码进行包裹,这样在Unity里就不会报错,build后再VS里再编译打包

    可以尝试类似如下代码实现socket

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    #if WINDOWS_UWP
    using Windows.Networking;
    using Windows.Networking.Sockets;
    using Windows.Storage.Streams;
    #endif
    
    public class Socket : MonoBehaviour
    {
    #if WINDOWS_UWP
        StreamSocket socket;
        StreamSocketListener listener;
        String port;
    #endif
    
        // Use this for initialization
        void Start()
        {
    #if WINDOWS_UWP
            listener = new StreamSocketListener();
            port = "8888";
            listener.ConnectionReceived += Listener_ConnectionReceived;
            listener.Control.KeepAlive = false;
    
            Listener_Start();
    #endif
        }
    
    #if WINDOWS_UWP
            private async void Listener_Start()
        {
            Debug.Log("Listener started");
            try
            {
                await listener.BindServiceNameAsync(port);
            }
            catch (Exception e)
            {
                Debug.Log("Error: " + e.Message);
            }
    
            Debug.Log("Listening");
        }
    
        private async void Listener_ConnectionReceived(StreamSocketListener sender, StreamSocketListenerConnectionReceivedEventArgs args)
        {
            Debug.Log("Connection received");
            DataReader reader = new DataReader(args.Socket.InputStream);
            try
            {
                while (true)
                {
                    // Read first 4 bytes (length of the subsequent string). 
                    uint sizeFieldCount = await reader.LoadAsync(sizeof(uint));
                    if (sizeFieldCount != sizeof(uint))
                    {
                        // The underlying socket was closed before we were able to read the whole data. 
                        return;
                    }
    
                    // Read the string. 
                    uint stringLength = reader.ReadUInt32();
                    uint actualStringLength = await reader.LoadAsync(stringLength);
                    if (stringLength != actualStringLength)
                    {
                        // The underlying socket was closed before we were able to read the whole data.
                        return;
                    }
    
                    // dump data
                    Debug.Log("Received: " + reader.ReadString(actualStringLength));
                }
            }
            catch (Exception exception)
            {
                // If this is an unknown status it means that the error is fatal and retry will likely fail. 
                if (SocketError.GetStatus(exception.HResult) == SocketErrorStatus.Unknown)
                {
                    throw;
                }
    
                // dump data
                Debug.Log("Read Stream failed: " + exception.Message);
            }
        }
    #endif
        // Update is called once per frame
        void Update()
        {
    
        }
    }
      18 天 后

      你好 streamSocket 已经连上服务器了 但是 socket listener.ConnectionReceived 却没反应 服务端是用C# Socket写的 发消息 收消息都不行

        2 个月 后

        @Holo.X#1104 问题解决了吗,能否告知如何解决


        祥哥 这个是服务器端的代码吧,能否告知客户端该怎么写啊?对streamSocket完全不熟悉。


        @Holo.X#1104 这个hololens不行吧?


        祥哥 客户端这个怎么写啊?打扰了,一定要告诉我,拜托了。

        15110247174 你说下具体的需求想实现什么样的网络交互?


        15110247174
        如果你是要用http协议访问网络的话,那么UnityEngine.WWW类就是个不错的选择

        如果你是做设备间互相共享数据,比如网络游戏那样的,用Unity的网络引擎UNET,在 Component->Networking 里可以看到相关组件

        15110247174
        如果你是要用http协议访问网络的话,那么UnityEngine.WWW类就是个不错的选择

        如果你是做设备间互相共享数据,比如网络游戏那样的,用Unity的网络引擎UNET,在 Component->Networking 里可以看到相关组件

        image https://mshololens.cn/assets/images/1-MUgwYsmMNquKJTlK.png

                    
        Unity
        3D多人游戏(一) : UNET快速入门—在线播放—优酷网,视频高清在线观看 http://v.youku.com/v_show/id_XMTQ1MTc3Nzk1Mg==.html Unity3D多人游戏(二) : UNET服务器指令与变量同步—在线播放—优酷网,视频高清在线观看 http://v.youku.com/v_show/id_XMTQ1NTcxNzA0OA==.html

          Unity3D多人游戏(一) : UNET快速入门

          Unity3D多人游戏(二) : UNET服务器指令与变量同步


          UNET 不仅提供了快速建立多人游戏共享的High-Level API,也支持传输层的Low-Level API给开发者用来设计自己的socket协议,
          https://docs.unity3d.com/Manual/UNetUsingTransport.html
          手册里有例子,怎么创建Server和client,以及如何收发数据包

            祥哥 服务器是php写的,是采集一些设备的数据,客户端是在hololens进行数据的展示,要走socket或websocket,我之前也看了一些unity networking的资料,但我感觉这个适合服务器端也是unity的开发。

              5 个月 后

              您好,我想请问 在客户端里想一直接受服务器发来的数据要怎么做呢,exe可以用thread线程
              但是在 uwp框架下发布编译器报错,无法编译
              网上搜需要用task,但是在unity3d应用using System.Threading.Tasks;
              又显示没有这样的头文件...很困惑...求帮助谢谢


              祥哥 您好,我想请问 在客户端里想一直接受服务器发来的数据要怎么做呢,exe可以用thread线程
              但是在 uwp框架下发布编译器报错,无法编译
              网上搜需要用task,但是在unity3d应用using System.Threading.Tasks;
              又显示没有这样的头文件...很困惑...求帮助谢谢

                连接服务器后用协程的方式死循环收消息,收到消息进行回调,用事件也行


                quxichao 不知道是不是回答了你的问题,还有就是自己这个dll来调用

                祥哥 恩恩,我尝试自己调用dll实现。。但是


                祥哥 恩恩,我在尝试使用dll实现。然后在使用您的示例代码的学习中,我在u3d发布成pc程序成功,但是发布成uwp平台下程序,报错 'Socket' does not contain a definition for 'Send' and no extension method 'Send' accepting a first argument of type 'Socket' could be found,Accept、Receive都说不包含。。祥哥您知道这是什么问题吗

                4 个月 后
                1 个月 后
                11 天 后

                祥哥 请问大佬, vs2017 Unity 2017.3.0f3 ,win10 SDK 1.0.17134.0, UnityEngine.WWW 访问Web服务器失败.查不出问题.Unity中正常,部署后就不行.

                  3 个月 后
                  说点什么...
                  鄂ICP备16012034号-1