注:当服务端和手机模拟器运行在一台机器时,会有奇怪错误。将服务端放在其它机器上更改客户端连接地址,运行正常。或者直接用本机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)不返回,一直卡在那个这个函数等。
解决方法:
确认发送消息完成后再接收消息。