使用 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