执行异步的Socket操作的模式包含已下步骤:

1. 配置新的 SocketAsyncEventArgs 对象,或者从应用程序池中获取一个这样的空闲对象。

2.针对该对象设置即将执行的操作所需的属性(例如附加到Completed事件的事件处理程序以及ConnectAsync方法的RemoteEndPoint属性)。

3.调用适当的Socket方法已启动异步操作。

4.如果异步Socket方法返回 true,则说明I/O操作处于挂起状态。操作完成时将引发传递给Socket方法的SocketAsyncEventArgs对象的SocketAsyncEventArgs .ComPleted事件。该事件在事件处理程序中引发时,将查询SocketAsyncEventArgs属性来获取完成状态和Socket操作结果。

5.如果异步Socket方法返回false通,则说明操作是同步完成的。 您可以查詢SocketAsyncEventArgs属性来获取完成状态和Socket操作结果。

6将SocketAsyncEventArgs重用于另一个操作,将它放回到应用程序池中,或者将它丢弃。。

Windowphone程序页面代码-----------------------------------------------------------

 <!--ContentPanel - 在此处放置其他内容--><Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,8,12,-8"><TextBlock HorizontalAlignment="Left" TextWrapping="Wrap" Text="主机IP:" VerticalAlignment="Top" Margin="8,21,0,0" FontSize="26.667"/><TextBox x:Name="HostText" TextWrapping="Wrap" VerticalAlignment="Top" Margin="94,0,8,0"/><TextBlock HorizontalAlignment="Left" TextWrapping="Wrap" Text="端口号:" VerticalAlignment="Top" Margin="8,104,0,0" FontSize="26.667"/><TextBox x:Name="PortText" TextWrapping="Wrap" VerticalAlignment="Top" Margin="94,90,8,0"/><TextBlock HorizontalAlignment="Left" TextWrapping="Wrap" Text="发送的消息内容" VerticalAlignment="Top" Margin="12,166,0,0"/><TextBox x:Name="ContentText" TextWrapping="Wrap" VerticalAlignment="Top" Margin="8,197,8,0"/><Button x:Name="SendBtn" Content="发送" VerticalAlignment="Bottom" Margin="0,0,8,8" Click="SendBtn_Click" /><ListBox Margin="12,273,8,92" Name="listboxsendText" /></Grid>

