对于java大牛的请绕路,这篇文章只适合初学或者有一定基础的java开发人员阅读。对于java开发中的I/O模块应该不陌生,比如文件读写,上传下载等等,都是要和I/O打交道,对于文件读写我们都知道输入流最终都有一个默认结束符号,或为-1,或为null,所以只要判断结束就可以完成读写操作了。至于流操作的对象类,再次不多做解释,可自行查阅文档脑补。
今天要讲的是Java中的socket,学习过网络编程课程的同学应该不陌生,socket是一种基于TCP/UDP协议的双通道句柄,也称作“套接字”。由Socket和ServerSocket组成,建立连接以后生成具体的输入流和输出流,借助流可完成数据通信。
具体怎么使用网上很多例子代码,在此我就不贴代码了,只说说我使用时遇到的坑:
坑1、socket的流其实不是真正意义上的流,因为根本就没有结束标志,如果按照普通操作流的方式使用,通道会因为读取不到结束标志而一直处于阻塞状态。
填坑:数据包你肯定听说过,就是具有一定结构的数据集合,如果你想正确稳定的读取socket数据,封装数据包是必不可少的,通常数据包的格式是:包头+数据体+校验码。包头一般存储数据体的大小,校验一般是数据体的md5值。
坑2、ServerSocket会休眠,现象就是隔一段时间访问的话,时间变长,但是连续访问的速度很快。
填坑:在服务端启动一个定时线程,定时给ServerSocket发送数据包,使得ServerSocket一直处于唤醒状态。
网友评论