本例用WPF程序做服务器端,windows phone程序做客户端。我们使用基于UDP协议的Socket通信。更多关于socket信息请查看:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket(v=vs.110).aspx

我们使用DatagramSocket类完成UDP通信功能。

具体代码如下:(前台代码就不帖出来了,下面只给出后台代码和一些注释。完整源代码会在论坛发出来,地址在文章最后。)

socket通信聊天windows phone 客户端

public sealed partial class MainPage : Page
{
// DatagramSocket 支持使用 UDP 数据报套接的网络通信
DatagramSocket udpSocket = null;
//定义本地端口号
const string LOCAL_PORT = “″;
public MainPage()
{
this.InitializeComponent();
this.NavigationCacheMode = NavigationCacheMode.Required;
} bool isUdpSocketInitializzed = false; //表示是否初始化过
//若要接收 DatagramSocket 对象上的数据,应用程序必须将 MessageReceived 事件分配给事件
//处理程序,然后调用 BindEndpointAsync 或 BindServiceNameAsync 方法将 DatagramSocket
//绑定到本地服务名或 UDP 端口上。ConnectAsync 方法还会导致绑定操作。
//写入由一个 GetOutputStreamAsync 方法返回的流也将会导致绑定操作。
//然后 DatagramSocket 可以接收数据报。
protected async override void OnNavigatedTo(NavigationEventArgs e)
{
if (!isUdpSocketInitializzed)
{
udpSocket = new DatagramSocket();
//定义在DatagramSocket对象上接受消息的事件
udpSocket.MessageReceived += udpSocket_MessageReceived;
//启动DatagramSocket本地服务名的绑定操作
await udpSocket.BindServiceNameAsync(LOCAL_PORT);
// 标志初始已完成
isUdpSocketInitializzed = true;
}
} async void udpSocket_MessageReceived(DatagramSocket sender, DatagramSocketMessageReceivedEventArgs args)
{
//获取DatagramSocket,以获取从DatagramSocket对象上的的远程网络目标接受到的传入数据
var reader = args.GetDataReader();
// 数据长度
uint len = reader.UnconsumedBufferLength;
// 读取内容
string message = reader.ReadString(len);
// 获取主机的IP地址和端口号
string host = string.Format(“{}:{}”, args.RemoteAddress.DisplayName, args.RemotePort);
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
lbMessages.Items.Add(“来自” + host + “的消息:\n” + message);
});
} private async void btnSend_Click(object sender, RoutedEventArgs e)
{
if (string.IsNullOrWhiteSpace(txtToSend.Text) || string.IsNullOrWhiteSpace(txtRemoteIP.Text) || string.IsNullOrWhiteSpace(txtRemotePort.Text))
{
return;
}
// 获取输出流的引用
HostName remoteHost = new HostName(txtRemoteIP.Text);
IOutputStream outStream = await udpSocket.GetOutputStreamAsync(remoteHost, txtRemotePort.Text);
// 发送消息
DataWriter writer = new DataWriter(outStream);
//设置字符编码
writer.UnicodeEncoding = UnicodeEncoding.Utf8;
//将字符串值写入输出流
writer.WriteString(txtToSend.Text);
// 提交数据
await writer.StoreAsync();
//释放
writer.DetachStream();
writer.Dispose();
tbMessage.Text = “已发送。”;
txtToSend.Text = “”;
}

socket通信聊天WPF服务器端:

