zoukankan      html  css  js  c++  java
  • WP10通过StreamSocket连接C++服务器

    注:当服务端和手机模拟器运行在一台机器时,会有奇怪错误。将服务端放在其它机器上更改客户端连接地址,运行正常。或者直接用本机modern调试也可以。
    实例化一个对象

    StreamSocket _client = new StreamSocket();
    Byte[] recvBuf= new Byte[8096];
    Byte[] sendBuf= new Byte[8096];

    建立连接:

    async void connect()
    {
        try
        {
            //设置服务器IP
            HostName serverHost = new HostName("127.0.0.1");
            //设置服务器端口号
            await _client.ConnectAsync(serverHost, 5000);  
        }
        catch (Exception e)
        {
            Debug.WriteLine(e);
            _client.Dispose();
            _client = null;
        }
    }

    接收和发送数据
    由于Socket通信从本质上说是数据流的传输,即byte类型,StreamSocket使用DataReader类和DataWriter类来接收和发送数据流,两个类封装了不少实用的方法,但归根结底是对byte类型数据读取和发送的封装。
    为了能够发送汉字,必须使用unicode编码。
    C++发送数据:
    为了能够发送汉字,必须将数据转换为wchar_t.

        wstring wstr = str_to_wstr(str);
        send(m_sock, (char*)wstr.c_str(), wstr.size()*2, 0);

    C#接收数据:

        _reader = new DataReader(_client.InputStream);
        _reader.InputStreamOptions = InputStreamOptions.Partial;
    
        uint count = await _reader.LoadAsync(8096);
        _reader.ReadBytes(recvBuf);
        string msg = Encoding.Unicode.GetString(recvBuf);

    C#发送数据:

        string strSend="xxxx";
        _writer = new DataWriter(_client.OutputStream);
        sendBuf= Encoding.Unicode.GetBytes(strSend);
        _writer.WriteBytes(sendBuf);
        await _writer.StoreAsync();
        _writer.DetachStream();
        _writer.Dispose(); 

    C++接收数据:

        //按照以往方式接收数据,存放到char* buf中,然后转换
        wstring msg = dchar_to_wchar(buf);
        //转换函数可以这样写
        wstring dchar_to_wchar(char* source)
        {
            wchar_t* p =reinterpret_cast<wchar_t*>(source);
            return wstring(p);
        }

    C#中断连接:

        clientSocket.Dispose();
        clientSocket = null;

    此处有坑:
    当使用async/await异步发送消息,然后再用async/await异步接收消息,虽然C++服务器返回了信息,但datareader.LoadAsync(int)会出各种错。主要是:datareader.LoadAsync(int)不返回,一直卡在那个这个函数等。
    解决方法:
    确认发送消息完成后再接收消息。

  • 相关阅读:
    利用JasperReport+iReport进行Web报表开发
    EEPlat PaaS VS Saleforce force.com
    Python用subprocess的Popen来调用系统命令
    最短路径A*算法原理及java代码实现(看不懂是我的失败)
    Java抓取网页数据(原网页+Javascript返回数据)
    Atitit.dwr3 不能显示错误具体信息的解决方式,控件显示错误具体信息的解决方式 java .net php
    白话经典算法系列之五 归并排序的实现
    poj 百练 2765 八进制小数(精度问题)
    winzip15.0注冊码
    Python:渗透测试开源项目
  • 原文地址:https://www.cnblogs.com/ggzone/p/10121274.html
Copyright © 2011-2022 走看看