Windows8 Metro界面下的StreamSocket 发送数据与接收数据

上次说了这么用StreamSocket来建立连接,现在看看怎么用StreamSocket发送和接收数据。

首先我们知道StreamSocket实例中有InputStream 和 OutputStream 这两个属性,看名字就知道我们接下来的操作一定与它离不开关系了。

那么先说发送,发送数据时我们将会用到 Windows.Storage.Streams.DataWriter 来帮助我们方便的吧数据发送出去,当然这个操作也和链接一样是异步的。

首先需要从已经建立好连接的 StreamSocke t实例中利用 OutputStream 熟悉实例化一个DataWriter

var writer = new DataWriter(_socket.OutputStream);

然后就可以利用 DataWriter 向服务器传输各种类型的数据了,这里他提供了好多数据类型,我就选择Byte做示范吧,代码如下:

var buffer = new List<byte>();
buffer.AddRange(BitConverter.GetBytes(123));

try
{
    var writer = new DataWriter(_socket.OutputStream);

    //将数据写入到输出流中
    writer.WriteBytes(buffer.ToArray());
    //将数据提交到备份存储区(这里不是直接发送数据而是放到了备份存储区,我的理解可能是会当前不能发送数据或者其他情况下放置一段时间,等待能够发送出去时才真正发送数据,这个发送过程是由系统自动管理的)
    await writer.StoreAsync();
}
catch(Exception)
{
    //这里做异常处理,比如发送失败的原因判断
}

那么这样就可以正常发送数据了。

接下来是接收服务器发来的信息,接收服务器发来的信息与以前的Socket 监听方法同样是一次性执行的,使用DataReader对象进行数据读取,下面是官方的Demo中的代码:

uint stringLength = reader.ReadUInt32(); //读取包头的最前面4个字节,这里是协议中有描述包有多长,不是真正的包的长度
uint actualStringLength = await reader.LoadAsync(stringLength);
if (stringLength != actualStringLength)
{
    // 如果包头描述的长度与接收到的长度不一致则表示对方过早断开连接,包不可用
    return;
}

string data = reader.ReadString(actualStringLength);

那么我的要做的是持续的监听从服务端发送过来的数据,那么很简单,用死循环制造一个不停监听的线程,刚好我们的方法是一个异步方法,省去了对线程的管理使其变的很简单。代码如下:

private async void Listen()
{
    Stream stream = _socket.InputStream.AsStreamForRead(1024);
    byte[] buffer = new byte[1024];

    while (true)
    {
        int len = stream.Read(buffer, 0, buffer.Length);//这个方法会等待有数据从服务器发送过来后才执行后续代码
        if (len == 0)
        {//接收长度为0这表示断开连接
            return;
        }

        try
        {
            //数据处理逻辑
        }
        catch (ObjectDisposedException ex)
        {
            Logger.Log.Warn(ex);
            Close();
            return;
        }
    }
}

不过我总觉得这种做法有点不符合StreamSocket 的做法,但是目前的问题被解决了。如果以后找到别的做法再做更新吧。

原文地址:https://www.cnblogs.com/masahiro/p/10127098.html

时间: 2024-10-24 15:38:24

Windows8 Metro界面下的StreamSocket 发送数据与接收数据的相关文章

Java基础知识强化之网络编程笔记06:TCP之TCP协议发送数据 和 接收数据

1. TCP协议发送数据 和 接收数据 TCP协议接收数据:• 创建接收端的Socket对象• 监听客户端连接.返回一个对应的Socket对象• 获取输入流,读取数据显示在控制台• 释放资源 TCP协议发送数据: • 创建发送端的Socket对象• 这一步如果成功,就说明连接已经建立成功了.• 获取输出流,写数据• 释放资源 2. 代码实现: (1)发送端: 1 package cn.itcast_06; 2 3 import java.io.IOException; 4 import java

Java基础知识强化之网络编程笔记03:UDP之UDP协议发送数据 和 接收数据

1. UDP协议发送数据 和 接收数据 UDP协议发送数据: • 创建发送端的Socket对象 • 创建数据,并把数据打包 • 调用Socket对象的发送方法,发送数据包 • 释放资源  UDP协议接收数据:       • 创建接收端的Socket对象      • 创建数据包,接收数据(接收容器)      • 调用Socket对象的接收方法,接收数据包      • 解析数据包,并显示在控制台      • 释放资源 2. 代码实现 (1)首先我们先写发送端的程序,如下: 1 packag

