zoukankan      html  css  js  c++  java
  • 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、池、多线程、异步等。

  • 相关阅读:
    POJ 2251 Dungeon Master
    HDU 3085 Nightmare Ⅱ
    CodeForces 1060 B Maximum Sum of Digits
    HDU 1166 敌兵布阵(树状数组)
    HDOJ 2050 折线分割平面
    HDU 5879 Cure
    HDU 1878 欧拉回路
    HDU 6225 Little Boxes
    ZOJ 2971 Give Me the Number
    HDU 2680 Choose the best route
  • 原文地址:https://www.cnblogs.com/twobin/p/3338029.html
Copyright © 2011-2022 走看看