Simple Proxy Server (Java)

因为对java的network programmiing不太了解,所以就试着写个simple proxy server练练手。

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

 

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

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

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;
    }
}

转载于:https://my.oschina.net/u/158589/blog/64643

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值