Java网络编程入门(一)

2014-11-24 09:19:33 · 作者: · 浏览: 3
Java网络 编程入门
服务器与客户程序只需关心发送什么样的数据给对方,而不必考虑如何把这些数据传输给对方,传输数据的任务由计算机网络完成。
两个进程顺利通信的前提条件是它们所在的主机都连接到了计算机网络上。
网络协议是网络中主机之间通信的语言。
不同网络之间的互联靠网络上的标准语言——TCP/IP协议。
OSI参考模型把网络分为7层,分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。不同主机之间的相同层称为对等层。
物理层:为上一层提供物理连接,以及规定通信节点之间的机械和电气特性。数据作为原始的比特(bit)流传输。
数据链路层:数据链路层负责在两个相邻节点间的线路上,无差错地传送以帧为单位的数据。典型设备是交换机。
网络层:选择合适的网间路由和交换节点,确保数据及时传送到目标主机。典型设备是路由器。
传输层:根据通信子网的特性最佳地利用网络资源,为两个端系统的会话层提供建立、维护和取消传输连接的功能,以可靠方式或不可靠方式传输数据。信息的传送单位是报文。
会话层:管理进程间的会话过程,即负责建立、管理、终止进程间的会话。数据传送单位是报文。
表示层:对上层数据进行转换,以保证一个主机的应用层的数据可以被另一个主机的应用层理解。数据传送单位是报文。
应用层:确定进程间通信的实际用途,以满足用户实际需求。
发送方每一层会给上一层传递来的数据加上一个信息头。接收方每一层会把信息头去掉。
对等层之间互相通信需要遵守一定的规则,如通信的内容和通信的方式,这种规则称为网络协议。
OSI模型各层典型协议:书P8
TCP/IP参考模型分为4个层次:应用层、传输层、网络互联层和主机-网络层。
TCP/IP参考模型各层协议:书P9
TCP协议:面向连接的、可靠的协议。
UDP协议:不可靠的、无连接协议。
IP协议:IP地址(IP网址+IP主机地址),网络掩码与IP地址进行二进制与操作,得到的结果就是IP网址。
DNS协议采用DNS服务器来提供把域名转换为IP地址。
TCP采用端口区分进程。TCP连接的两个端点用端口来标识。
每个进程有了唯一的地址,TCP就能保证把数据顺利送达特定的进程。
端口号的范围为0到65535。0-1023操作系统保留。
服务端端口号需要指定,客户端端口号一般系统动态分配。
TCP和UDP都用端口来标识进程,取值范围各自独立,允许存在取值相同的TCP端口和UDP端口。
客户/服务器模式,一个服务器进程会同时为多个客户进程服务。
常用服务及端口,书17页。
传输层向应用层提供了套接字Socket接口,Socket封装了下层数据传输细节,应用层程序通过Socket来建立与远程主机的连接,以及进行数据传输。
Java中有3种套接字类:Socket、ServerSocket、DatagramSocket。
Socket和ServerSocket建立在TCP协议上,DatagramSocket建立在UDP协议上。
第2章 Socket用法详解
客户/服务器通信模式中,客户端需要主动创建与服务器连接的Socket,服务端收到客户端连接请求,也会创建与客户连接的Socket。
等待建立连接的超时时间,默认情况下会一直等待下去,通过不带参数的Socket构造方法可以设定等待时间,单位毫秒,为0表示永远不会超时。
设定服务器地址,InetAddress
设定客户端地址,Socket对象既包含服务器IP和端口也包括客户端地址和端口,对于拥有多个IP地址的客户端可指定使用哪个IP。
客户端连接服务端的异常:UnknownHostException(无法识别主机名或IP地址),ConnectionException(服务端没有监听指定端口或者拒绝连接),SocketTimeoutException(连接超时),BindException(无法把Socket对象与客户端IP或端口绑定),详见ConnectTester类
getInputStream和getOutputStream:如果Socket还没有连接或者已经关闭,或者已经调用shutdownInput(shutdownOutput)方法,则关闭输入输出流。
当通信结束,应及时通过close方法关闭Socket。强烈建议放在finally代码中确保总是执行。
Socket状态:isClose(如果已连接到远程主机,且还未关闭,返回true),isConnected(如果曾经连接到远程主机,返回true),isBound(如果已经与一个本地端口绑定,则返回true)
半关闭Socket,结束通信的几种方式:书33页
(1) 字符流:约定特殊字符
(2) 约定数据长度
(3) 发送方发完数据后,关闭Socket,这时接收端调用输入流的read方法返回值为-1
(4) 关闭输入或输出流,最终还需要调用Socket的close方法关闭Socket连接
isInputShutdown和isOutputShutdown用于检测输入输出流状态
通信双方的终止方式:
(1) 自然结束
(2) 提前终止服务器端:服务器端突然结束,客户端会仍然会发送完全部数据后自然结束,这是因为服务器端底层Socket并没有立即释放,操作系统探测到还有发送给该端口的数据,会继续占用一断时间
(3) 突然终止客户端:抛出Connection reset异常
(4) 关闭或半关闭:服务器端抛出Connection reset异常
Socket选项:
TCP_NODELAY:是否立即发送数据,Negale算法,发送大批量数据,并且接收端及时响应的情况下很有用,如果是发送少量数据并且接收端不及时响应则会严重降低性能,采用该算法将把发送数据缓冲起来到一定大小后一次性发出,等待接收端响应后再发送下一批数据。
默认false采用该算法。
SO_RESUSEADDR:调用Socket的close方法关闭连接后,不会立刻端口,这时其他进程绑定到该端口将失败,设置SO_RESUSEADDR为true将使得其他进程可以重用这个端口。必须在绑定到端口之前调用。一般是服务器端存在该问题。新进程不会收到之前的数据。
SO_TIMEOUT:接收数据的等待超时时间,单位毫秒,默认0表示永远等待。要在接收数据之前设置。
SO_LINGER:Socket连接是否立即关闭
SO_SNFBUF:输出数据缓冲区大小,大批量数据建议大点,频繁传送小数据建议小点
SO_RCVBUF:输入数据缓冲区大小
SO_KEEPALIVE:为true时底层实现会监视连接有效性,客户端使用
OOBINLINE:为true时表示支持发送一个字节的紧急数据,一般不用。
服务类型:
IP规定了4中服务类型:
1、低成本:发送成本低
2、高可靠性:保证鲍数据可靠的发送到目的地
3、高吞吐量:一次接受发送大量数据
4、最小延迟:传输数据快,最快发送到目的地
设置服务类型:setTrafficClass(int trafficClass);
底成本:0x02
高可靠:0x04
最高吞吐量:0x08
最小延迟:0x10
连接时间、延迟、带宽的相对重要性:setPerformancePreference
第3章 ServerSocket用法详解
服务器端创建Se