本例用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. .net 网站应对压力的一些方案总结

    开年比较空,抽时间写个博文,总结下自己工作里的一些应对网站访问压力的技术方案. 自己项目现在大概一天50W的pv.已从前端到后端的顺序总结下自己用的一些方案. 一. 前端页面: 1.首先减少资源的大小 ...

  2. 如何用JS/HTML将时间戳转换为“xx天前”的形式【附源码,转

    如果我们有一份过去时间戳,如何使用JS/HTML将时间戳转换为"xx天前"的形式呢,以下是完整代码 <!DOCTYPE html> <html> <h ...

  3. Superwebsocket 模拟微信聊天室

    在园子里潜水几年了,工作以来算是有些积累,突然想写点东西方便以后温故而知新,希望自己能够坚持下去. 关于Superwebsocket的介绍我就不多说了,请点击:http://www.cnblogs.c ...

  4. javascript运行机制详解: 再谈Event Loop(转)

    作者: 阮一峰 日期: 2014年10月 8日 一年前,我写了一篇<什么是 Event Loop?>,谈了我对Event Loop的理解. 上个月,我偶然看到了Philip Roberts ...

  5. 融云发送手机短信验证短信(.net版本)

    首先本次需求是在MVC5中进行的,通过收费的融云服务来验证手机号码,而且本次的项目也是前后台分离,所以添加了WEBAPI2,那么先添加WEBAPI的接口 using System; using Sys ...

  6. kbhit()的三个测试

    #include <stdio.h> #include<conio.h> #include<stdlib.h> int main() { ; system(&quo ...

  7. Python,datetime模块实例

    Python的标准模块datetime模块,在我们的工作中应用非常频繁,下面对datetime中常用的方法进行了总结和测试:对每一个方法都使用了单元测试框架Unittest来配合测试. 主要的类型有: ...

  8. 解析java泛型(二)

    上篇我们简单的介绍了java中泛型的最基本的内容,知道了什么是泛型以及泛型对我们的程序编写有什么好处,最后一类型限定收尾.本篇将从类型限定开始阐述java泛型中很重要的概念:通配符 一.何为通配符   ...

  9. IBatis入门

    iBatis 简介: iBatis 是apache 的一个开源项目,一个O/R Mapping 解决方案,iBatis 最大的特点就是小巧,上手很快.如果不需要太多复杂的功能,iBatis 是能够满足 ...

  10. php审核操作

    注册页面zhuce.php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http ...