您的位置:首页 > 理论基础 > 计算机网络

Java网络编程从入门到精通(30):定制accept方法

2009-08-15 16:47 761 查看
本文为原创,如需转载,请注明作者和出处,谢谢!



上一篇:Java网络编程从入门到精通(29):服务端Socket的选项

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

上面的运行结果就是IE向服务端发出的HTTP请求头的内容。这个运行结果会根据客户机配置的不同而有所差异。

下一篇:Java网络编程从入门到精通(31):非阻塞I/O简介

国内最棒的Google Android技术社区(eoeandroid),欢迎访问!

《银河系列原创教程》发布

《Java Web开发速学宝典》出版,欢迎定购
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