silverlight中的socket编程注意事项

简介: 1.粘包 目前sl中的socket只能用tcp/ip协议,而tcp/ip本质是一个"流"协议,也就是说数据无边界,发送的就是一连串的字节(没有数据包的概念),因此连续发送时有所谓的“粘包”现象,详细解释如下: 比如你设置发送缓冲区的大小是512字节,如果(在相隔时间极短的情况下)连续发送次数据,...

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协议支持,这样应用范围将更加广泛。

目录
相关文章
|
7天前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
7天前
|
程序员 开发者 Python
Python网络编程基础(Socket编程) 错误处理和异常处理的最佳实践
【4月更文挑战第11天】在网络编程中,错误处理和异常管理不仅是为了程序的健壮性,也是为了提供清晰的用户反馈以及优雅的故障恢复。在前面的章节中,我们讨论了如何使用`try-except`语句来处理网络错误。现在,我们将深入探讨错误处理和异常处理的最佳实践。
|
11天前
|
网络协议 程序员 Python
pythonTCP客户端编程创建Socket对象
【4月更文挑战第6天】本教程介绍了TCP客户端如何创建Socket对象。Socket作为网络通信的基础单元,包含协议、IP地址和端口等信息。在TCP/IP中,Socket分为流式(TCP)、数据报(UDP)和原始套接字。以Python为例,创建TCP Socket对象需调用`socket.socket(AF_INET, SOCK_STREAM)`。为确保健壮性,应使用异常处理处理可能的`socket.error`。学习本教程将帮助你掌握TCP客户端创建Socket对象的技能。
|
1月前
|
网络协议 安全 API
计算机网络之Socket编程
计算机网络之Socket编程
|
2月前
|
网络协议 安全 开发者
Python 中的 Socket 编程
Python 中的 Socket 编程
40 4
|
3月前
socket编程之回声服务器函数的陷阱
由connect函数使用不当导致的小错误 话不多说先看代码:
25 0
|
3月前
|
C语言
socket编程之回声服务器
回声服务器的实现 结合我们之前对socket函数的分析,现在做一个最简单的回声服务器(由客户端输入一串字符,再由服务器端转换成大写字符回显给客户端)
26 0
|
3月前
|
API C++
socket编程之常用api介绍与socket、select、poll、epoll高并发服务器模型代码实现(1)
前言   本文旨在学习socket网络编程这一块的内容,epoll是重中之重,后续文章写reactor模型是建立在epoll之上的。
34 0
|
3月前
|
监控 安全 Linux
socket编程之常用api介绍与socket、select、poll、epoll高并发服务器模型代码实现(3)
高并发服务器模型-poll poll介绍   poll跟select类似, 监控多路IO, 但poll不能跨平台。其实poll就是把select三个文件描述符集合变成一个集合了。
35 0
|
22天前
|
网络协议 Perl
Perl 教程 之 Perl Socket 编程 6
Perl Socket教程展示了如何进行网络通信。服务端(server.pl)创建一个TCP套接字,绑定到端口7890并监听,接收客户端连接并发送消息。客户端(client.pl)连接到服务端,接收并打印消息。在两个不同终端上分别运行服务端和客户端可实现交互。
24 2