來自:https://www.oschina.net/code/snippet_2009881_48232
import
java.io.BufferedReader;
import
java.io.BufferedWriter;
import
java.io.InputStreamReader;
import
java.io.OutputStreamWriter;
import
java.net.ConnectException;
import
java.net.InetAddress;
import
java.net.InetSocketAddress;
import
java.net.ServerSocket;
import
java.net.Socket;
import
java.net.SocketAddress;
import
java.net.SocketException;
import
java.net.SocketTimeoutException;
/**
* 用socket來收發http協議報文
* @author luoguansong lgsstart89@163.com
*/
public
class
SocketHttp {
public
static
void
main(String[] args) {
Thread threadReceive=
new
Thread(
new
TestReceiveHttp());
threadReceive.start();
// Thread threadSend=new Thread(new TestSendHttp());
// threadSend.start();
}
}
class
TestSendHttp
implements
Runnable{
@Override
public
void
run() {
try
{
String path =
"/"
;
String host =
"www.oschina.net"
;
int
port =
80
;
Socket socket =
new
Socket();
InetSocketAddress address=
new
InetSocketAddress(host, port);
socket.connect(address,
3000
);
OutputStreamWriter osw =
new
OutputStreamWriter(socket.getOutputStream(),
"utf-8"
);
osw.write(
"GET "
+ path +
" HTTP/1.1\r\n"
);
osw.write(
"Host: "
+ host +
" \r\n"
);
//http協議必須在報文頭后面再加一個換行,通知服務器發送完成,不然服務器會一直等待
osw.write(
"\r\n"
);
osw.flush();
socket.shutdownOutput();
BufferedReader bufferedReader =
new
BufferedReader(
new
InputStreamReader(socket.getInputStream(),
"utf-8"
));
String line =
null
;
while
((line = bufferedReader.readLine()) !=
null
) {
System.out.println(line);
}
osw.close();
bufferedReader.close();
socket.close();
}
catch
(ConnectException e) {
System.out.println(
"連接失敗"
);
}
catch
(SocketTimeoutException e) {
System.out.println(
"連接超時"
);
}
catch
(Exception e) {
System.out.println(e.getMessage());
}
}
}
class
TestReceiveHttp
implements
Runnable{
@Override
public
void
run() {
ServerSocket server;
Socket socket;
try
{
server=
new
ServerSocket(
8079
);
System.out.println(
"正在等待8079端口的請求"
);
while
(
true
){
socket=server.accept();
if
(socket!=
null
){
new
Thread(
new
TestReveiveThread(socket)).start();
}
}
}
catch
(Exception e) {
System.out.println(
"異常"
);
}
}
}
class
TestReveiveThread
implements
Runnable{
Socket socket;
public
TestReveiveThread(Socket s) {
socket=s;
}
public
void
run() {
try
{
BufferedReader bufferedReader =
new
BufferedReader(
new
InputStreamReader(socket.getInputStream(),
"utf-8"
));
OutputStreamWriter osw =
new
OutputStreamWriter(socket.getOutputStream(),
"utf-8"
);
String line=
null
;
while
((line=bufferedReader.readLine())!=
null
){
System.out.println(line);
if
(line.equals(
""
)){
break
;
}
}
//模擬http請求到網站,然后把內容轉發給當前的http請求
// String path = "/";
// String host = "www.oschina.net";
// int port = 80;
// Socket socket2 = new Socket(host, port);
// OutputStreamWriter osw2 = new OutputStreamWriter(socket2.getOutputStream(),"utf-8");
// osw2.write("GET " + path + " HTTP/1.1\r\n");
// osw2.write("Host: " + host + " \r\n");
// osw2.write("\r\n");
// osw2.flush();
// BufferedReader bufferedReader2 = new BufferedReader(new InputStreamReader(socket2.getInputStream(), "utf-8"));
// String line2 = null;
// while ((line2 = bufferedReader2.readLine()) != null) {
// osw.write(line2+"\r\n");
// }
// bufferedReader2.close();
// osw2.close();
// socket2.close();
osw.write(
"HTTP/1.1 200 OK\r\n"
);
osw.write(
"Server: Apache-Coyote/1.1\r\n"
);
osw.write(
"Set-Cookie: JSESSIONID=03493794995CE31A0F131787B6C6CBB2; Path=/; HttpOnly\r\n"
);
osw.write(
"Content-Type: text/html;charset=UTF-8\r\n"
);
osw.write(
"Transfer-Encoding: chunked\r\n"
);
osw.write(
"Date: Tue, 19 May 2015 02:48:27 GMT\r\n"
);
osw.write(
"\r\n"
);
osw.write(
"c9\r\n"
);
osw.write(
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\r\n"
);
osw.write(
"<HTML>\r\n"
);
osw.write(
" <HEAD><TITLE>A Servlet</TITLE></HEAD>\r\n"
);
osw.write(
" <BODY>\r\n"
);
osw.write(
" This is class com.serv.myServ, using the GET method\r\n"
);
osw.write(
" </BODY>\r\n"
);
osw.write(
"</HTML>\r\n"
);
osw.write(
"\r\n"
);
osw.write(
"0"
);
osw.write(
"\r\n"
);
osw.write(
"\r\n"
);
osw.flush();
bufferedReader.close();
osw.close();
socket.close();
}
catch
(Exception e) {
System.out.println(
"客戶端接受異常"
+e.getMessage());
}
}
}