方法
如果没有注明的话该方法就是公共的。
· Socket accept()产生java.io.IOException、java.lang.Security异常--等待客户端向某个服务器套接字请求连接,并接受连接。它是一种阻塞(blocking)I/O操作,并且不会返回,直到建立一个连接(除非设置了超时套接字选项)。当连接建立时,它将作为Socket对象被返回。当接受连接的时候,每个客户端请求都被默认的安全管理程序验证,这使得接受一定IP地址并阻塞其它IP地址、产生异常成为可能。但是,服务器程序不必依赖安全管理程序阻塞或终止连接--可以通过调用客户端套接字的getInetAddress()方法确定客户端的身份。
· void close()产生java.io.IOException异常--关闭服务器套接字,取消TCP端口的绑定,允许其它的服务使用该端口。
· InetAddress getInetAddress()--返回服务器套接字的地址,在多地址计算机中(例如某个计算机的本地主机可以通过两个或多个IP地址访问)它可能与本地地址不同。
· int getLocalPort()--返回服务器套接字绑定到的端口号。
· int getSoTimeout()产生java.io.IOException异常--返回超时套接字选项的值,该值决定accept()操作可以阻塞多少毫秒。如果返回的值为零,accept()操作无限期阻塞。
· void implAccept(Socket socket)产生java.io.IOException异常--这个方法允许ServerSocket子类传递一个未连接的套接字子类,让这个套接字对象接受输入的请求。使用implAccept方法接受连接时,重载的ServerSocket.accept()方法可以返回已连接的套接字。很少开发者希望对ServerSocket再细分类,在不必要的情况下应该避免使用它。
· static void setSocketFactory ( SocketImplFactory factory )产生java.io.IOException、java.net.SocketException、java.lang.SecurityException异常--为JVM指定服务器套接字产生组件。它是一个静态的方法,在JVM的生存周期中只能调用一次。如果禁止指定新的套接字产生组件,或者已经指定了一个,就会产生异常。
· void setSoTimeout(int timeout)产生java.net.SocketException异常--为accept()操作指定一个超时值(以毫秒计算)。如果指定的值是零,超时设置就被禁止了,该操作将无限制阻塞。但是,如果允许超时设置,在accept()方法被调用的时候就启动一个计时器。当计时器期满时,产生java.io.InterruptedIOException异常,并允许服务器程序执行进一步的操作。
3、从客户端接受和处理请求
服务器套接字的最重要的功能是接受客户端套接字。一旦获取了某个客户端套接字,服务器就可以执行服务器程序的所有"真实的工作",包括从套接字读取信息、向套接字写入信息以实现某种网络协议。发送或接收的准确数据依赖于该协议的详细情况。例如,对存储的消息提供访问的邮件服务器将监听命令并发回消息内容。telnet服务器监听键盘输入并把这些信息传递给一个登陆外壳(shell),并把输出发回网络客户端。具体协议的操作与网络的相关性很小,更多的面向编程。
下面的代码片断演示了如果接受客户端套接字,以及I/O流怎样连接到客户端:
从这个时候开始,服务器程序就可以处理任何需要完成的事务并响应客户端请求了,或者可以选择事务给另一个线程中的代码运行。请记住与Java中的其它形式的I/O操作类似,从客户端读取回应的时候代码会无限制阻塞--因此为了为多个客户端并行服务,必须使用多线程。但是在简单的情形中,多个执行线程可能是不必要的,特别是在对请求响应迅速并且处理时间很短的情况下。
建立完整实现通用Internet协议的客户端/服务器应用程序需要作大量的工作,对于网络编程的新手来说这一点更为明显。它也需要其它一些技巧,例如多线程编程。从现在开始,我们聚焦于一个简单的、作为单线程应用程序执行的TCP服务器程序框架。
|