windowoPhone7.1 Socket编程-实现手机与电脑通信
执行异步的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编程-实现手机与电脑通信相关推荐
- 【Java高级】初探socket编程 ——JavaSocket连接与简单通信
新学期生活开始一段时间了,要继续学习一些新的技术(这里指socket /doge),目标是尝试完成一个在线即时聊天的小程序(尽量不咕).会更新一系列socket编程的技术文章,欢迎关注交流~ 那么千里 ...
- 基于MFC的socket编程(异步非阻塞通信)
对于许多初学者来说,网络通信程序的开发,普遍的一个现象就是觉得难以入手.许多概念,诸如:同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)等,初学者往往迷惑不清,只知其 ...
- Java基于socket编程实现局域网内简单通信
运行客户端程序将创建一个客户端套接字,并与指定的服务器建立连接,接收了服务端发来的消息后关闭连接.服务端启动后会循环接收客户端连接,在接收到连接后,向该客户端发送 "Hello World! ...
- java web接收tcp_Java多线程实现TCP网络Socket编程(C/S通信)
开篇必知必会 在前一篇<基于TCP协议网络socket编程(java实现C/S通信)>,实际存在一个问题,如果服务器端在建立连接后发送多条信息给客户端,客户端是无法全部接收的,原因在于客户 ...
- 广播、组播 socket编程
目录 1.单播 / 广播 / 组播 的概念 (1) 单播 (2) 广播 (3) 多播(组播) 2.广播 socket编程(只能是UDP通信) 3.多播 socket编程(只能是UDP ...
- Socket编程总结—Android手机服务器与多个Android手机客户端之间的通信(非阻塞)
根据前两周写的关于Socket编程的网络通信的代码,现在对有关知识和注意事项进行总结如下: 1.首先说下Android NIO中有关Socket编程的类: 1)ServerSocketChannel类 ...
- 手机和电脑基于java的socket简单通信
Java手机与电脑的Socket通信 了解手机与电脑的socket通信 下面给出代码 完整程序代码 效果 了解手机与电脑的socket通信 1.内网之间的通信: 内网就是两者处于同一个局域网之中,不用 ...
- 基于socket实现虚拟手柄使用手机控制电脑游戏(下)-手机端虚拟手柄
基于socket实现虚拟手柄使用手机控制电脑游戏(下)-手机端虚拟手柄 这个是关于利用socket套接字实现手机控制电脑按键的一个实例,完成这个项目可以实现用手机控制狂野飙车等游戏,就是一个简易的手机 ...
- 基于socket实现虚拟手柄使用手机控制电脑游戏(上)-电脑服务端
基于socket实现虚拟手柄使用手机控制电脑游戏(上)-电脑服务端 这个是关于利用socket套接字实现手机控制电脑按键的一个实例,完成这个项目可以实现用手机控制狂野飙车等游戏,就是一个简易的手机虚拟 ...
最新文章
- SAP QM QA08批量维护QMAT数据
- jQuery应用之(一)使用jQuery选择器(荐)
- python数据挖掘主要特点_【Python数据挖掘】第六篇--特征工程
- javascript 的观察者模式的原理和集线器
- 数据挖掘领域十大经典算法
- LeetCode 651. 4键键盘(DP,Ctrl+CV)
- # 生成单色位二维码图_如何2个小时内学会ps抠图-纯干货
- 细数SkyEye异构仿真的5大特色
- windows 用户管理
- 伏羲六十四卦+36D
- web前端利用leaflet生成粒子风场,类似windy
- 【算法学习】快包算法
- AI如何走向精智能之路?
- 金牌网管师系列教材北京发布会我的演讲稿
- 来自上海的燕谷坊申请纳斯达克IPO上市,募资3000万美元
- 消防栓信息计算机管理系统,智能消防栓监控系统
- 1份专业的数据分析报告到底怎么写?
- EBM、DEA-SBM模型集合大全(普通的、非期望产出的、超效率的、CRS、VRS条件下的)
- ‘annotationProcessor‘ dependencies won‘t be recognized as kapt annotation processors. Please change
- 云创集团丨SaaS软件即服务系统