闲的蛋疼,于是就打算写点什么。本来在研究简单TCPIP服务的,后来发现本机上居然没有,f**k ,于是就去搞搞http服务了。
本机上装的是apache Http服务器,网上找到http协议的格式,最简单的是 GET PATH HTTP/1.1 (CRLF) ,于是就用java写了起来。
第一次代码很简单, 直接用socket 连接本机80端口,然后向端口写"GET / HTTP/1.1"然后就等待。
结果。。就读不出来。百度之, http 协议需要以俩个换行做结束符。于是就把代码改成这样。
BufferedReader in = new BufferedReader( new InputStreamReader(soc.getInputStream()));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(soc.getOutputStream()));
out.write("GET / HTTP/1.1\r\n");
out.write("\r\n");
out.flush();
结果,给我返回了400错误。当时把语法错误理解错了,以为是字符编码的问题,百度后找到个URLEncoder.encode设置字符的方法。
这倒好,直接返回了501错误。这个错误误导了我很长时间。
最后还是去查http协议,发现GET方法还有一些附加信息。加上附加信息后,调试成功。最后发现,其实只要在附加信息中指定host就可以了。我觉得这个可能和不同的http服务器有关。
代码如下
package baiyangtx;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class HttpConnection
{
/**
* @param args
* @throws IOException
* @throws UnknownHostException
*/
public static void main(String[] args) throws UnknownHostException, IOException
{
String ip = "127.0.0.1" ;
int port = 80 ;
Socket soc = new Socket(ip, port);
System.out.println("----------------------------------");
System.out.println("\n\n\n\n");
BufferedReader in = new BufferedReader( new InputStreamReader(soc.getInputStream()));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(soc.getOutputStream()));
StringBuffer meth = new StringBuffer();
meth.append("GET / HTTP/1.1\r\n");
// meth.append("accept:*/*\r\n");
meth.append("host:127.0.0.1\r\n");
meth.append("");
meth.append("");
out.write(meth.toString());
out.write("\r\n");
out.flush();
String line = null ;
while( (line = in.readLine())!= null)
{
System.out.println(line);
}
in.close() ;
out.close() ;
soc.close() ;
}
}
输出
----------------------------------
HTTP/1.1 200 OK
Date: Tue, 06 Mar 2012 12:32:58 GMT
Server: Apache/2.2.22 (Win32)
Last-Modified: Tue, 06 Mar 2012 11:46:06 GMT
ETag: "b000000008d9e-57-4ba9196947acd"
Accept-Ranges: bytes
Content-Length: 87
Content-Type: text/html
<head>
<title>?1?7?1?7?1?7?1?7?1?7?1?7?0?7</title>
</head>
<body> Here is body!</body>
</html>
终于看到了期待已久的HTTP/1.1 200 OK 。
<title>标签中的乱码是因为原来html文件中存的是中文。