Java网络编程精解chapter2_第1页
Java网络编程精解chapter2_第2页
Java网络编程精解chapter2_第3页
Java网络编程精解chapter2_第4页
Java网络编程精解chapter2_第5页
已阅读5页,还剩31页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java网络编程精解作者:孙卫琴参考书籍:<<Java网络编程精解>>技术支持网址:第2章Socket用法详解

参考《Java网络编程精解》的第2章2.1构造Socket 2.2获取Socket的信息 2.3关闭Socket 2.4半关闭Socket 2.5设置Socket的选项 2.6发送邮件的SMTP客户程序 2.1构造SocketSocket的构造方法有以下几种重载形式:(1)Socket()(2)Socket(InetAddressaddress,intport)throwsUnknownHostException,IOException(3)Socket(InetAddressaddress,intport,InetAddresslocalAddr,intlocalPort)throwsIOException(4)Socket(Stringhost,intport)throwsUnknownHostException,IOException(5)Socket(Stringhost,intport,InetAddresslocalAddr,intlocalPort)throwsIOException2.1.1设定等待建立连接的超时时间

设定等待建立连接的超时时间Socketsocket=newSocket();SocketAddressremoteAddr=newInetSocketAddress("localhost",8000);//等待建立连接的超时时间为1分钟socket.connect(remoteAddr,60000);

2.1.2设定服务器的地址Socket(InetAddressaddress,intport)Socket(Stringhost,intport)InetAddress的用法如下://返回本地主机的IP地址InetAddressaddr1=InetAddress.getLocalHost();//返回代表""的IP地址InetAddressaddr2=InetAddress.getByName("");//返回域名为""的IP地址InetAddressaddr3=InetAddress.getByName("");2.1.3设定客户端的地址在一个Socket对象中,既包含远程服务器的IP地址和端口信息,也包含本地客户端的IP地址和端口信息。默认情况下,客户端的IP地址来自于客户程序所在的主机,客户端的端口则由操作系统随机分配。Socket类还有两个构造方法允许显式的设置客户端的IP地址和端口:Socket(InetAddressaddress,intport,InetAddresslocalAddr,intlocalPort)throwsIOExceptionSocket(Stringhost,intport,InetAddresslocalAddr,intlocalPort)throwsIOException2.1.4客户连接服务器时可能抛出的异常当Socket的构造方法请求连接服务器时,可能会抛出以下异常:UnknownHostException:如果无法识别主机的名字或IP地址,就会抛出这种异常。ConnectException:如果没有服务器进程监听指定的端口,或者服务器进程拒绝连接,就会抛出这种异常。SocketTimeoutException:如果等待连接超时,就会抛出这种异常。BindException:如果无法把Socket对象与指定的本地IP地址或端口绑定,就会抛出这种异常。2.1.4客户连接服务器时可能抛出的异常2.1.4客户连接服务器时可能抛出的异常抛出UnknownHostException的情况:如果无法识别主机的名字或IP地址,就会抛出这种异常。抛出ConnectException的情况:没有服务器进程监听指定的端口。服务器进程拒绝连接。抛出SocketTimeoutException的情况:如果客户端等待连接超时,就会抛出这种异常。抛出BindException的情况:如果无法把Socket对象与指定的本地IP地址或端口绑定,就会抛出这种异常。2.2获取Socket的信息