MVC系列学习(五)-传递数据 与 接收数据

1.控制器向视图传递数据 a.使用ViewData b.使用ViewBag c.使用Model 方式二: d.使用TempData 2.Action接收Url中的数据 Action接收客户端请求的参数 a.根据配置信息来接收参数(路由配置信息) 注:如果View中 不写任何视图文件,则默认加载与 该控制器同名的视图 b.根据模型绑定(Model) 注:Redirect("/Home/Index")是跳转得到指定 的 Home控制器下 的 Index 视图 c.通过Request.For

说说ajax上传数据和接收数据

我是一个脑袋不太灵光的人,所以遇到问题,厚着脸皮去请教大神的时候,害怕被大神鄙视,但是还是被鄙视了.我说自己不要点脸面,那是不可能的,但是,为了能让自己的技术生涯能走的更长远一些,受点白眼,受点嘲笑也不算什么.重在被各种鄙视之后,我学到了什么,这才是关键的.好吧,我在自我安慰.哈哈,废话不多说啦,说正题. 我一直觉得ajax是个神奇的存在,但是之前我做的都是通过ajax去接收数据,栗如: $.ajax({ type: "get", url: "https://www.baid

转:Windows8内核模式下开发NDIS应用-NDIS Filter讲解

http://blog.csdn.net/itcastcpp/article/details/7752075 在Win8系统下开发驱动程序,需要数字证书,还需要驱动签名认证.不能像XP下面那样疯狂滴耍流氓了. 由于Win8系统的内核做了大幅度的修改,它和XP系统的内核起了很大的变化,最显著的就是刚才说的:需要签名和证书.  还有就是:不能随意的HOOK SSDT了. 在开发NDIS驱动程序的时候,WDK开发包提供了一个新的框架,叫着NDIS FilterNDIS Filter是一个例子工程.假入

UDP学习4(单个窗口发送接收数据)

接着之前的UDP学习.想在单个窗口中实现接收以及发送数据,这个如何实现呢?首先想到的是通过多线程实现发送数据以及接收数据,这样就把问题解决了.下面是代码: 1 import java.net.*; 2 import java.io.*; 3 class UDPSendThread implements Runnable 4 { 5 private DatagramSocket ds=null; 6 public UDPSendThread(DatagramSocket ds) 7 { 8 thi

Spark发行版笔记10:Spark Streaming源码解读之流数据不断接收和全生命周期彻底研究和思考

本节的主要内容: 一.数据接受架构和设计模式 二.接受数据的源码解读 Spark Streaming不断持续的接收数据,具有Receiver的Spark 应用程序的考虑. Receiver和Driver在不同进程,Receiver接收数据后要不断给Deriver汇报. 因为Driver负责调度,Receiver接收的数据如果不汇报给Deriver,Deriver调度时不会把接收的数据计算入调度系统中(如:数据ID,Block分片). 思考Spark Streaming接收数据: 不断有循环器接收

BCG界面库下的Windows8 UI界面样式www.webui8.com

BCG界面库下的Windows8 UI界面样式(Metro风格)控件主要有以下一些功能: 规则的大块磁贴 支持完整键盘导航 Tile组 标题(Caption) 标题按钮(Caption buttons) 矩形或圆形的磁贴形状 水平("Landscape")和 垂直("Portrait")布局 Tile页头和多行文本 Tile图像 支持数字或标志性徽章 "Live" tiles 自定义颜色和画刷 自定义磁贴 系统独立:由于BCG只是模仿了Windo

串口调试助手-发送数据,按字符或16进制显示接收数据的C#程序

一. 新手上路,一般几种方法来学习VS2010的C#编程: 1.查阅各种书籍和技术文档,传统而耗时: 2.借助视频教程快速上手,省事有效却无法掌握一些小细节,写起程序来,各种调试不通过,还是浪费时间: 3.直接采用网络大神的程序,在运行成功的前提下,再仔细消化各种精髓,方法虽然高效,但也是建立在作者编写文档友好的情况下. 对于以上的第一种适合那种不着急项目进度,只管自己开心满足自己兴趣的新手,第二种适合那种需要赶进度.不需要太注意小细节的项目,第三种属于技术渣,为了像我这种技术渣的新手们上路更轻