Windows Phone下的Socket编程
讨论下有关于Windows Phone下的Socket编程方面的知识。
Socket就是通常所称的套接字,用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过Socket向网络发出请求或者应答网络请求。
这里,初学者可能会分不清Socket连接与HTTP连接的区别,我刚刚接触Socket的时候就曾经为此困扰过。
通常Socket连接就是TCP连接,这里就以TCP连接为例,一旦建立了Socket连接,通信双方就可开始相互发送和接收数据内容,直到断开连接为止,不过由于实际网络中的不确定因素太多而经常导致Socket连接的异常断开,为了避免异常断开,就需要不断的通知网络该Socket连接处于活跃状态;而HTTP连接使用“请求-响应”的方式,需要先建立连接后才可由客户端向服务器发出请求,服务器根据该请求做出响应以回复数据。如果,是需要服务器主动向客户端推送数据,保持客户端与服务器数据的实时同步,就应该使用Socket连接。
Socket的通信是在客户端与服务器之间进行的,建立Socket连接时至少需要一对Socket,其中一个运行在客户端上,另一个运行在服务器上。C/S两端的Socket连接过程一般有3个步骤:
(1)服务器监听:即服务器端Socket实时监控网络状态,等待客户端的连接请求;
(2)客户端请求:需要获取要连接的服务器端Socket的IP地址与端口ID,才能向服务器端Socket提出连接请求;
(3)连接的确认:当服务器端Socket接收到请求时就会响应其请求,并将描述发给客户端,一旦客户端Socket确认此描述,双方就建立了连接,服务器端则继续监听等待其他的客户端Socket的连接请求。
Windows Phone下的Socket编程也就是在.NET框架下的Socket编程,在System.Net.Sockets命名空间下,Socket类实现Socket编程的接口,SocketAsyncEventArgs类表示异步Socket操作,SocketException类为发生Socket错误时引发的异常。
下面简要的描述下WP作为客户端Socket的编程思路与流程:
(1)判断服务器IP与端口ID是否为空;
(2)根据服务器IP与端口ID生成终结点;
(3)创建Socket与其异步事件参数SocketAsyncEventArgs;
(4)将字符串类型的消息内容转化成Byte类型(字节信息);
(5)将要发送的消息内容存放在Socket数据缓冲区中socketEvenArg.SetBuffer;
(6)注册Socket完成处理的委托事件socketEvenArg.Completed;
(7)根据上述生成终结点创建Socket终结点socketEvenArg.RemoteEndPoint;
(8)将定义好的Socket对象赋值给Socket异步事件参数的运行实例属性socketEvenArg.UserToken=sock;
(9)处理Socket,执行异步连接处理sock.ConnectAsync(socketEvenArg);
(10)检测Socket连接是否出错;
(11)如果Socket处在连接状态时(SocketAsyncOperation.Connect),则进行异步发送消息处理sock.SendAsync(e);
(12)如果Socket处在发送消息状态时(SocketAsyncOperation.Send),则进行异步接收服务器传来的消息处理sock.ReceiveAsync(e);
(13)将接收到的消息显示出来,这样就完成了一次Socket之间的连接传递操作。
其中,需要注意并解释的地方:
Socket的Send方法,并非大家想象中的从一个端口发送消息到另一个端口,它仅仅是拷贝数据到基础系统的发送缓冲区,然后由基础系统将缓冲区的数据发送到连接的另一端口。这里的拷贝数据与异步发送消息的拷贝是不一样的,同步发送的拷贝,是直接拷贝数据到基础系统缓冲区,拷贝完成后返回,在拷贝的过程中,执行线程会IO等待, 此种拷贝与Socket自带的Buffer空间无关,但异步发送消息的拷贝,是将Socket自带的Buffer空间内的所有数据,拷贝到基础系统发送缓冲区,并立即返回,执行线程无需IO等待,所以异步发送在发送前必须执行SetBuffer方法,拷贝完成后,会触发你自定义回调函数ProcessSend,在ProcessSend方法中,调用SetBuffer方法,重新初始化Buffer空间。
在实际项目中,往往要求Socket通信服务器能提供高效、稳定的服务,一般会用到以下技术:双工通信、完成端口、SAEA、池、多线程、异步等。
Windows Phone下的Socket编程的更多相关文章
- winsock教程- windows下的socket编程(c语言实现)
winsock教程- windows下的socket编程(c语言实现) 使用winsock进行socket 编程 这是一个学习windows下socket编程(c语言)的快速指南.这是因为一下 ...
- Windows环境下用C#编程将文件上传至阿里云OSS笔记
Windows环境下用C#编程将文件上传至阿里云OSS笔记 本系列文章由ex_net(张建波)编写,转载请注明出处. http://blog.csdn.net/ex_net/article/detai ...
- ZT Linux系统环境下的Socket编程详细解析
Linux系统环境下的Socket编程详细解析 来自: http://blog.163.com/jiangh_1982/blog/static/121950520082881457775/ 什么是So ...
- Linux下TCP网络编程与基于Windows下C#socket编程间通信
一.linux下TCP网络编程基础,需要了解相关函数 Socket():用于套接字初始化. Bind():将 socket 与本机上的一个端口绑定,就可以在该端口监听服务请求. Listen():使s ...
- c++ 网络编程(一)TCP/UDP windows/linux 下入门级socket通信 客户端与服务端交互代码
原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/9601511.html c++ 网络编程(一)TCP/UDP 入门级客户端与服务端交互代码 网 ...
- Windows平台下的多线程编程
线程是进程的一条执行路径,它包含独立的堆栈和CPU寄存器状态,每个线程共享所有的进程资源,包括打开的文件.信号标识及动态分配的内存等.一个进程内的所有线程使用同一个地址空间,而这些线程的执行由系统调度 ...
- Linux下Golang Socket编程原理分析与代码实现
在POSIX标准推出后,socket在各大主流OS平台上都得到了很好的支持.而Golang是自带Runtime的跨平台编程语言,Go中提供给开发者的Socket API是建立在操作系统原生Socket ...
- Linux下网络socket编程——实现服务器(select)与多个客户端通信
一.关于socket通信 服务器端工作流程: 调用 socket() 函数创建套接字 用 bind() 函数将创建的套接字与服务端IP地址绑定 调用listen()函数监听socket() 函数创建的 ...
- LINUX 下 ipv6 socket 编程
大家都知道,随着互联网上主机数量的增多,现有的32位IP地址已经不够用了,所以推出了下一代IP地址IPv6,写网络程序的要稍微改变一下现有的网络程序适应IPv6网络是相当容易的事.对于我们来说就是IP ...
随机推荐
- nginx环境下配置nagios-关于commands.cfg
-w $ARG1$ -c $ARG2$ -M -b% -c % -f% -c % -f% -c % -f # define command{ command_name chec ...
- Web开发新时代
Web1.0===主流技术:HTML+CSS Web2.0===主流技术:Ajax(Javascript/DOM/异步数据请求) Web3.0===主流技术:HTML5+CSS3 HTML5亮点:Ca ...
- VC++模态对话框和非模态对话框
MFC中有两种类型的对话框:模态对话框和非模态对话框. 模态对话框是指当其显示时,程序会暂停执行,直到关闭这个模态对话框后,才能继续执行程序中其他任务.非模态对话框是指当其显示时,允许转而执行程序中 ...
- iOS相关思考题
1.iOS如何应对APP版本升级,数据结构随之变化? 一般程序app升级时,数据库有可能发生改变,如增加表字段,增加表等. 此时有两种操作: 1 就是毫无留情的把本地旧数据库直接删掉,重新建立新的数据 ...
- HDU 4578 Transformation (线段树区间多种更新)
http://acm.hdu.edu.cn/showproblem.php?pid=4578 题目大意:对于一个给定序列,序列内所有数的初始值为0,有4种操作.1:区间(x, y)内的所有数字全部加上 ...
- C# 使用js正则表达式,让文本框只能输入数字和字母,最大长度5位
使用js正则表达式,让文本框只能输入数字和字母,最大长度5位,只需要加个onkeyup事件,即可简单实现 <asp:TextBox ID="txtBegin" runat=& ...
- python datatime
一.datetime 1.date date.today() 2.time 3.datetime datetime.now() datetime.strftime(fmt) 转换为字符串 dateti ...
- iOS.ReactNative-2-bridge-and-react-native-app-execution
Bridge and React Native App Execution 基于0.18.1 Async batched bridge used to communicate with the Jav ...
- CardView的简单介绍
CardView是Android5.0中的一个全新控件,本质上而言,CardView是一个增加了圆角和阴影效果的FrameLayout,没错它就是一个FrameLayout,一个布局.CardView ...
- Action类为何要继承ActionSupport
Action类为何要继承ActionSupport 理论上Struts 2.0的Action无须实现任何接口或继承任何类型,但是,我们为了方便实现Action,大多数情况下都会继承com.open ...