【问题标题】:Reading data from StreamSocket only works on desktop, not on phone (Universal Windows App)从 StreamSocket 读取数据仅适用于桌面,不适用于手机(通用 Windows 应用程序)
【发布时间】:2016-03-23 19:17:12
【问题描述】:

在创建套接字并从中读取数据时,我尝试创建的 UWP 应用程序有一个奇怪的问题。这是基本场景:

_commandSocket = new StreamSocket();
await _commandSocket.ConnectAsync(new HostName("192.168.1.1"), "15740", SocketProtectionLevel.PlainSocket);
_commandOutput = _commandSocket.OutputStream;
_commandInput = _commandSocket.InputStream;
await _commandOutput.WriteAsync(initCommandBuffer);
var lengthBytes = new byte[4].AsBuffer();
await input.ReadAsync(lengthBytes, 4, InputStreamOptions.None);
etc..etc...etc...

我基本上是在打开一个套接字并向我的设备发送一个初始化命令。这个想法是它会首先将回复的长度作为 uint 发送给我。

当我在桌面上调试/运行应用程序时,这一切都运行良好,但如果我尝试在我的 Window 10 移动设备(诺基亚 930)上运行它,似乎没有读取一个字节(我试过读取 1 个字节而不是 4 个)。由于应用程序开发应该是“通用的”并且它在我的桌面上完美运行,我不知道从哪里开始解决这个问题。

在移动设备上打开连接有效,发送初始化命令时我也没有收到任何错误,它只是一直阻塞等待 ReadAsync 命令(好像什么都没有发回)。

我对要连接的设备没有任何影响,但同样,因为这一切都在桌面上完美运行,并且设备不知道是谁在问我,所以我很无能。

【问题讨论】:

  • 远程设备是否有可能一次只允许一个连接(您的桌面)而忽略电话? (尝试从另一个桌面运行以验证)。此外,手机可能正在尝试使用蜂窝网络而不是 WiFi(只是猜测 - 尝试关闭蜂窝数据)。
  • 该设备肯定一次只允许一个连接,但没有其他设备尝试连接它。如果不允许我连接到它,我也会期望打开套接字时出错。出于同样的原因,我也不认为打开蜂窝网络会产生任何影响,但我今晚会试试看。
  • 老兄!太疯狂了。关闭蜂窝 (4G) 网络,只保留 WiFi 就可以了。我现在仍然不明白的是,仅打开 4G 并关闭 WiFi 我仍然可以连接到 192.168.1.1。在那种情况下我连接到什么!?!?那是4G网络上的本地地址???剩下要做的一件事:如何强制我的程序使用 WiFi 而不是 4G 连接?
  • 不知道我在 4G 网络上连接到 192.168.1.1 的内容,但使用 var profiles = NetworkInformation.GetConnectionProfiles(); var wifiProfile = profiles.ToArray().First(p => p.IsWlanConnectionProfile); _networkAdapter = wifiProfile.NetworkAdapter;我得到了可以传递到流套接字的 NetworkAdapter。这一切都可以通过搜索 SSID 或我猜的东西来完成,但这是以后要弄清楚的事情。现在这个问题解决了!谢谢!
  • 很高兴它成功了。我不知道神奇的蜂窝网络使用什么:-)

标签: win-universal-app windows-10-universal asyncsocket windows-10-mobile


【解决方案1】:

无法确定我的答案,因为我只在模拟器上进行了测试,但我使用了流套接字侦听器。

        private async void StartServer()
    {
        int Port = 80;
        try
        {
            //Bound to port 80
            await listener.BindServiceNameAsync(Port.ToString());
        }
        catch (System.Runtime.InteropServices.COMException)
        {
            //Port 80 for communication is blocked.
        }

        listener.ConnectionReceived += async (s, e) =>
        {
            using (IInputStream input = e.Socket.InputStream)
            {
                var buffer = new Windows.Storage.Streams.Buffer(200);
                await input.ReadAsync(buffer, buffer.Capacity, InputStreamOptions.Partial);
                //reads incoming stream
                string data = Encoding.ASCII.GetString(buffer.ToArray(), 0, (int) buffer.Length);
            }

            using (IOutputStream output = e.Socket.OutputStream)
            {
                using (Stream response = output.AsStreamForWrite())
                {
                    response.Write(Encoding.ASCII.GetBytes("Response."), 0, 1);
                }
            }
        };
    }

【讨论】:

  • 看不到你做任何不同的事情。我也在使用流套接字,但没有使用侦听器,因为我充当的是客户端而不是服务器。
猜你喜欢
  • 1970-01-01
  • 2016-02-07
  • 2019-05-06
  • 1970-01-01
  • 1970-01-01
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多