public partial class MainWindow : Window
{
UdpClient udpClnt = null;
const int LOCAL_PORT = ;//本地端口
CancellationTokenSource cancelSrc = null;
public MainWindow()
{
InitializeComponent();
this.Closing += (a, b) =>
{
if (udpClnt != null)
{
try
{
udpClnt.Close();
}
catch (SocketException sex)
{
System.Diagnostics.Debug.WriteLine(sex.Message);
}
}
};
}
private async void DoReceiveMsg()
{
while (!cancelSrc.IsCancellationRequested)
{
try
{
var result = await udpClnt.ReceiveAsync();
// 远程主面信息
string host = string.Format(“{}:{}”, result.RemoteEndPoint.Address.ToString(), result.RemoteEndPoint.Port);
// 读取消息
string msg = Encoding.UTF8.GetString(result.Buffer);
// 显示接到的信息
await Dispatcher.BeginInvoke(new Action(
() =>
{
this.lbMessages.Items.Add(“来自” + host + “的消息:\n” + msg);
}
));
}
catch
{
continue;
}
}
} private void btnEnableRecv_Click(object sender, RoutedEventArgs e)
{
CheckUdpClient(); // 开始异步接收消息
cancelSrc = new CancellationTokenSource();
Task runTask = new Task(new Action(DoReceiveMsg), cancelSrc.Token);
try
{
runTask.Start();//启动后台任务
tbMessage.Text = “后台接收已开启。”;
btnEnableRecv.IsEnabled = false;
btnDisableRecv.IsEnabled = true;
}
catch (TaskCanceledException)
{
tbMessage.Text = “后台接收任务已取消。”;
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
}
} /// <summary>
/// 检测UdpClient对象是否已创建
/// </summary>
private void CheckUdpClient()
{
if (udpClnt == null) udpClnt = new UdpClient(LOCAL_PORT);
} private void btnDisableRecv_Click(object sender, RoutedEventArgs e)
{
// 取消后台任务
if (cancelSrc != null)
{
cancelSrc.Cancel();
btnEnableRecv.IsEnabled = true;
btnDisableRecv.IsEnabled = false;
tbMessage.Text = “已取消后台接收消息。”;
}
} private async void btnSend_Click(object sender, RoutedEventArgs e)
{
if (string.IsNullOrWhiteSpace(txtToSend.Text))
{
return;
}
CheckUdpClient();
// 验证是否设置远程地址和端口
IPAddress ip;
int remotePort;
if (!IPAddress.TryParse(txtRemoteIP.Text,out ip))
{
MessageBox.Show(“请输入远程IP地址。”); return;
}
if (!int.TryParse(txtRemotePort.Text, out remotePort))
{
MessageBox.Show(“请输入远程端口号。”); return;
}
// 验证输入的端口号是否合法
if (remotePort < IPEndPoint.MinPort || remotePort > IPEndPoint.MaxPort)
{
MessageBox.Show(string.Format(“端口号的有效范围在{}到{}。”, IPEndPoint.MinPort, IPEndPoint.MaxPort));
return;
}
// 开始发送消息
byte[] buffer = Encoding.UTF8.GetBytes(txtToSend.Text);
// 创建远程终结点
IPEndPoint remote = new IPEndPoint(ip, remotePort);
object contentTemp = btnSend.Content;
try
{
btnSend.Content = “正在发送”;
btnSend.IsEnabled = false;
await udpClnt.SendAsync(buffer, buffer.Length, remote);
txtToSend.Clear();
tbMessage.Text = “已发送。”;
}
catch (Exception ex)
{
tbMessage.Text = “消息发送失败。”;
System.Diagnostics.Debug.WriteLine(ex.Message);
}
finally
{
// 发送完毕
btnSend.Content = contentTemp;
btnSend.IsEnabled = true;
}
}

小梦 windows phone 8.1开发:socket通信聊天源代码下载:点我下载哦

windows phone 8.1开发:socket通信聊天的更多相关文章

  1. windows下用c实现Socket通信

    原文:windows下用c实现Socket通信 原本以为c是跨平台,所以,c在windows下和linux下的程序应该是类似于Java,什么都不用改变的,今儿才恍然大悟,他们的类库不一样啊-- 下面我 ...

  2. Android开发--Socket通信

    一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是"请求-响应方式",即在请求时 ...

  3. Android进阶(十五)socket通信——聊天室

    想做一个聊天室,花费了将近一天的时间,各种错误.讲解知识点之前,絮叨几句:动手能力还是很重要的,有时看似简单的一个问题,当你真正着手去解决的时候就有可能会遇到各种各样的问题,原因之一就是因为你的知识储 ...

