




已阅读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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年高二历史下学期复习《非选择题》汇编(天津专用)解析版
- 2024-2025学年湖南省永州市新田县八年级(上)期末数学试卷(含解析)
- 2024-2025学年山东省日照市校际联考高一(下)期末数学试卷(含答案)
- 中国邮政储蓄银行再就业小额担保贷款借款合同6篇
- e答网护士三基考试试题含答案2025年定考版
- 2025年江西省政府采购评审专家考试真题含答案
- 农业种植与土地流转合同协议
- 质量控制与测试操作指南手册
- 药厂GMP基础知识培训课件
- 多项目管理时间线及任务追踪表
- 物流管理就业能力展示
- 宿管老师培训课件
- 全媒体运营师-国家职业标准(2023年版)
- 小学英语教学经验体会分享
- 四年级英语 4AM3U2 Around my home同课异构
- 超限货物运输安全
- 2024年江苏省对口单招英语试卷及答案
- 国家临床版3.0手术操作编码(ICD-9-CM3)
- 学校矛盾调解工作制度模版
- 学习中心教学论
- 《学习共同体-走向深度学习》读书分享
评论
0/150
提交评论