以下方法用于获取Socket的有关信息:getInetAddress():获得远程服务器的IP地址。getPort():获得远程服务器的端口。getLocalAddress():获得客户本地的IP地址。getLocalPort():获得客户本地的端口。getInputStream():获得输入流。如果Socket还没有连接,或者已经关闭,或者已经通过shutdownInput()方法关闭输入流,那么此方法会抛出IOException。getOutputStream():获得输出流。如果Socket还没有连接,或者已经关闭,或者已经通过shutdownOutput()方法关闭输出流,那么此方法会抛出IOException。2.3关闭Socket当客户与服务器的通信结束,应该及时关闭Socket,以释放Socket占用的包括端口在内的各种资源。Socket的close()方法负责关闭Socket。Socketsocket=null;try{socket=newSocket("",80);//执行接收和发送数据的操作…}catch(IOExceptione){e.printStackTrace();}finally{try{if(socket!=null)socket.close();}catch(IOExceptione){e.printStackTrace();}}2.3关闭SocketSocket类提供了三个状态测试方法:isClosed()isConnected()isBound()如果要判断一个Socket对象当前是否处于连接状态,可采用以下方式:StringisConnected=socket.isConnected()&&!socket.isClosed();2.4半关闭Socket有的时候,可能仅仅希望关闭输出流或输入流之一。此时可以采用Socket类提供的半关闭方法:shutdownInput():关闭输入流。shutdownOutput():关闭输出流。2.4半关闭Socket先后调用Socket的shutdownInput()和shutdownOutput()方法,仅仅关闭了输入流和输出流,并不等价于调用Socket的close()方法。在通信结束后,仍然要调用Socket的close()方法,因为只有该方法才会释放Socket占用的资源,比如占用的本地端口等。Socket类还提供了两个状态测试方法,用来判断输入流和输出流是否关闭:publicbooleanisInputShutdown()publicbooleanisOutputShutdown()2.5设置Socket的选项TCP_NODELAY:表示立即发送数据。SO_RESUSEADDR:表示是否允许重用Socket所绑定的本地地址。SO_TIMEOUT:表示接收数据时的等待超时时间。SO_LINGER:表示当执行Socket的close()方法时,是否立即关闭底层的Socket。SO_SNFBUF:表示发送数据的缓冲区的大小。SO_RCVBUF:表示接收数据的缓冲区的大小。SO_KEEPALIVE:表示对于长时间处于空闲状态的Socket,是否要自动把它关闭。OOBINLINE:表示是否支持发送一个字节的TCP紧急数据。2.5.1TCP_NODELAY选项设置该选项:publicvoidsetTcpNoDelay(booleanon)throwsSocketException读取该选项:publicbooleangetTcpNoDelay()throwsSocketExceptionTCP_NODEALY的默认值为false,表示采用Negale算法。如果调用setTcpNoDelay(true)方法,就会关闭Socket的缓冲,确保数据及时发送:if(!socket.getTcpNoDelay())socket.setTcpNoDelay(true);如果Socket的底层实现不支持TCP_NODELAY选项,那么getTcpNoDelay()和setTcpNoDelay()方法会抛出SocketException。2.5.2SO_RESUSEADDR选项设置该选项:publicvoidsetResuseAddress(booleanon)throwsSocketException读取该选项:publicbooleangetResuseAddress()throwsSocketException为了确保一个进程关闭了Socket后,即使它还没释放端口,同一个主机上的其他进程还可以立刻重用该端口,可以调用Socket的setResuseAddress(true)方法:if(!socket.getResuseAddress())socket.setResuseAddress(true);值得注意的是socket.setResuseAddress(true)方法必须在Socket还没有绑定到一个本地端口之前调用,否则执行socket.setResuseAddress(true)方法无效。2.5.3SO_TIMEOUT选项设置该选项:publicvoidsetSoTimeout(intmilliseconds)throwsSocketException读取该选项:publicintgetSoTimeOut()throwsSocketException当通过Socket的输入流读数据时,如果还没有数据,就会等待。例Socket类的SO_TIMEOUT选项用于设定接收数据的等待超时时间,单位为毫秒,它的默认值为0,表示会无限等待,永远不会超时。2.5.4SO_LINGER选项设置该选项:publicvoidsetSoLinger(booleanon,intseconds)throwsSocketException读取该选项:publicintgetSoLinger()throwsSocketExceptionSO_LINGER选项用来控制Socket关闭时的行为。socket.setSoLinger(true,0):执行Socket的close()方法时,该方法也会立即返回,但底层的Socket也会立即关闭,所有未发送完的剩余数据被丢弃。socket.setSoLinger(true,3600):执行Socket的close()方法时,该方法不会立即返回,而进入阻塞状态,同时,底层的Socket会尝试发送剩余的数据。只有满足以下两个条件之一,close()方法才返回:底层的Socket已经发送完所有的剩余数据。尽管底层的Socket还没有发送完所有的剩余数据,但已经阻塞了3600秒。close()方法的阻塞时间超过3600秒,也会返回,剩余未发送的数据被丢弃。2.5.5SO_RCVBUF选项设置该选项:publicvoidsetReceiveBufferSize(intsize)throwsSocketException读取该选项:publicintgetReceiveBufferSize()throwsSocketExceptionSO_RCVBUF表示Socket的用于输入数据的缓冲区的大小。如果底层Socket不支持SO_RCVBUF选项,那么setReceiveBufferSize()方法会抛出SocketException。2.5.6SO_SNDBUF选项设置该选项:publicvoidsetSendBufferSize(intsize)throwsSocketException读取该选项:publicintgetSendBufferSize()throwsSocketExceptionSO_SNDBUF表示Socket的用于输出数据的缓冲区的大小。如果底层Socket不支持SO_SNDBUF选项,setSendBufferSize()方法会抛出SocketException。2.5.7SO_KEEPALIVE选项设置该选项:publicvoidsetKeepAlive(booleanon)throwsSocketException读取该选项:publicintgetKeepAlive()throwsSocketException当SO_KEEPALIVE选项为true,表示底层的TCP实现会监视该连接是否有效。SO_KEEPALIVE选项的默认值为false,表示TCP不会监视连接是否有效,不活动的客户端可能会永久存在下去,而不会注意到服务器已经崩溃。2.5.9服务类型选项IP规定了四种服务类型,用来定性的描述服务的质量:低成本:发送成本低。高可靠性:保证把数据可靠的送达目的地。最高吞吐量:一次可以接收或发送大批量的数据。最小延迟:传输数据的速度快,把数据快速送达目的地。2.5.9服务类型选项这四种服务类型还可以进行组合,例如,可以同时要求获得高可靠性和最小延迟。Socket类中提供了设置和读取服务类型的方法:设置服务类型:publicvoidsetTrafficClass(inttrafficClass)throwsSocketException读取服务类型:publicintgetTrafficClass()throwsSocketExceptionSocket类用四个整数表示服务类型:低成本:0x02(二进制的倒数第二位为1)高可靠性:0x04(二进制的倒数第三位为1)最高吞吐量:0x08(二进制的倒数第四位为1)最小延迟:0x10(二进制的倒数第五位为1)2.5.10设定连接时间、延迟和带宽的相对重要性publicvoidsetPerformancePreferences(intconnectionTime,intlatency,intbandwidth)以上方法的三个参数表示网络传输数据的三项指标:参数connectionTime:表示用最少时间建立连接。参数latency:表示最小延迟。参数bandwidth:表示最高带宽。setPerformancePreferences()方法用来设定这三项指标之间的相对重要性。可以为这些参数赋予任意的整数,这些整数之间的相对大小就决定了相应参数的相对重要性。例如,如果参数connectionTime为2,参数latency为1,而参数bandwidth为3,就表示最高带宽最重要,其次是最少连接时间,最后是最小延迟。2.6发送邮件的SMTP客户程序SMTP协议(SimpleMailTransferProtocol,简单邮件传输协议)是应用层的协议,建立在TCP/IP协议基础之上。SMTP协议规定了把邮件从发送方传输到接收方的规则。SMTP客户程序请求发送邮件,SMTP服务器负责把邮件传输到目的地。默认情况下,SMTP服务器监听25端口。在SMTP客户与SMTP服务器的一次会话过程中,SMTP客户会发送一系列SMTP命令,SMTP服务器则做出响应,返回相应的应答码,以及对应答码的描述。2.6发送邮件的SMTP客户程序2.6发送邮件的SMTP客户程序2.6发送邮件的SMTP客户程序MailSender类就是一个SMTP客户程序。它的sendMail()方法请求SMTP服务器发送一封邮件,发送过程如下:(1)首先创建与SMTP服务器连接的Socket对象。(2)当连接成功,SMTP服务器就会返回一个应答码为220的响应,表示服务就绪。(3)接着sendMail()方法开始发送“HELO”、“MAILFROM”、“RCPTTO”等命令,每条命令都按行发送,即以“\r\n”结束。每发送完一条命令后,都会等接收到了SMTP服务器的响应数据,然后再发送下一条命令。练习题1问题:对于以下程序代码:Socketsocket=newSocket();//第1行SocketAddressremoteAddr1=newInetSocketAddress("localhost",8000);//第2行SocketAddressremoteAddr2=newInetSocketAddress("localhost",8001);//第3行socket.connect(remoteAddr1,60000);//第4行socket.connect(remoteAddr2,60000);//第5行下面哪些说法是正确的?(多选)选项:a)以上程序代码可以顺利编译和运行通过。b)第1行程序代码创建了一个与本地匿名端口绑定的Socket对象。c)第1行程序代码创建的Socket对象没有与任何服务器建立连接,并且没有绑定任何本地端口。d)第5行程序代码会运行出错,因为一个Socket对象只允许建立一次连接。e)第4行程序代码使Socket对象与一个服务器建立连接,并且绑定一个本地匿名端口。答案:c,d,e练习题2问题:当客户端执行以下程序代码时:Socketsocket=newSocket("angel",80);如果远程服务器angel不存在,会出现什么情况?(单选)选项:a)构造方法抛出UnknownHostException异常。b)客户端一直等待连接,直到连接超时,从而抛出SocketTimeoutException。c)抛出BindException。d)构造方法返回一个Socket对象,但它不与任何服务器连接。答案:a练习题3问题:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论