一、介绍
1.在internate网络中,数据按照有限大小的数据包进行传输,这些包被称为数据报(datagram)。
2.每个数据报主要包含部分:一个首部header和一个有效负载payload.
a.首部:主要包含目的地地址和端口、来源地址和端口、检查数据是否被破坏的校验和、以及其他保证可靠传输的其他管理信息。
b.有效负载:包含数据本身。
由于每个数据报的大小是有限的,通常一个完整的数据在传输时,会将数据分成多个数据报即包,所有的包在目的地重新组合形成一个完整的数据。在数据传输过程中也有可能一个或者多个数据报丢失或遭到破坏,这个时候需要重传。也有可能包到达目的地的顺序乱序,则会重新排序。所有这些(如何将数据分解为包,如何生成首部,如何解析如站包的首部、跟踪那些包已经收到而哪些还么有收到等等这些步骤)是很复杂的工作,需要大量的代码来进行实现。
但是,在java中不需要自己去实现这些底层的逻辑,操作的时候只需要socket即可,他们就是另外一种读写字节的流操作。java网络编程掩盖了底层的操作,如错误检测,包大小,包分解,包重传,网络地址等等。
二、Socket的使用
1.socket是两台主机的连接,主要包括以下7个操作部分:
1.连接远程服务器
2.发送数据
3.接收数据
4.关闭连接
5.服务器绑定端口
6.服务器监听入栈数据
7.服务器在绑定端口上接受来自远程机器(客户端)的连接。
java的Socket类(客户端和服务器都可以使用)提供了对应前4个步骤的操作的方法。后面三个步骤操作近服务器需要,即等待客户端的连接。这些操作由ServerSocket类来实现。java程序通常采用以下方式使用客户端socket:
1.程序用构造函数创建一个新的Socket。
2.Socket尝试连接远程主机。
一旦建立了连接,本地和远程主机就从socket得到输入和输出流,使用这两个流相互发送数据。连接是全双工个的,2台机器都可以同时发送和接受数据。