1.粘包

目前sl中的socket只能用tcp/ip协议,而tcp/ip本质是一个"流"协议,也就是说数据无边界,发送的就是一连串的字节(没有数据包的概念),因此连续发送时有所谓的“粘包”现象,详细解释如下:

比如你设置发送缓冲区的大小是512字节,如果(在相隔时间极短的情况下)连续发送次数据,第一次为500字节,第二次为100字节,实际上你在服务器端接收到的二次数据长度并不是500和100,而是512和88.

换言之:如果socket能“感觉”到马上还有数据要发送,而且在本次发送的缓冲区还有空余时,它会自动把下次发送的内容挪一部分过来,直到本次缓冲区填满,以便有效的利用缓冲区,减少发送次数,至于它是如何感觉的,我就不知道鸟:)

所以如果想正确的划清数据边界,得自己想办法封包/拆包

常见的解决办法:在发送方与接收方制定一个共同的约定,比如定义一个结构体struct,把“包长度,包序号,要发送的数据,包的唯一标识...”这一堆东西封装在struct中,然后通过序列化最终得到一个byte[]进行发送。

另外如果最终得到的byte[]太大,超过了数据下标所允许的最大值(比如传递大文件时),会导致接收时反序列化失败,所以还得人工把大块头数据割成一块一块,这里有一个技巧:为了避免前面提到“scoket自我感觉良好”进行的数据挪移,分割的单位建议正好就是缓冲区的大小,如果不足一个缓冲区,宁可凑数填写一些空字节也要凑满一个缓冲区长度--这样系统会觉得你在高效使用缓冲区,没有浪费,也就不会管闲事了 :)

2.异常捕获

网络编程中,会有各种不可控的情况,所以异常的捕获很重要,否则程序会用着用着就挂掉了。

3.异常数据包的及时清理

异常数据包指“非法的”或“不完整的(比如一个大文件最终拆分成10个包,结果第10个包都收到了,前面的某个包即始终收不到)”数据包,对于这类数据包,要及时清理否则会一直占用资源(必要时可以将连接关闭)

后话:很期待silverlight在未来的版本中,加入udp协议支持,这样应用范围将更加广泛。

转载于:https://www.cnblogs.com/yjmyzz/archive/2009/12/02/1615204.html

silverlight中的socket编程注意事项相关推荐

  1. asp.core api 通过socket和服务器通信发送udp_读懂Java中的Socket编程

    Socket,又称为套接字,Socket是计算机网络通信的基本的技术之一.如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的.本文会介绍一下基于TCP/IP的S ...

  2. 读懂Java中的Socket编程

    Socket,又称为套接字,Socket是计算机网络通信的基本的技术之一.如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的.本文会介绍一下基于TCP/IP的S ...

  3. Go中的Socket编程

    在很多底层网络应用开发者的眼里一切编程都是Socket,话虽然有点夸张,但却也几乎如此了,现在的网络编程几乎都是用Socket来编程.你想过这些情景么?我们每天打开浏览器浏览网页时,浏览器进程怎么和W ...

  4. c++ socket编程_C/C++中的Socket编程

    什么是socket编程? Socket编程是将网络上的两个节点连接起来相互通信的一种方式.一个套接字(节点)侦听IP上的特定端口,而另一个套接字与另一个套接字连接.服务器形成侦听器套接字,而客户端可以 ...

  5. Linux中的socket编程

    目录 0.前言 1.Linux中socket编程接口详解 1.1.socket函数 1.2.bind函数 为什么addr参数要使用sockaddr_in 结构体,然后再强制转换为 sockaddr 类 ...

  6. 在QT中使用socket编程:解决connect函数名称冲突

    问题 当使用QT做可视化界面的时候,我们知道connect函数是连接函数,用于连接信号与槽,但connect在C/C++的socket网络编程中也是一个必不可少的函数,作用是发送连接请求,建立tcp连 ...

  7. 在Silverlight中使用Socket进行通信(1)Socket请求-回复方式的简易数据交换

    很久之前用过Socket,由于近期项目需要用socket传输视频流,早上花了半小时回顾了一下. Socket类简要介绍 socket下提供的主要类有四个,分别是socket,tcpclient,tcp ...

  8. python中使用socket编程实现带有界面的客户端向服务端发送文件和下载文件

    一主界面: **二:发送文件界面:**首先需要开启发送文件服务端(这里需要注意的是每一次发送文件之前都需要开启一次服务端,因为我在这里将每一次发送文件之后就关闭了客户端和服务端之间的连接) 输出相关客 ...

  9. C++中的Socket编程使用协议发送图片

    使用: (1)首先运行服务端,待服务端运行起来: (2)最后运行客户端,输入要传输文件到哪个目标机器的IP地址: (3)输入传输文件的路径及文件(完成的路径),其中包含文件的类型,也就是后缀需要包含( ...

最新文章

  1. 通过醉品商城改版反思网站改版的那些事
  2. 正则不能全为某个值_TensorFlow学习Program1——补充附录(7)线性回归、逻辑回归与正则化...
  3. 局域网限速软件_2号破解app重器推荐一款强大的快捷软件
  4. Linux格式化分区的命令
  5. sqlserver如何读写操作windows系统的文件
  6. 即时通讯成为热门传播媒体
  7. diskgeniusv4.4.0_一文上手最新Tensorflow2.0系列|TensorFlow2.0安装
  8. 问题五十四:怎么用ray tracing画参数方程表示的曲面(2)—— bezier surface
  9. ssh相关命令Linux,Linux SSH常用命令 [长期更新]...
  10. 关于CF平台中基础服务的监控方案
  11. bash给脚本加进度条_shell脚本进度条。
  12. 实对称矩阵的特征值求法_旋转之三 - 旋转矩阵
  13. linux环境使用c语言获取系统时间,并拼接成字符串
  14. 马克思在《数学手稿》中提出如下问题:有30个人(包括男人、女人和小孩)在一家饭店吃饭共花50先令,其中每个男人花3先令,每个女人花2先令,每个小孩花1先令,问男人、女人、小孩各有多少人
  15. VMware虚拟机文件格式详解
  16. win7啊,我的纠结,ip啊
  17. 情感天地——《不能牵手就握手吧》
  18. 打印机无法获取IP地址备忘录
  19. 免费领,自动化控制编程入门到开挂学习路径(附教程和软件工具)
  20. 【pycharm和anaconda安装教程】

热门文章

  1. 用ASP.NET AJAX框架扩展HTML Map控件
  2. MySQL内部执行流程
  3. json.dumps和loads方法
  4. OpenLayers 3+Geoserver+PostGIS实现点击查询
  5. Unity 一个脚本调用另一个脚本的函数
  6. input image和img button区别
  7. win32之hPrevInstance
  8. DSDT亮度修复失败
  9. Sum-product Networks
  10. native-maven-plugin与maven-nar-plugin配置