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

目录
相关文章
|
22天前
|
缓存 监控 Java
Java Socket编程最佳实践:优化客户端-服务器通信性能
【6月更文挑战第21天】Java Socket编程优化涉及识别性能瓶颈,如网络延迟和CPU计算。使用非阻塞I/O(NIO)和多路复用技术提升并发处理能力,减少线程上下文切换。缓存利用可减少I/O操作,异步I/O(AIO)进一步提高效率。持续监控系统性能是关键。通过实践这些策略,开发者能构建高效稳定的通信系统。
|
22天前
|
Java 应用服务中间件 开发者
【实战指南】Java Socket编程:构建高效的客户端-服务器通信
【6月更文挑战第21天】Java Socket编程用于构建客户端-服务器通信。`Socket`和`ServerSocket`类分别处理两端的连接。实战案例展示了一个简单的聊天应用,服务器监听端口,接收客户端连接,并使用多线程处理每个客户端消息。客户端连接服务器,发送并接收消息。了解这些基础,加上错误处理和优化,能帮你开始构建高效网络应用。
|
22天前
|
IDE Java 开发工具
从零开始学Java Socket编程:客户端与服务器通信实战
【6月更文挑战第21天】Java Socket编程教程带你从零开始构建简单的客户端-服务器通信。安装JDK后,在命令行分别运行`SimpleServer`和`SimpleClient`。服务器监听端口,接收并回显客户端消息;客户端连接服务器,发送“Hello, Server!”并显示服务器响应。这是网络通信基础,为更复杂的网络应用打下基础。开始你的Socket编程之旅吧!
|
22天前
|
Java
Java Socket编程与多线程:提升客户端-服务器通信的并发性能
【6月更文挑战第21天】Java网络编程中,Socket结合多线程提升并发性能,服务器对每个客户端连接启动新线程处理,如示例所示,实现每个客户端的独立操作。多线程利用多核处理器能力,避免串行等待,提升响应速度。防止死锁需减少共享资源,统一锁定顺序,使用超时和重试策略。使用synchronized、ReentrantLock等维持数据一致性。多线程带来性能提升的同时,也伴随复杂性和挑战。
|
22天前
|
安全 Java 网络安全
Java Socket编程教程:构建安全可靠的客户端-服务器通信
【6月更文挑战第21天】构建安全的Java Socket通信涉及SSL/TLS加密、异常处理和重连策略。示例中,`SecureServer`使用SSLServerSocketFactory创建加密连接,而`ReliableClient`展示异常捕获与自动重连。理解安全意识,如防数据截获和中间人攻击,是首要步骤。通过良好的编程实践,确保网络应用在复杂环境中稳定且安全。
|
5天前
|
网络协议 安全 Java
Java中的网络编程:Socket编程详解
Java中的网络编程:Socket编程详解
|
8天前
|
Java API 开发者
Java中的Socket编程与应用
Java中的Socket编程与应用
|
10天前
|
网络协议 安全 Java
Java中的网络编程:Socket编程详解
Java中的网络编程:Socket编程详解
|
10天前
|
Java API 开发者
Java中的Socket编程与应用
Java中的Socket编程与应用
|
12天前
|
监控 Java API
Java Socket编程入门
Java Socket编程入门

热门文章

最新文章