一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語(yǔ)言 - JAVA教程 - java實(shí)現(xiàn)輕量型http代理服務(wù)器示例

java實(shí)現(xiàn)輕量型http代理服務(wù)器示例

2019-11-18 14:41Java教程網(wǎng) JAVA教程

這篇文章主要介紹了java實(shí)現(xiàn)輕量型http代理服務(wù)器示例,需要的朋友可以參考下

代碼如下:

package cn.liangjintang.httpproxy;

 

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class HttpProxy {
 static long threadCount = 0;
 int myTcpPort = 8080;
 private ServerSocket myServerSocket;
 private Thread myThread;

 public HttpProxy(int port) throws IOException {
  myTcpPort = port;
  myServerSocket = new ServerSocket(myTcpPort);
  myThread = new Thread(new Runnable() {
   public void run() {
    try {
     while (true)
      new HTTPSession(myServerSocket.accept());
    } catch (IOException ioe) {
    }
   }
  });
  myThread.setDaemon(true);
  myThread.start();
 }

 /**
  * Stops the server.
  */

 public void stop() {
  try {
   myServerSocket.close();
   myThread.join();
  } catch (IOException ioe) {
  } catch (InterruptedException e) {
  }
 }

 public class HTTPSession implements Runnable {
  private Socket mySocket;

  public HTTPSession(Socket s) {
   mySocket = s;
   Thread t = new Thread(this);
   t.setDaemon(true);
   t.start();
  }

  @Override
  public void run() {
   try {
    ++threadCount;

    InputStream is = mySocket.getInputStream();
    if (is == null)
     return;
    final int bufsize = 8192;
    byte[] buf = new byte[bufsize];
    int splitbyte = 0;
    int rlen = 0;
    {
     int read = is.read(buf, 0, bufsize);
     while (read > 0) {
      rlen += read;
      splitbyte = findHeaderEnd(buf, rlen);
      if (splitbyte > 0)
       break;
      read = is.read(buf, rlen, bufsize - rlen);
     }
     ByteArrayInputStream hbis = new ByteArrayInputStream(buf,
       0, rlen);
     BufferedReader hin = new BufferedReader(
       new InputStreamReader(hbis));
     Host host = new Host();
     {
      String string;
      boolean flag = false;
      while ((string = hin.readLine()) != null) {
       if (string.toLowerCase().startsWith("host:")) {
        host.host = string;
        flag = true;
       }
       System.out.println(string);
      }
      if (!flag) {
       mySocket.getOutputStream().write(
         "error!".getBytes());
       mySocket.close();
       return;
      }
     }

     host.cal();
     System.out.println("address:[" + host.address + "]port:"
       + host.port + "\n-------------------\n");

     try {
      pipe(buf, rlen, mySocket, mySocket.getInputStream(),
        mySocket.getOutputStream(), host);
     } catch (Exception e) {
      System.out.println("Run Exception!");
      e.printStackTrace();
     }
    }

   } catch (Exception e) {
   }
   System.out.println("threadcount:" + --threadCount);
  }

  /**
   * finad http header
   **/
  private int findHeaderEnd(final byte[] buf, int rlen) {
   int splitbyte = 0;
   while (splitbyte + 3 < rlen) {
    if (buf[splitbyte] == '\r' && buf[splitbyte + 1] == '\n'
      && buf[splitbyte + 2] == '\r'
      && buf[splitbyte + 3] == '\n')
     return splitbyte + 4;
    splitbyte++;
   }
   return 0;
  }

  void pipe(byte[] request, int requestLen, Socket client,
    InputStream clientIS, OutputStream clientOS, Host host)
    throws Exception {
   byte bytes[] = new byte[1024 * 32];
   Socket socket = new Socket(host.address, host.port);
   socket.setSoTimeout(3000);
   OutputStream os = socket.getOutputStream();
   InputStream is = socket.getInputStream();
   try {
    do {
     os.write(request, 0, requestLen);
     int resultLen = 0;
     try {
      while ((resultLen = is.read(bytes)) != -1
        && !mySocket.isClosed() && !socket.isClosed()) {
       clientOS.write(bytes, 0, resultLen);
      }
     } catch (Exception e) {
      System.out.println("target Socket exception:"
        + e.toString());
     }

     System.out.println("proxy requset-connect broken,socket:"
       + socket.hashCode());
    } while (!mySocket.isClosed()
      && (requestLen = clientIS.read(request)) != -1);
   } catch (Exception e) {
    System.out.println("client Socket exception:" + e.toString());
   }

   System.out.println("end,socket:" + socket.hashCode());
   os.close();
   is.close();
   clientIS.close();
   clientOS.close();
   socket.close();
   mySocket.close();

  }

  // target Host info
  final class Host {
   public String address;
   public int port;
   public String host;

   public boolean cal() {
    if (host == null)
     return false;
    int start = host.indexOf(": ");
    if (start == -1)
     return false;
    int next = host.indexOf(':', start + 2);
    if (next == -1) {
     port = 80;
     address = host.substring(start + 2);
    } else {
     address = host.substring(start + 2, next);
     port = Integer.valueOf(host.substring(next + 1));
    }
    return true;
   }
  }
 }

 public static void main(String[] args) {
  try {
   new HttpProxy(8580);
  } catch (IOException ioe) {
   System.err.println("Couldn't start server:\n" + ioe);
   System.exit(-1);
  }
  System.out.println("start!");
  try {
   System.in.read();
  } catch (Throwable t) {
  }
  System.out.println("stop!");
 }
}

 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 午夜福利电影网站鲁片大全 | 免费xxxxx大片在线观看影视 | 99精品国产高清一区二区三区香蕉 | www.四虎在线 | 四虎国产精品免费入口 | 欧美日韩高清完整版在线观看免费 | 国产精品自拍一区 | 亚洲成色爱我久久 | 亚洲狠狠婷婷综合久久久久网站 | 亚洲图片 自拍偷拍 | 女仆色永久免费网站 | 成人精品在线 | 欧美疯狂做爰xx | 九九免费高清在线观看视频 | 激情视频激情小说 | 欧美日韩一区二区综合在线视频 | xx顶级欧美熟妞xxhd | 加勒比久草 | 亚洲a在线视频 | 亚洲国产精品日本无码网站 | 99视频在线观看视频一区 | 日本成年片高清在线观看 | 日韩精品中文字幕久久 | 国产高清在线精品一区二区三区 | 黑人video粗暴日本 | 春光乍泄在线 | 国产品精人成福利视频 | 国产视频中文字幕 | 爱情岛永久成人免费网站 | 日本老妇乱子伦中文视频 | 国产精品九九热 | 成人看的羞羞视频免费观看 | 成人精品mv视频在线观看 | 九九精品免费视频 | 亚洲精品动漫免费二区 | 九九99香蕉在线视频美国毛片 | 我将她侵犯1~6樱花动漫在线看 | 色猪视频| 国内精品一区二区在线观看 | 香蕉在线精品一区二区 | 91制片厂果冻星空传媒3xg |