Xamarin Forms PCL Socket插件没有从wifi卡接收数据

时间:2017-01-23 11:25:24

标签: c# sockets xamarin xamarin.forms portable-class-library

我需要将带有内置wifi卡的Android设备的Xamarin表格pcl或者两者都连接到tcp客户端。 事实是连接已经完成,写作也是如此,但我无法读取返回给我的数据。 我通常使用serial,我不希望它是因为我无法通过tcp读取的超时。

任何人都可以给我一些建议,我的意思是很少。 我正在使用这个插件Xamarin表单pcl来连接。

如果有人有任何其他解决方案,请告诉我。我想直接使用Socket,但我无法进入visual studio中的Systems.Net.Socket库。

private async void testTCPSocketPlugin()
    {
        int port = 5555;
        String ip = "192.168.222.1";

        TcpSocketListener listener = new TcpSocketListener();

        await listener.StartListeningAsync(5555);
        listener.ConnectionReceived += Listener_ConnectionReceived;

        try
        {
            await client.ConnectAsync(ip, port);

            //listener.ConnectionReceived += async (sender, args) =>
            //{
            //    var clientListener = args.SocketClient;

            //    var bytesRead = -1;
            //    var buf = new byte[1];

            //    while (bytesRead != 0)
            //    {
            //        bytesRead = await args.SocketClient.ReadStream.ReadAsync(buf, 0, 1);
            //        if (bytesRead > 0)
            //        {

            //        }
            //        //Debug.Write(buf[0]);
            //    }
            //};
        }
        catch (Exception ex)
        {
            throw ex;
        }

        //byte[] array1 = null;
        Byte[] dati = new Byte[8];
        dati[0] = 1;
        dati[1] = 8;
        dati[2] = 0;
        dati[3] = 0;
        dati[4] = 0;
        dati[5] = 0;
        dati[6] = 0xe0;
        dati[7] = 0x0b;

        Byte[] fromBoard = new Byte[8];

        try
        {
            await client.WriteStream.WriteAsync(dati, 0, 8);

            client.ReadStream.ReadTimeout = 5000;

            Stream str = client.ReadStream;
            int testInt = await client.ReadStream.ReadAsync(fromBoard, 0, 8);
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    private void Listener_ConnectionReceived(object sender, Sockets.Plugin.Abstractions.TcpSocketListenerConnectEventArgs e)
    {
        String test = "break here";
    }

1 个答案:

答案 0 :(得分:1)

好的,你的代码中有一些错误的东西,我会尝试指出所有这些。

首先,你将客户端和服务器代码混合在一个函数中,这非常令人困惑,即使这只是一个测试,所以首先将代码分成两个函数,它将更具可读性。 / p>

其次,您的客户端在服务器监听之前尝试连接和写入:

    try
    {
        await client.ConnectAsync(ip, port);
    }
    catch (Exception ex)
    {
        throw ex;
    }

    //...

        await client.WriteStream.WriteAsync(dati, 0, 8);

        await listener.StartListeningAsync(5555);         

这将使连接失败,在启动客户端之前服务器必须正在侦听。你声明连接已经建立,但我怀疑它,除非你执行两次调用,如果前一个服务器仍然在监听,第二次它将工作。

接下来,在挂钩事件之前调用await listener.StartListeningAsync(5555);,这不是非常有害,但如果由于某种原因客户端在服务器启动时尝试连接,那么可能该连接将丢失,因为它会在没有附加到事件处理程序之前接受。

之后,您尝试从客户端流中读取,但服务器没有发送任何内容,因此代码将在int testInt = await client.ReadStream.ReadAsync(fromBoard, 0, 8);处阻塞,直到它抛出读取异常,因为它将达到超时。

最后,如果您更喜欢纯本机解决方案,您可以在共享库上创建客户端/服务器代码,在iOS / Android项目上引用该库,在这些项目上创建DependencyService,然后在PCL库上检索服务这样你就可以完全控制代码。

更新:

似乎你根本没有使用任何服务器功能,试试这个:

async void Call()
{
    TcpSocketClient client = new TcpSocketClient();
    await client.ConnectAsync("192.168.222.1", 5555);

    byte[] Data = new byte[] { 0x01, 0x08, 0, 0, 0, 0, 0xe0, 0x0b }

    await client.WriteStream.WriteAsync(Data, 0, 8);
    byte[] finalData = new byte[8];
    int read = await client.ReadStream.ReadAsync(finalData, 0, 8);

    //Check here, read will have the number of bytes read.
}

不要添加任何try / catch,如果抛出任何异常,请更新问题。