已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本文由麦可网整理,转载请注明Windows Phone 7 网络编程之使用Socket(芒果更新) 芒果更新的Windows Phone 7.1版本的API提供了Socket编程的接口,这给Windows Phone 7的网络开发又添加了一把利器,对于Windows Phone 7上的聊天软件开发是一件非常happy的事情。下面用一个小例子来演示一下Windows Phone 7上的Socket编程。用Windows Phone 7上的客户端程序作为Socket客户端,Windows控制台程序作为服务器端,ip取你电脑本机的ip,端口号用8888,实现了Windows Phone 7客户端向服务器端发送消息和接收消息的功能。 先来看看演示的效果 (1) Windows Phone 7客户端客户端的实现。 MainPage.xaml cs页面 using System;using System.Net;using System.Windows;using Microsoft.Phone.Controls;using System.Text;using System.Net.Sockets;namespace SocketTest public partial class MainPage : PhoneApplicationPage public MainPage() InitializeComponent(); private void SendButton_Click(object sender, RoutedEventArgs e) / 判断是否已经输入了IP地址和端口 if (string.IsNullOrEmpty(Host.Text) | string.IsNullOrEmpty(Port.Text) MessageBox.Show(麻烦输入以下主机IP和端口号,谢谢!); return; /主机IP地址 string host = Host.Text.Trim(); /端口号 int port = Convert.ToInt32(Port.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格式 byte buffer = Encoding.UTF8.GetBytes(Message.Text); /将发送内容的信息存放进Socket异步事件参数中 socketEventArg.SetBuffer(buffer, 0, buffer.Length); /注册Socket完成事件 socketEventArg.Completed += new EventHandler(SocketAsyncEventArgs_Completed); /设置Socket异步事件参数的Socket远程终结点 socketEventArg.RemoteEndPoint = hostEntry; /将定义好的Socket对象赋值给Socket异步事件参数的运行实例属性 socketEventArg.UserToken = sock; try /运行Socket sock.ConnectAsync(socketEventArg); catch (SocketException ex) throw new SocketException(int)ex.ErrorCode); private void SocketAsyncEventArgs_Completed(object sender, SocketAsyncEventArgs e) / 检查是否发送出错 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 sock = e.UserToken as Socket; sock.Shutdown(SocketShutdown.Both); sock.Close(); return; /检查Socket的当前最后的一个操作 switch (e.LastOperation) /如果最后的一个操作是连接,那么下一步处理就是发送消息。 case SocketAsyncOperation.Connect: if (e.UserToken != null) /获取运行中的Socket对象 Socket sock = e.UserToken as Socket; /开始发送 bool completesAsynchronously = sock.SendAsync(e); /检查socket发送是否被挂起,如果被挂起将继续进行处理 if (!completesAsynchronously) SocketAsyncEventArgs_Completed(e.UserToken, e); ; break; /如果最后的一个操作是发送,那么显示刚才发送成功的消息,然后开始下一步处理就是接收消息。 case SocketAsyncOperation.Send: /将已成功发送的消息内容绑定到listBox1控件中 Dispatcher.BeginInvoke() = listBox1.Items.Add(客户端 + DateTime.Now.ToShortTimeString() + 发送的消息 : + Message.Text); ); if (e.UserToken != null) /获取运行中的Socket对象 Socket sock = e.UserToken as Socket; /开始接收服务器端的消息 bool completesAsynchronously = sock.ReceiveAsync(e); /检查socket发送是否被挂起,如果被挂起将继续进行处理 if (!completesAsynchronously) SocketAsyncEventArgs_Completed(e.UserToken, e); break; /如果是最后的一个操作时接收,那么显示接收到的消息内容,并清理资源。 case SocketAsyncOperation.Receive: if (e.UserToken != null) /获取接收到的消息,并转化为字符串 string dataFromServer = Encoding.UTF8.GetString(e.Buffer, 0, e.BytesTransferred); /获取运行中的Socket对象 Socket sock = e.UserToken as Socket; /将接收到的消息内容绑定到listBox1控件中 Dispatcher.BeginInvoke() = listBox1.Items.Add(服务器端 + DateTime.Now.ToShortTimeString() + 传过来的消息: + dataFromServer); ); break; (2) Socket服务器端的实现,使用Windows的控制台程序。 using System;using System.Linq;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading;namespace SocketServer static class Program private static AutoResetEvent _flipFlop = new AutoResetEvent(false); static void Main(string args) /创建socket,使用的是TCP协议,如果用UDP协议,则要用SocketType.Dgram类型的Socket Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); /创建终结点EndPoint 取当前主机的ip IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName(); /把ip和端口转化为IPEndpoint实例,端口号取8888 IPEndPoint localEP = new IPEndPoint(ipHostInfo.AddressList.First(), 8888); Console.WriteLine(本地的IP地址和端口是 : 0, localEP); try /绑定EndPoint对像(8888端口和ip地址) listener.Bind(localEP); /开始监听 listener.Listen(10); /一直循环接收客户端的消息 while (true) Console.WriteLine(等待Windows Phone客户端的连接.); /开始接收下一个连接 listener.BeginAccept(AcceptCallback, listener); /开始线程等待 _flipFlop.WaitOne(); catch (Exception e) Console.WriteLine(e.ToString(); / / 接收返回事件处理 / / private static void AcceptCallback(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); private 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); / / 返回客户端数据 / / / private static void Send(Socket handler, String data) /将消息内容转化为发送的byte格式 byte byteData
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 浙江嘉兴新塍镇人民政府所属事业单位选聘工作人员易考易错模拟试题(共500题)试卷后附参考答案
- 公司投资代理协议书
- 公司之间委托协议书
- 代理出口协议啥合同
- 江苏南京部分事业单位2025下半年招聘拟聘(八)易考易错模拟试题(共500题)试卷后附参考答案
- 梅州市五华县招考人口计生医技人员易考易错模拟试题(共500题)试卷后附参考答案
- 供应建筑原料协议书
- 成都市人事考试中心2025年下半年招考编外工作人员易考易错模拟试题(共500题)试卷后附参考答案
- 分公司章盖协议合同
- 服装店用工合同协议
- 不典型中枢性眩晕病例分享
- 楼梯销售合同范本
- 地面硬化合同范例
- 制茶机相关项目实施方案
- 工程签证单完整版
- 安全操作规程汇编(服装厂)
- DB3206T 1075-2024 水运工程施工安全管理台账编制导则
- 声律启蒙(全文)拼音版
- 《射频识别技术及应用》课件13.56 MHz RFID技术
- 演讲与口才-形成性考核二-国开(HB)-参考资料
- 脾胃虚寒证的中药临床验证
评论
0/150
提交评论