Java实现Socket5代理服务器
直接贴代码,不解释
1 主服务,用来侦听端口
- package org.javaren.proxy;
- import java.net.ServerSocket;
- import java.net.Socket;
- public class SocketProxy {
- /**
- * @param args
- */
- public static void main(String[] args) throws Exception {
- ServerSocket serverSocket = new ServerSocket(8888);
- while (true) {
- Socket socket = null;
- try {
- socket = serverSocket.accept();
- new SocketThread(socket).start();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- }
2 核心代码,处理链接的代理线程
内部设计了Socket的认证,自己看吧
- package org.javaren.proxy;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.net.Socket;
- public class SocketThread extends Thread {
- private Socket socketIn;
- private InputStream isIn;
- private OutputStream osIn;
- //
- private Socket socketOut;
- private InputStream isOut;
- private OutputStream osOut;
- public SocketThread(Socket socket) {
- this.socketIn = socket;
- }
- private byte[] buffer = new byte[4096];
- private static final byte[] VER = { 0x5, 0x0 };
- private static final byte[] CONNECT_OK = { 0x5, 0x0, 0x0, 0x1, 0, 0, 0, 0, 0, 0 };
- public void run() {
- try {
- System.out.println("\n\na client connect " + socketIn.getInetAddress() + ":" + socketIn.getPort());
- isIn = socketIn.getInputStream();
- osIn = socketIn.getOutputStream();
- int len = isIn.read(buffer);
- System.out.println("< " + bytesToHexString(buffer, 0, len));
- osIn.write(VER);
- osIn.flush();
- System.out.println("> " + bytesToHexString(VER, 0, VER.length));
- len = isIn.read(buffer);
- System.out.println("< " + bytesToHexString(buffer, 0, len));
- // 查找主机和端口
- String host = findHost(buffer, 4, 7);
- int port = findPort(buffer, 8, 9);
- System.out.println("host=" + host + ",port=" + port);
- socketOut = new Socket(host, port);
- isOut = socketOut.getInputStream();
- osOut = socketOut.getOutputStream();
- //
- for (int i = 4; i <= 9; i++) {
- CONNECT_OK[i] = buffer[i];
- }
- osIn.write(CONNECT_OK);
- osIn.flush();
- System.out.println("> " + bytesToHexString(CONNECT_OK, 0, CONNECT_OK.length));
- SocketThreadOutput out = new SocketThreadOutput(isIn, osOut);
- out.start();
- SocketThreadInput in = new SocketThreadInput(isOut, osIn);
- in.start();
- out.join();
- in.join();
- } catch (Exception e) {
- System.out.println("a client leave");
- } finally {
- try {
- if (socketIn != null) {
- socketIn.close();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- System.out.println("socket close");
- }
- public static String findHost(byte[] bArray, int begin, int end) {
- StringBuffer sb = new StringBuffer();
- for (int i = begin; i <= end; i++) {
- sb.append(Integer.toString(0xFF & bArray[i]));
- sb.append(".");
- }
- sb.deleteCharAt(sb.length() - 1);
- return sb.toString();
- }
- public static int findPort(byte[] bArray, int begin, int end) {
- int port = 0;
- for (int i = begin; i <= end; i++) {
- port <<= 16;
- port += bArray[i];
- }
- return port;
- }
- // 4A 7D EB 69
- // 74 125 235 105
- public static final String bytesToHexString(byte[] bArray, int begin, int end) {
- StringBuffer sb = new StringBuffer(bArray.length);
- String sTemp;
- for (int i = begin; i < end; i++) {
- sTemp = Integer.toHexString(0xFF & bArray[i]);
- if (sTemp.length() < 2)
- sb.append(0);
- sb.append(sTemp.toUpperCase());
- sb.append(" ");
- }
- return sb.toString();
- }
- }
3 读取线程,负责外面读数据,写入到请求端
- package org.javaren.proxy;
- /**
- * * 从外部读取,向内部发送信息
- */
- import java.io.InputStream;
- import java.io.OutputStream;
- public class SocketThreadInput extends Thread {
- private InputStream isOut;
- private OutputStream osIn;
- public SocketThreadInput(InputStream isOut, OutputStream osIn) {
- this.isOut = isOut;
- this.osIn = osIn;
- }
- private byte[] buffer = new byte[409600];
- public void run() {
- try {
- int len;
- while ((len = isOut.read(buffer)) != -1) {
- if (len > 0) {
- System.out.println(new String(buffer, 0, len));
- osIn.write(buffer, 0, len);
- osIn.flush();
- }
- }
- } catch (Exception e) {
- System.out.println("SocketThreadInput leave");
- }
- }
- }
4 写入线程,负责读取请求端数据,写入到目标端
- package org.javaren.proxy;
- import java.io.InputStream;
- import java.io.OutputStream;
- /**
- * 从内部读取,向外部发送信息
- *
- * @author zxq
- *
- */
- public class SocketThreadOutput extends Thread {
- private InputStream isIn;
- private OutputStream osOut;
- public SocketThreadOutput(InputStream isIn, OutputStream osOut) {
- this.isIn = isIn;
- this.osOut = osOut;
- }
- private byte[] buffer = new byte[409600];
- public void run() {
- try {
- int len;
- while ((len = isIn.read(buffer)) != -1) {
- if (len > 0) {
- System.out.println(new String(buffer, 0, len));
- osOut.write(buffer, 0, len);
- osOut.flush();
- }
- }
- } catch (Exception e) {
- System.out.println("SocketThreadOutput leave");
- }
- }
- }
原文:http://blog.csdn.net/java2000_net/article/details/7826660
Java实现Socket5代理服务器的更多相关文章
- Java socket - 使用代理服务器
为什么使用代理服务器不需要多说了. 使用Proxy Java提供了Proxy类实现使用代理进行通信. Proxy类的构造器Proxy(Proxy.Type type, SocketAddress sa ...
- Java实现sock5代理服务器
入职练手socks5代理服务器,过程总结一下. 1.下载火狐浏览器,设定代理为socks5代理,地址为127.0.0.1:1080. 2.socks5协议1928,中文版,原版,认真阅读 3.按照协议 ...
- CentOS搭建socket5代理服务器
1.安装socket5依赖包 yum -y install gcc automake make pam-devel openldap-devel cyrus-sasl-devel 2.下载ss5并 ...
- 用Java开发代理服务器
基础知识 不管以哪种方式应用代理服务器,其监控HTTP传输的过程总是如下: 步骤一:内部的浏览器发送请求给代理服务器.请求的第一行包含了目标URL. 步骤二:代理服务器读取该URL,并把请求转发给合适 ...
- JAVA上百实例源码以及开源项目
简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级.中级.高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情.执着,对IT的憧憬. ...
- Java程序通过代理访问网络
问题背景 最近工作上有开发爬虫的任务,对目标网站数据进行抓取,由于大部分网站都在国外,无法直接访问,需要通过代理才能登录.爬虫部署的服务器在香港,所以爬虫部署到服务器后,是可以访问目标网站的,但本地开 ...
- JAVA上百实例源码网站
JAVA源码包1JAVA源码包2JAVA源码包3JAVA源码包4 JAVA开源包1 JAVA开源包2 JAVA开源包3 JAVA开源包4 JAVA开源包5 JAVA开源包6 JAVA开源包7 JAVA ...
- tit.Atitit. http 代理原理 atiHttpProxy 大木马 h
Atitit. http 代理原理 atiHttpProxy 大木马 1. 面这张图可以清晰地阐明HttpProxy的实现原理:1 2. 代理服务器用途1 3. 其中流程具体如下:2 4. 设计规 ...
- Atitit. http 代理原理 atiHttpProxy 大木马
Atitit. http 代理原理 atiHttpProxy 大木马 1. 面这张图可以清晰地阐明HttpProxy的实现原理:1 2. 代理服务器用途1 3. 其中流程具体如下:2 4. 设计规 ...
随机推荐
- 传智播客C++第五期培训视频教程免费下载
C/C++的应用领域几乎无处不在,服务器,嵌入式,物联网,移动互联网,信息安全,游戏,基本上大小通吃.C/C++市场份额高达26%,也就是每四个程序员就有一个C/C++程序员.市场需求量非常大,而且工 ...
- iOS开发系列--音频播放(音效和音乐)播放本地的
音频 在iOS中音频播放从形式上可以分为音效播放和音乐播放.前者主要指的是一些短音频播放,通常作为 点缀音频,对于这类音频不需要进行进度.循环等控制.后者指的是一些较长的音频,通常是主音频,对于这些音 ...
- 学习笔记——Maven settings.xml 配置详解
文件存放位置 全局配置: ${M2_HOME}/conf/settings.xml 用户配置: ${user.home}/.m2/settings.xml note:用户配置优先于全局配置.${use ...
- JS构造函数的用法和JS原型
$(function(){ var rec = new Rectangle(5, 10); //alert(rec.width + "*" + rec.height + " ...
- powerdesigner 绘制表关系和导出sql
1.生成图(A图,B图) 2.创建关系(palette工具栏里有个线条,主表子表关系连接即可,拖动是由顺序的,一对多即从A表往B表连接) 3.这里小说一下 一开始是CDM模式,可以在软件最顶层看到 ...
- jquery.form.js表单插件的使用
jquery.form.js官网:http://malsup.com/jquery/form API文档:http://malsup.com/jquery/form/#api 下载地址:http:// ...
- Mac 下安装tomcat
一. 下载tomcat 首先要到tomcat官网去下载安装包,官网下载地址如下:http://tomcat.apache.org/download-70.cgi , 注意请下载飞windows版本.和 ...
- 第二课:判断js变量的类型以及domReady的原理
1.类型的判断: js五种简单数据类型有:null,undefined,boolean,number,string. 还有复杂的数据类型:Object,Function,RegExp,Date,自定义 ...
- Nginx下用webbench进行压力测试
在运维工作中,压力测试是一项非常重要的工作.比如在一个网站上线之前,能承受多大访问量.在大访问量情况下性能怎样,这些数据指标好坏将会直接影响用户体验. 但是,在压力测试中存在一个共性,那就是压力测试的 ...
- grunt使用watch和livereload的Gruntfile.js的配置
周末在家看angularJS, 用grunt的livereload的自动刷新, 搞了大半天, 现在把配置贴出来, 免得以后忘记了, 只要按照配置一步步弄是没有问题的; 开始的准备的环境安装是: (1) ...