package Server;
import java.io.IOException;
import java.net.Socket;
import java.net.ServerSocket;
import java.io.OutputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.SocketTimeoutException;
import java.net.ConnectException;
import java.net.UnknownHostException;
import java.net.*;
/**
* <p>Title: </p>
*
* <p>Description: </p>
*
* <p>Copyright: Copyright (c) 2008</p>
*
* <p>Company: </p>
*
* @author not attributable
* @version 1.0
*/
public class HttpProxy extends Thread {
Socket socket = null;
public HttpProxy(Socket c) {
this.socket = c;
this.start();
}
public void run() {
byte bytes[] = new byte[1024];
try {
socket.setSoTimeout(20);
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
int ch = in.read();
String line = "";
while (ch != -1) {
line += (char) ch;
if (ch == 13) {
break;
}
ch = in.read();
}
String u = line.split(" ")[1];
URL url = new URL(u);
int port = url.getPort();
if (port == -1) {
port = url.getDefaultPort();
}
Socket request = null;
try {
request = new Socket(url.getHost(), port);
}catch(ConnectException ex){
socket.close();
ex.printStackTrace();
}
catch(UnknownHostException ex){
socket.close();
ex.printStackTrace();
} catch (IOException ex) {
socket.close();
ex.printStackTrace();
}
if (!socket.isClosed()) {
request.setSoTimeout(1000);
OutputStream requestOut = request.getOutputStream();
requestOut.write(line.getBytes());
try{
while ((ch = in.read(bytes)) > 0) {
requestOut.write(bytes, 0, ch);
requestOut.flush();
}
} catch (SocketTimeoutException ex) {
}
InputStream requestIn = request.getInputStream();
try {
while ((ch = requestIn.read(bytes)) > 0) {
out.write(bytes, 0, ch);
}
} catch (SocketTimeoutException ex) {
request.close();
}
out.close();
in.close();
socket.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
ServerSocket ssock;
Socket c;
try {
ssock = new ServerSocket(9000);
while (true) {
c = ssock.accept();
new HttpProxy(c);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
还有很多问题存在,但基本的已经实现