Simple Proxy Server (Java)

由于对java的network programmiing不太了解,因此就试着写个simple proxy server练练手。java

虽然问题不少,并且处理简直就能够说是“没有处理”。可是,仍是能够经过这个代理浏览网页,而且统计有多少流量流出和流入。代码以下。(这篇帖子就是同个这个proxy发的)。浏览器

 

1. 将serverSocket.close()改为if (serverSocket!=null) serverSocket.close();后,异常打印少了不少。没有null pointer exception了。socket

 2. 将第一次从浏览器读取的request的count进行判断,若是<=0,就直接关掉socket;若是大于0,才进行其余处理。浏览网页速度变快了。不知道为何。this

package network.proxy;

import java.io.*;
import java.net.*;
import java.util.*;

// internet server <--serverSocket--> proxy <--clientSocket--> client                                                                                                   

public class MyProxy {
    public static void main(String[] args) {
        try {
            new Thread(new SimpleProxyServer(8989)).start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

class SimpleProxyServer implements Runnable {
    private ServerSocket listenSocket;
    public SimpleProxyServer(int port) throws IOException {
        this.listenSocket = new ServerSocket(port);
    }

    public void run() {
        for (;;) {
            try {
                Socket clientSocket = listenSocket.accept();
                System.out.println("Create a new Thread to handle this connection");
                new Thread(new ConnectionHandler(clientSocket)).start();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}


class ProxyCounter {
    static int sendLen = 0;
    static int recvLen = 0;

    public static void showStatistics() {
        System.out.println("sendLen = " + sendLen);
        System.out.println("recvLen = " + recvLen);
    }
}

// must close sockets after a transaction                                                                                                                               
class ConnectionHandler extends ProxyCounter implements Runnable {
    private Socket clientSocket;
    private Socket serverSocket;

    private static final int bufferlen = 8192;

    public ConnectionHandler(Socket clientSocket) {
        this.clientSocket = clientSocket;
    }
    public void run() {
        // receive request from clientSocket,                                                                                                                           
        //extract hostname,                                                                                                                                             
        //create a serverSocket to communicate with the host                                                                                                            
        // count the bytes sent and received                                                                                                                            
        try {
            byte[] buffer = new byte[bufferlen];
            int count = 0;

            InputStream inFromClient = clientSocket.getInputStream();
            count = inFromClient.read(buffer);
            String request = new String(buffer, 0, count);
            String host = extractHost(request);
            // create serverSocket                                                                                                                                      
            Socket serverSocket = new Socket(host, 80);
            // forward request to internet host                                                                                                                         
            OutputStream outToHost = serverSocket.getOutputStream();
            outToHost.write(buffer, 0, count);
            outToHost.flush();
            sendLen += count;
            showStatistics();
            // forward response from internet host to client                                                                                                            
            InputStream inFromHost = serverSocket.getInputStream();
            OutputStream outToClient = clientSocket.getOutputStream();
            while (true) {
                count = inFromHost.read(buffer);
                if (count < 0)
                    break;
                outToClient.write(buffer, 0, count);
                outToClient.flush();
                recvLen += count;
                showStatistics();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                clientSocket.close();
                serverSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private String extractHost(String request) {
        int start = request.indexOf("Host: ") + 6;
        int end = request.indexOf('\n', start);
        String host = request.substring(start, end - 1);
        return host;
    }
}
相关文章
相关标签/搜索