Windows phone 8 学习笔记(3) 通信(转)

摘要:
Windowsphone8可利用的数据通信方式比较广泛,在硬件支持的前提下,我们可以利用WiFi、蓝牙、临近感应等多种方式。快速导航:一、WP8套接字二、蓝牙三、NFC四、获取网络状态五、访问web的几种方式一、WP8套接字1)创建套接字客户端Windowsphone8中的套接字并不支持发布服务端,我们只能利用它在手机上创建套接字客户端,我们在此例中要用套接字去访问web服务器。

Windows phone 8 可利用的数据通信方式比较广泛,在硬件支持的前提下,我们可以利用WiFi、蓝牙、临近感应等多种方式。数据交互一般通过套接字来完成,我们将在本文详细的分析。

快速导航:
一、WP8套接字
二、蓝牙
三、NFC
四、获取网络状态
五、访问web的几种方式

一、WP8套接字

1)创建套接字客户端

Windows phone 8中的套接字并不支持发布服务端,我们只能利用它在手机上创建套接字客户端,我们在此例中要用套接字去访问web服务器。首先,我们定义一个SocketClient来表示套接字客户端。

[C#]

publicclassSocketClient

{

//缓存套接字对象以便在整个生命周期重用

Socket _socket = null;

// 信号通知对象,用于异步操作完成通知

staticManualResetEvent _clientDone = newManualResetEvent(false);

/// <summary>

/// 为每个异步调用设置超时时间

/// </summary>

constintTIMEOUT_MILLISECONDS = 30000;

/// <summary>

/// 数据缓冲区大小

/// </summary>

constintMAX_BUFFER_SIZE = 2048 * 100;

/// <summary>

/// 关闭套接字连接和释放所有相关的资源

/// </summary>

publicvoidClose()

{

if(_socket != null)

{

_socket.Close();

}

}

}

这个客户端包含连接服务器、发送信息和接受信息三个方法。我们将如下代码加入SocketClient类:
连接:
[C#]

/// <summary>

/// 尝试用TCP套接字连接到指定主机端口

/// </summary>

/// <param name="hostName">主机名</param>

/// <param name="portNumber">端口号</param>

/// <returns>描述连接结果</returns>

publicstringConnect(stringhostName, intportNumber)

{

stringresult = string.Empty;

//创建一个终结点,主机名、端口号

DnsEndPoint hostEntry = newDnsEndPoint(hostName, portNumber);

//创建一个基于流,TCP套接字。

_socket = newSocket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

//套接字上下文

SocketAsyncEventArgs socketEventArg = newSocketAsyncEventArgs();

socketEventArg.RemoteEndPoint = hostEntry;

socketEventArg.Completed += newEventHandler<SocketAsyncEventArgs>(delegate(objects, SocketAsyncEventArgs e)

{

//执行的状态信息

result = e.SocketError.ToString();

//将当前线程设置为收到信息状态,这样被阻止的线程可以继续执行

_clientDone.Set();

});

//标识当前进程为未收到信息状态

_clientDone.Reset();

// 发送一个异步连接请求

_socket.ConnectAsync(socketEventArg);

//将当前线程阻止,直到当前线程收到信息或者超时时间已到

_clientDone.WaitOne(TIMEOUT_MILLISECONDS);

returnresult;

}

发送消息:
[C#]

/// <summary>

/// 向连接的服务器发送信息

/// </summary>

/// <param name="data">数据正文</param>

/// <returns>反馈</returns>

publicstringSend(stringdata)

{

stringresponse = "操作超时";

//套接字是否准备好

if(_socket != null)

{

//套接字上下文

SocketAsyncEventArgs socketEventArg = newSocketAsyncEventArgs();

socketEventArg.RemoteEndPoint = _socket.RemoteEndPoint;

socketEventArg.UserToken = null;

socketEventArg.Completed += newEventHandler<SocketAsyncEventArgs>(delegate(objects, SocketAsyncEventArgs e)

{

response = e.SocketError.ToString();

_clientDone.Set();

});

byte[] payload = Encoding.UTF8.GetBytes(data);

socketEventArg.SetBuffer(payload, 0, payload.Length);

_clientDone.Reset();

_socket.SendAsync(socketEventArg);

_clientDone.WaitOne(TIMEOUT_MILLISECONDS);

}

else

{

response = "套接字没有准备好";

}

returnresponse;

}

接受消息:
[C#]

/// <summary>

/// 从连接服务器接收数据

/// </summary>

/// <returns>The data received from the server</returns>

publicstringReceive()

{

stringresponse = "操作超时";

if(_socket != null)

{

SocketAsyncEventArgs socketEventArg = newSocketAsyncEventArgs();

socketEventArg.RemoteEndPoint = _socket.RemoteEndPoint;

//设置接收数据的缓冲区

socketEventArg.SetBuffer(newByte[MAX_BUFFER_SIZE], 0, MAX_BUFFER_SIZE);

socketEventArg.Completed += newEventHandler<SocketAsyncEventArgs>(delegate(objects, SocketAsyncEventArgs e)

{

if(e.SocketError == SocketError.Success)

{

// Retrieve the data from the buffer

response = Encoding.UTF8.GetString(e.Buffer, e.Offset, e.BytesTransferred);

response = response.Trim('

免责声明:内容来源于网络,仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Akka(18): Stream:组合数据流,组件-Graph components数学统计基础-概率论与数理统计下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

网络编程(socket).WinSocket_recvfrom出错,GetLastError()为10054

1、在写 我的Qt598(vs2017)x64版本的 shadowsocks程序时遇到的。  具体问题情况 大概是这样:QUdpSocket(假设是sktA) connect接收函数,sktA侦听 端口9999,然后 sktA向本机端口9989发数据,然后现象是 接收函数中 QUdpSocket::hasPendingDatagrams()返回true,QU...

json前后台传值

   谈到JSON,简单的说就是一种数据交换格式。近年来,其在服务器之间交换数据的应用越来越广,相比XML其格式更简单、编解码更容易、扩展性更好,所以深受开发人员的喜爱。    下面简单的写一下在项目中前后台json传值的一个小例子,供大家参考、查阅。 一:前台传后台 1.前台jsp页面代码:      在index中将实体对象(自己创建即可)插入list...

Spring Security4.1.3实现拦截登录后向登录页面跳转方式(redirect或forward)返回被拦截界面

一、看下内部原理 简化后的认证过程分为7步: 用户访问网站,打开了一个链接(origin url)。 请求发送给服务器,服务器判断用户请求了受保护的资源。 由于用户没有登录,服务器重定向到登录页面 填写表单,点击登录 浏览器将用户名密码以表单形式发送给服务器 服务器验证用户名密码。成功,进入到下一步。否则要求用户重新认证(第三步) 服务器对用户拥有的权...

NFC应用于公交卡

NFC应用于公交卡https://www.cnblogs.com/liuzhaoyzz/p/7115098.html带有NFC功能的安卓手机可以给实体公交卡充值,手机虚拟公交卡现在有两种方案,一种是手机直接模拟成公交卡,比如三星pay,华为pay,小米pay,但这种方案需要手机商与当地公交公司谈判开放,所以只有在个别城市才有,比如北上这类大城市。另一种是通...

socket测试3

20191218 2021-2022-1-diocs-socket测试-3 服务器端 编写好服务器端程序,开启13端口,等待客户机连接 客户端 绑定服务器IP,选择13号端口 服务器端和客户端同步 我编写的代码服务器端会每隔一秒响应时间请求(即屏幕中有多少条记录即查看了多少次时间) 客户端 服务器端 多客户端访问 之前的客户端是用的OpenEuler...

c# Socket心跳试验,自定义发送包 和 使用KeepAlive

事前准备下载Wireshark并安装 打开Wireshark,修改过滤规则:ip.src eq 192.168.3.201 or ip.dst eq 192.168.3.201  如图: 不使用KeepAlive网上有段代码,可以对socket进行心跳检测,下面贴出部分代码: bool blockingState = socket...