使用 ServerSocket
类的 implAccept
方法能够使用 accept
方法返回一个 Socket
子类对象。但 implAccept
是 protected
方法,所以,必须在 ServerSocket
类的子类中覆盖 accept
方法,而后在 accept
方法中使用 implAccept
方法从新设置 Socket
对象。 implAccept
方法的定义以下:
protected
final
void
implAccept(Socket s)
throws
IOException
只要经过 implAccept
方法设置一个未链接的 Socket
子类对象, accept
方法就会返回一个已经链接的 Socket
子类对象( accept
返回的是 Socket
对象,要想获得 Socket
子类对象,必须进行类型转换)。在大多数时候不须要改变 accept
方法的行为,但有时须要一个有更多特性的 Socket
类。经过 implAccept
方法就能够达到这个目的。
下面的代码定义了一个从 Socket
继承的 HttpSocket
类,这个类除了具备 Socket
类的一切特性外,还增长了一个方法 getRequestHeaders
,用于返回 HTTP
请求的头信息。
package
server;
import
java.net.
*
;
import
java.io.
*
;
class
HttpSocket
extends
Socket {
public
String getRequestHeaders()
throws
Exception { InputStreamReader isr
=
new
InputStreamReader(getInputStream()); BufferedReader br
=
new
BufferedReader(isr); String s
=
""
, result
=
""
;
while
(
!
(s
=
br.readLine()).equals(
""
)) result
=
result
+
s
+
"
\r\n
"
;
return
result; } }
class
HttpServerSocket
extends
ServerSocket {
public
HttpServerSocket(
int
port)
throws
IOException {
super
(port); }
public
Socket accept()
throws
IOException
//
覆盖accept方法
{ Socket s
=
new
HttpSocket(); implAccept(s);
//
将accept方法返回的对象类型设为HttpSocket
return
s; } }
public
class
CustomAccept {
public
static
void
main(String[] args)
throws
Exception { HttpServerSocket httpServerSocket
=
new
HttpServerSocket(
1234
); HttpSocket httpSocket
=
(HttpSocket) httpServerSocket.accept(); System.out.println(httpSocket.getRequestHeaders());
//
向控制台输出HTTP请求头
httpServerSocket.close(); } }
测试
执行以下命令:
java server.CustomAccept
在IE的地址栏中输入以下Url:
http:
//
localhost:1234
CustomAccept在控制台中的运行结果:
GET / HTTP/
1.1
Accept: */* Accept-Language: zh-cn UA-CPU: x86 Accept-Encoding: gzip
,
deflate User-Agent: Mozilla/
4.0
(compatible
;
MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.1; InfoPath.2)
Host: localhost:
1234
Connection: Keep-Alive