MainPage页面代码---------------

 public partial class MainPage : PhoneApplicationPage{// 构造函数public MainPage(){InitializeComponent();}private void SendBtn_Click(object sender, RoutedEventArgs e){if (string.IsNullOrEmpty(HostText.Text)||string.IsNullOrEmpty(PortText.Text)){MessageBox.Show("请输入主机IP和端口好");return;}string host = HostText.Text.Trim();int port = Convert.ToInt32(PortText.Text.Trim());//创建终结点对象
DnsEndPoint hostEntry = new DnsEndPoint(host, port);//注册Socket对象Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//建立一个Socket异步事件参数SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();byte[] buffer = Encoding.UTF8.GetBytes(ContentText.Text);//将发送内内容信息存放进Socket异步事件参数中socketEventArg.SetBuffer(buffer, 0, buffer.Length);//注册socket完成事件socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(socketEventArg_Completed);//socketEventArg.Completed += (s, es) =>//{//};//设置Socket异步事件参数的Socket远程终结点socketEventArg.RemoteEndPoint = hostEntry;//将定义好的Socket对象赋值给Socket异步事件参数的运行实例属性socketEventArg.UserToken = sock;try{//运行Socket
                sock.ConnectAsync(socketEventArg);}catch (SocketException ex){throw new SocketException((int)ex.ErrorCode);}}void socketEventArg_Completed(object sender, SocketAsyncEventArgs e){//检测Socket是否发送出差,当前最后的一个操作if (e.SocketError != SocketError.Success){if (e.SocketError == SocketError.ConnectionAborted){Dispatcher.BeginInvoke(() => MessageBox.Show("连接超时请重试!" + e.SocketError));}else if (e.SocketError == SocketError.ConnectionRefused){Dispatcher.BeginInvoke(() => MessageBox.Show("服务器端启动" + e.SocketError));}else{Dispatcher.BeginInvoke(() => MessageBox.Show("出差了 " + e.SocketError));}//关闭连接清理资源if (e.UserToken != null){Socket socks = e.UserToken as Socket;socks.Shutdown(SocketShutdown.Both);socks.Close();}return;}switch (e.LastOperation){case SocketAsyncOperation.Connect:if (e.UserToken != null){Socket socket = e.UserToken as Socket;bool completesAsynchronously = socket.SendAsync(e);//检测Socket发送是否被挂起,如果被挂起将继续进行处理if (!completesAsynchronously){socketEventArg_Completed(e.UserToken, e);}}break;case SocketAsyncOperation.None:break;case SocketAsyncOperation.Receive:if (e.UserToken != null){string dataFromServer = Encoding.UTF8.GetString(e.Buffer, 0, e.BytesTransferred);//h获取运行中socket对象Socket socket = e.UserToken as Socket;//收到信息内容绑定到Listbox控件中Dispatcher.BeginInvoke(() =>{listboxsendText.Items.Add("客户端" + DateTime.Now.ToShortTimeString() + "传来的信息:" + dataFromServer);});}break;case SocketAsyncOperation.ReceiveFrom:break;case SocketAsyncOperation.Send:Dispatcher.BeginInvoke(() =>{listboxsendText.Items.Add("客户端" + DateTime.Now.ToShortTimeString() + "发送的信息:" + ContentText.Text);});if (e.UserToken != null){Socket socket = e.UserToken as Socket;//开始接受服务器端的消息bool completesAsynchronously = socket.ReceiveAsync(e);//检测Socket发送是否呗挂起,如果被挂起将继续进行处理if (!completesAsynchronously){socketEventArg_Completed(e.UserToken, e);}}break;case SocketAsyncOperation.SendTo:break;default:break;}}}

Windows控制台程序代码---------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace SocketServer
{class Program{private static AutoResetEvent _flipFlop = new AutoResetEvent(false);static void Main(string[] args){//创建socket ,使用的是Tcp协议,如果用UDP协议,则要用SocketType.Dgram类型的socketSocket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);IPHostEntry iphostinfo = Dns.Resolve(Dns.GetHostName());IPEndPoint localEp = new IPEndPoint(iphostinfo.AddressList.First(), 8888);Console.WriteLine("本地的IP地址和端口是:{0}", localEp);try{listener.Bind(localEp);listener.Listen(10);while (true){Console.WriteLine("等待Windowphone客户端的连接  ");listener.BeginAccept(AccepptCallback,listener);_flipFlop.WaitOne();}}catch (Exception){throw;}}private static void AccepptCallback(IAsyncResult ar){Socket listener = (Socket)ar.AsyncState;Socket socket = listener.EndAccept(ar);Console.WriteLine("连接到Windows Phone 客户端");_flipFlop.Set();//开始接受,传递StateObject对象过去 var state = new StateObject();state.Socket=socket;socket.BeginReceive(state.Buffer, 0, StateObject.BufferSize, 0, ReceiveCallback, state);}//接受返回事件处理public static void ReceiveCallback(IAsyncResult ar){StateObject state = (StateObject)ar.AsyncState;Socket socket = state.Socket;//读取客户端Socket发送过来是数据int read = socket.EndReceive(ar);//如果成功读取了客户端Socket发送过的数据if (read>0){string chunk = Encoding.UTF8.GetString(state.Buffer, 0, read);state.StringBuilder.Append(chunk);if (state.StringBuilder.Length>0){string result = state.StringBuilder.ToString();Console.WriteLine("收到客户端传来的信息:{0}", result);Send(socket, result);}}}public static void Send(Socket handler, string data){//将消息内容转化为发送的byte【】格式byte[] bytedate = Encoding.UTF8.GetBytes(data);//发送信息到Windowphone客户端handler.BeginSend(bytedate, 0, bytedate.Length, 0, new AsyncCallback(SendCallback), handler);}public static void SendCallback(IAsyncResult ar){try{Socket handler = (Socket)ar.AsyncState;//完成信息发送到Windowphone客户端int bytesSent = handler.EndSend(ar);if (bytesSent>0){Console.WriteLine("发送成功");}}catch (Exception e){Console.WriteLine(e.ToString());}}}public class StateObject{public Socket Socket;public StringBuilder StringBuilder = new StringBuilder();public const int BufferSize =10;public byte[] Buffer = new byte[BufferSize];public int TotalSize;}
}

程序运行界面------------------------

 

转载于:https://www.cnblogs.com/fxiaoquan/archive/2012/08/14/2637390.html

windowoPhone7.1 Socket编程-实现手机与电脑通信相关推荐

  1. 【Java高级】初探socket编程 ——JavaSocket连接与简单通信

    新学期生活开始一段时间了,要继续学习一些新的技术(这里指socket /doge),目标是尝试完成一个在线即时聊天的小程序(尽量不咕).会更新一系列socket编程的技术文章,欢迎关注交流~ 那么千里 ...

  2. 基于MFC的socket编程(异步非阻塞通信)

    对于许多初学者来说,网络通信程序的开发,普遍的一个现象就是觉得难以入手.许多概念,诸如:同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)等,初学者往往迷惑不清,只知其 ...

  3. Java基于socket编程实现局域网内简单通信

    运行客户端程序将创建一个客户端套接字,并与指定的服务器建立连接,接收了服务端发来的消息后关闭连接.服务端启动后会循环接收客户端连接,在接收到连接后,向该客户端发送 "Hello World! ...

  4. java web接收tcp_Java多线程实现TCP网络Socket编程(C/S通信)

    开篇必知必会 在前一篇<基于TCP协议网络socket编程(java实现C/S通信)>,实际存在一个问题,如果服务器端在建立连接后发送多条信息给客户端,客户端是无法全部接收的,原因在于客户 ...

  5. 广播、组播 socket编程

             目录 1.单播 / 广播 / 组播 的概念 (1) 单播 (2) 广播 (3) 多播(组播) 2.广播 socket编程(只能是UDP通信) 3.多播 socket编程(只能是UDP ...

  6. Socket编程总结—Android手机服务器与多个Android手机客户端之间的通信(非阻塞)

    根据前两周写的关于Socket编程的网络通信的代码,现在对有关知识和注意事项进行总结如下: 1.首先说下Android NIO中有关Socket编程的类: 1)ServerSocketChannel类 ...

  7. 手机和电脑基于java的socket简单通信

    Java手机与电脑的Socket通信 了解手机与电脑的socket通信 下面给出代码 完整程序代码 效果 了解手机与电脑的socket通信 1.内网之间的通信: 内网就是两者处于同一个局域网之中,不用 ...

  8. 基于socket实现虚拟手柄使用手机控制电脑游戏(下)-手机端虚拟手柄

    基于socket实现虚拟手柄使用手机控制电脑游戏(下)-手机端虚拟手柄 这个是关于利用socket套接字实现手机控制电脑按键的一个实例,完成这个项目可以实现用手机控制狂野飙车等游戏,就是一个简易的手机 ...

  9. 基于socket实现虚拟手柄使用手机控制电脑游戏(上)-电脑服务端

    基于socket实现虚拟手柄使用手机控制电脑游戏(上)-电脑服务端 这个是关于利用socket套接字实现手机控制电脑按键的一个实例,完成这个项目可以实现用手机控制狂野飙车等游戏,就是一个简易的手机虚拟 ...

最新文章

  1. SAP QM QA08批量维护QMAT数据
  2. jQuery应用之(一)使用jQuery选择器(荐)
  3. python数据挖掘主要特点_【Python数据挖掘】第六篇--特征工程
  4. javascript 的观察者模式的原理和集线器
  5. 数据挖掘领域十大经典算法
  6. LeetCode 651. 4键键盘(DP,Ctrl+CV)
  7. # 生成单色位二维码图_如何2个小时内学会ps抠图-纯干货
  8. 细数SkyEye异构仿真的5大特色
  9. windows 用户管理
  10. 伏羲六十四卦+36D
  11. web前端利用leaflet生成粒子风场,类似windy
  12. 【算法学习】快包算法
  13. AI如何走向精智能之路?
  14. 金牌网管师系列教材北京发布会我的演讲稿
  15. 来自上海的燕谷坊申请纳斯达克IPO上市,募资3000万美元
  16. 消防栓信息计算机管理系统,智能消防栓监控系统
  17. 1份专业的数据分析报告到底怎么写?
  18. EBM、DEA-SBM模型集合大全(普通的、非期望产出的、超效率的、CRS、VRS条件下的)
  19. ‘annotationProcessor‘ dependencies won‘t be recognized as kapt annotation processors. Please change
  20. 云创集团丨SaaS软件即服务系统

热门文章

  1. 三个火一个木组成的燊怎么读,燊是什么意思?
  2. 一亩地等于多少平方米?
  3. 如何快速看透一个人?
  4. 给新手开店选品的建议
  5. 装修弱电箱,路由器和交换机该怎么放?
  6. Since WWDC released the first developer
  7. 使用netkit搭pppoe服务器
  8. sql azure 语法_Azure Data Studio中SQL Server Profiler
  9. innodb 集群_部署MySQL InnoDB集群以实现高可用性
  10. ssas报表项目数据集_处理SSAS多维OLAP多维数据集的有效方法