通過socket收發Http請求
阿新 • • 發佈:2019-01-28
話不多說,直接上程式碼
package testSockate;
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協議報文
* Created by zsl on 2017/8/5.
*/
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;
}
}
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());
}
}
}