您的位置:首页 > 编程语言 > C#

Metro开发中的Socket支持(C#)

2012-11-30 18:01 267 查看
最近在尝试Metro应用开发,作为本系列文章的开篇,简要介绍一下WinRT中对Socket的支持,废话不多说了,以下代码段声明了一个StreamStocket实例连接谷歌主页:

//声明并初始化一个HostName
HostName hostName;
try
{
hostName = new HostName("www.google.com");
}
catch (ArgumentException)
{
NotifyUser("Error: Invalid host name.");
return;
}

//初始化一个StreamSocket实例用于连接网络
StreamSocket socket = new StreamSocket();
try
{
// 连接服务器
await socket.ConnectAsync(hostName, "http");
//或者await socket.ConnectAsync(hostName, "8003");
//此方法有几个重载,可以选择是否使用Ssl等

NotifyUser("Connected");
}
catch (Exception exception)
{
if (SocketError.GetStatus(exception.HResult) ==
SocketErrorStatus.Unknown)
{
throw;
}
NotifyUser("Connect failed with error: " +
exception.Message);
}

其中用到的通知方法:

protected async void NotifyUser(String msg)
{
MessageDialog dialg = new MessageDialog(msg, "测试结果");
await dialg.ShowAsync();
}

经过以上操作,相信已经顺利连接上需要操作的各种服务器了,接下来发送请求:

//声明并初始化向socket连接写数据的DataWriter对象
DataWriter writer = new DataWriter(socket.OutputStream);
String stringToSend = "HelloStocket";
writer.WriteUInt32(writer.MeasureString(stringToSend));
writer.WriteString(stringToSend);

// 向网络发送数据
try
{
await writer.StoreAsync();
}
catch (Exception exception)
{
if (SocketError.GetStatus(exception.HResult) ==
SocketErrorStatus.Unknown)
{
throw;
}
NotifyUser("Send failed with error: " +
exception.Message);
}

发送请求后就可以开始尝试读取从服务器返回的数据了,以下是简单示例:

DataReader reader = new DataReader(Socket.InputStream);
uint sizeFieldCount = await reader.LoadAsync(sizeof(uint));
if (sizeFieldCount != sizeof(uint))
{
return;
}

// 读取字符串
uint stringLength = reader.ReadUInt32();
uint actualStringLength = await reader.LoadAsync(stringLength);
if (stringLength != actualStringLength)
{
return;
}

String result=reader.ReadString(actualStringLength);
NotifyUser("Receive data: " + result);


经过以上步骤,我们完成了一次简单的从谷歌服务器获取网页数据的过程。当然,在实际项目使用中肯定不会这么简单,这里面未考虑和刻意忽略的细节问题非常多,此篇文章只是介绍了一下基本的使用方法,仅此而已。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