  4. ios开发 Socket通信

    Socket描述了一个IP.端口对.它简化了程序员的操作,知道对方的IP以及PORT就可以给对方发送消息,再由服务器端来处理发送的这些消息.所以,Socket一定包含了通信的双发,即客户端(Clien ...

  5. 成功使Linux服务端和Windows客户端建立socket通信

    一.准备工作 1.一台装有虚拟机的Windows7操作系统,虚拟机中装的是CentOS6.5版本的Linux 2.Windows7已经装有java环境 二.编码 使用java编写socket通信的服务 ...

  6. iOS:socket通信

    ios开发 Socket通信 Socket描述了一个IP.端口对.它简化了程序员的操作,知道对方的IP以及PORT就可以给对方发送消息,再由服务器端来处理发送的这些消息.所以,Socket一定包含了通 ...

  7. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-完整应用例子-在线聊天室系统-下载配置

    一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...

  8. Python简易聊天工具-基于异步Socket通信

    继续学习Python中,最近看书<Python基础教程>中的虚拟茶话会项目,觉得很有意思,自己敲了一遍,受益匪浅,同时记录一下. 主要用到异步socket服务客户端和服务器模块asynco ...

  9. 网络编程-SOCKET开发之----3. socket通信工作流程

    1. TCP的socket通信流程 服务端 1)socket----创建socket对象. 2)bind----绑定本机ip+port. 3)listen----监听来电,若在监听到来电,则建立起连接 ...

随机推荐

  1. spring-mvc.xml配置

    1.自动扫描 <!-- 自动扫描该包,使SpringMVC认为包下用了@controller注解的类是控制器 --> <context:component-scan base-pac ...

  2. 《JAVASCRIPT高级程序设计》事件处理程序和事件类型

    一.事件流 谈到事件,首要要理解事件流的概念:事件流是指从页面接受事件的顺序:“DOM2级事件”规定事件流包括三个阶段:事件捕获阶段.处于目标阶段和事件冒泡阶段.目前大部分的浏览器的事件流是事件冒泡, ...

  3. 蓝桥网试题 java 基础练习 特殊的数字

    -------------------------------------------------------- 笑脸 :-) ------------------------------------ ...

  4. Spring + Quartz配置实例

    Spring为创建Quartz的Scheduler.Trigger和JobDetail提供了便利的FactoryBean类,以便能够在Spring 容器中享受注入的好处.此外Spring还提供了一些便 ...

  5. Surface Dial 与 Windows Wheel UWP应用开发

    随着微软发布 Surface Studio 在演示视频中非常抢眼的一个配件就是 Surface Dial,Dial 是Windows输入设备大家庭中的新成员我们把它归类为Windows Wheel 类 ...

  6. 重新学习WCF

    近来工作不怎么忙,一直在想一个问题,今年刚刚毕业,对于我们这应届生到底应该学习那些技术呢? 面对着现在技术横生,到底哪项是适合自己的呢?自己一直都在迷茫,若有那位大神再次经过,望给出您宝贵的建议. 最 ...

  7. 【中文分词】结构化感知器SP

    结构化感知器(Structured Perceptron, SP)是由Collins [1]在EMNLP'02上提出来的,用于解决序列标注的问题:中文分词工具THULAC.LTP所采用的理论模型便是基 ...

  8. 分享jquery.cookie.js

    代码如下: /*! * jQuery Cookie Plugin v1.4.1 * https://github.com/carhartl/jquery-cookie * * Copyright 20 ...

  9. C语言——选择排序

    ---恢复内容开始--- 算法思想: n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果: ①初始状态:无序区为R[1..n],有序区为空. ②第1趟排序 在无序区R[1..n]中选出 ...

  10. [APUE]进程关系(上)

    一.终端登录 1. 4.3+BSD终端登录 系统管理员创建一个通常名为/etc/ttys的文件,其中,每个终端设备有一行,每一行说明设备名和传到getty程序的参数,这些参数说明了终端的波特率.当系统 ...