2019独角兽企业重金招聘Python工程师标准>>>

说明

使用方法,直接编译后
USing port openSock4 openSock5 user pwd
端口号
是否开通sock4
是否开通sock5
user 不为空时表示 sock5需要使用账号登录 。
示例  java SocksServerOneThread 1080

代码如下


import java.io.ByteArrayOutputStream;
import java.io.Closeable;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.ByteBuffer;
import java.util.Arrays;
import java.util.Date;
import java.util.concurrent.CountDownLatch;/*** 标准的socks代理服务器,支持sock4与sock4代理* * @author Administrator* */
public class SocksServerOneThread implements Runnable {/*** 来源的代理socket*/private final Socket socket;/*** 是否开启socks4代理*/private final boolean openSock4;/*** 是否开启socks5代理*/private final boolean openSock5;/*** socks5代理的登录用户名,如果 不为空表示需要登录验证*/private final String user;/*** socks5代理的登录密码,*/private final String pwd;/*** socks是否需要进行登录验证*/private final boolean socksNeekLogin;/*** @param socket*            来源的代理socket* @param openSock4*            是否开启socks4代理* @param openSock5*            是否开启socks5代理* @param user*            socks5代理的登录用户名,如果 不为空表示需要登录验证* @param pwd*            socks5代理的登录密码,*/protected SocksServerOneThread(Socket socket, boolean openSock4, boolean openSock5, String user, String pwd) {this.socket = socket;this.openSock4 = openSock4;this.openSock5 = openSock5;this.user = user;this.pwd = pwd;this.socksNeekLogin = null != user;}public void run() {// 获取来源的地址用于日志打印使用String addr = socket.getRemoteSocketAddress().toString();log("process one socket : %s", addr);// 声明流InputStream a_in = null, b_in = null;OutputStream a_out = null, b_out = null;Socket proxy_socket = null;ByteArrayOutputStream cache = null;try {a_in = socket.getInputStream();a_out = socket.getOutputStream();// 获取协议头。取代理的类型,只有 4,5。byte[] tmp = new byte[1];int n = a_in.read(tmp);if (n == 1) {byte protocol = tmp[0];if ((openSock4 && 0x04 == protocol)) {// 如果开启代理4,并以socks4协议请求proxy_socket = sock4_check(a_in, a_out);} else if ((openSock5 && 0x05 == protocol)) {// 如果开启代理5,并以socks5协议请求proxy_socket = sock5_check(a_in, a_out);} else {// 非socks 4 ,5 协议的请求log("not socks proxy : %s  openSock4[] openSock5[]", tmp[0], openSock4, openSock5);}if (null != proxy_socket) {CountDownLatch latch = new CountDownLatch(1);b_in = proxy_socket.getInputStream();b_out = proxy_socket.getOutputStream();// 交换流数据if (80 == proxy_socket.getPort()) {cache = new ByteArrayOutputStream();}transfer(latch, a_in, b_out, cache);transfer(latch, b_in, a_out, cache);try {latch.await();} catch (Exception e) {}}} else {log("socks error : %s", Arrays.toString(tmp));}} catch (Exception e) {log("exception : %s %s", e.getClass(), e.getLocalizedMessage());e.printStackTrace();} finally {log("close socket, system cleanning ...  %s ", addr);closeIo(a_in);closeIo(b_in);closeIo(b_out);closeIo(a_out);closeIo(socket);closeIo(proxy_socket);if (null != cache) {cache2Local(cache);}}}private void cache2Local(ByteArrayOutputStream cache) {// OutputStream result = null;// try {// String fileName = System.currentTimeMillis() + "_"// + Thread.currentThread().getId();// result = new FileOutputStream("E:/cache/" + fileName + ".info");// result.write(cache.toByteArray());// } catch (Exception e) {// e.printStackTrace();// } finally {// closeIo(result);// }}/*** sock5代理头处理* * @param in* @param out* @return* @throws IOException*/private Socket sock5_check(InputStream in, OutputStream out) throws IOException {byte[] tmp = new byte[2];in.read(tmp);boolean isLogin = false;byte method = tmp[1];if (0x02 == tmp[0]) {method = 0x00;in.read();}if (socksNeekLogin) {method = 0x02;}tmp = new byte[] { 0x05, method };out.write(tmp);out.flush();// Socket result = null;Object resultTmp = null;if (0x02 == method) {// 处理登录.int b = in.read();String user = null;String pwd = null;if (0x01 == b) {b = in.read();tmp = new byte[b];in.read(tmp);user = new String(tmp);b = in.read();tmp = new byte[b];in.read(tmp);pwd = new String(tmp);if (null != user && user.trim().equals(this.user) && null != pwd && pwd.trim().equals(this.pwd)) {// 权限过滤isLogin = true;tmp = new byte[] { 0x05, 0x00 };// 登录成功out.write(tmp);out.flush();log("%s login success !", user);} else {log("%s login faild !", user);}}}byte cmd = 0;if (!socksNeekLogin || isLogin) {// 验证是否需要登录tmp = new byte[4];in.read(tmp);log("proxy header >>  %s", Arrays.toString(tmp));cmd = tmp[1];String host = getHost(tmp[3], in);tmp = new byte[2];in.read(tmp);int port = ByteBuffer.wrap(tmp).asShortBuffer().get() & 0xFFFF;log("connect %s:%s", host, port);ByteBuffer rsv = ByteBuffer.allocate(10);rsv.put((byte) 0x05);try {if (0x01 == cmd) {resultTmp = new Socket(host, port);rsv.put((byte) 0x00);} else if (0x02 == cmd) {resultTmp = new ServerSocket(port);rsv.put((byte) 0x00);} else {rsv.put((byte) 0x05);resultTmp = null;}} catch (Exception e) {rsv.put((byte) 0x05);resultTmp = null;}rsv.put((byte) 0x00);rsv.put((byte) 0x01);rsv.put(socket.getLocalAddress().getAddress());Short localPort = (short) ((socket.getLocalPort()) & 0xFFFF);rsv.putShort(localPort);tmp = rsv.array();} else {tmp = new byte[] { 0x05, 0x01 };// 登录失败log("socks server need login,but no login info .");}out.write(tmp);out.flush();if (null != resultTmp && 0x02 == cmd) {ServerSocket ss = (ServerSocket) resultTmp;try {resultTmp = ss.accept();} catch (Exception e) {} finally {closeIo(ss);}}return (Socket) resultTmp;}/*** sock4代理的头处理* * @param in* @param out* @return* @throws IOException*/private Socket sock4_check(InputStream in, OutputStream out) throws IOException {Socket proxy_socket = null;byte[] tmp = new byte[3];in.read(tmp);// 请求协议|VN1|CD1|DSTPORT2|DSTIP4|NULL1|int port = ByteBuffer.wrap(tmp, 1, 2).asShortBuffer().get() & 0xFFFF;String host = getHost((byte) 0x01, in);in.read();byte[] rsv = new byte[8];// 返回一个8位的响应协议// |VN1|CD1|DSTPORT2|DSTIP 4|try {proxy_socket = new Socket(host, port);log("connect [%s] %s:%s", tmp[1], host, port);rsv[1] = 90;// 代理成功} catch (Exception e) {log("connect exception  %s:%s", host, port);rsv[1] = 91;// 代理失败.}out.write(rsv);out.flush();return proxy_socket;}/*** 获取目标的服务器地址* * @createTime 2014年12月14日 下午8:32:15* @param type* @param in* @return* @throws IOException*/private String getHost(byte type, InputStream in) throws IOException {String host = null;byte[] tmp = null;switch (type) {case 0x01:// IPV4协议tmp = new byte[4];in.read(tmp);host = InetAddress.getByAddress(tmp).getHostAddress();break;case 0x03:// 使用域名int l = in.read();tmp = new byte[l];in.read(tmp);host = new String(tmp);break;case 0x04:// 使用IPV6tmp = new byte[16];in.read(tmp);host = InetAddress.getByAddress(tmp).getHostAddress();break;default:break;}return host;}/*** IO操作中共同的关闭方法* * @createTime 2014年12月14日 下午7:50:56* @param socket*/protected static final void closeIo(Socket closeable) {if (null != closeable) {try {closeable.close();} catch (IOException e) {}}}/*** IO操作中共同的关闭方法* * @createTime 2014年12月14日 下午7:50:56* @param socket*/protected static final void closeIo(Closeable closeable) {if (null != closeable) {try {closeable.close();} catch (IOException e) {}}}/*** 数据交换.主要用于tcp协议的交换* * @createTime 2014年12月13日 下午11:06:47* @param lock*            锁* @param in*            输入流* @param out*            输出流*/protected static final void transfer(final CountDownLatch latch, final InputStream in, final OutputStream out,final OutputStream cache) {new Thread() {public void run() {byte[] bytes = new byte[1024];int n = 0;try {while ((n = in.read(bytes)) > 0) {out.write(bytes, 0, n);out.flush();if (null != cache) {synchronized (cache) {cache.write(bytes, 0, n);}}}} catch (Exception e) {}if (null != latch) {latch.countDown();}};}.start();}private final static void log(String message, Object... args) {Date dat = new Date();String msg = String.format("%1$tF %1$tT %2$-5s %3$s%n", dat, Thread.currentThread().getId(),String.format(message, args));System.out.print(msg);}public static void startServer(int port, boolean openSock4, boolean openSock5, String user, String pwd)throws IOException {log("config >> port[%s] openSock4[%s] openSock5[%s] user[%s] pwd[%s]", port, openSock4, openSock5, user, pwd);ServerSocket ss = new ServerSocket(port);Socket socket = null;log("Socks server port : %s listenning...", port);while (null != (socket = ss.accept())) {new Thread(new SocksServerOneThread(socket, openSock4, openSock5, user, pwd)).start();}ss.close();}public static void main(String[] args) throws IOException {java.security.Security.setProperty("networkaddress.cache.ttl", "86400");log("\n\tUSing port openSock4 openSock5 user pwd");int port = 1080;boolean openSock4 = true;boolean openSock5 = true;String user = null, pwd = null;// user = "user";pwd = "123456";int i = 0;if (args.length > i && null != args[i++]) {port = Integer.valueOf(args[i].trim());}if (args.length > i && null != args[i++]) {openSock4 = Boolean.valueOf(args[i].trim());}if (args.length > i && null != args[i++]) {openSock5 = Boolean.valueOf(args[i].trim());}if (args.length > i && null != args[i++]) {user = args[i].trim();}if (args.length > i && null != args[i++]) {pwd = args[i].trim();}SocksServerOneThread.startServer(port, openSock4, openSock5, user, pwd);}
}

转载于:https://my.oschina.net/u/727875/blog/1826079

java 实现socks代理,包含sock4 sock5代理相关推荐

  1. java Spring的AOP理解和动态代理

    Spring的AOP OOP面向对象,允许开发者定义纵向的关系,但并不适用于定义横向的关系,会导致大量代码的重复,而不利于各个模块的重用. AOP,一般称为面向切面,作为面向对象的一种补充,用于将那些 ...

  2. java类加载机制、反射、动态代理详解

    类的加载.连接和初始化(系统可能在第一次使用某个类时加载该类, 也可能采用预加载机制来加载某个类)动态代理实现 1.JVM和类 当调用 java 命令运行某个 Java 程序时, 该命令将会启动一个 ...

  3. Java设计模式:(一)动态代理分析 (含静态代理)

    代理模式:为其他对象提供一种代理以控制某个对象的访问.用在:在某些情况下,一个客户不想或者不能直接访问另一个对象,而代理对象可以在客户端和目标对象之前起到中介的作用,代理对象还可以完成它附加的操作. ...

  4. 内网穿透渗透小白初级基础(二)之sock5 代理

    了解sock5 代理应该是很多人踏入内网穿透的第一步,这对以后的内网穿透之路有很大的影响,也是很多人入门的必经之路,这次我们就来讲讲sock5 代理是什么,是怎么操作的,再内网穿透中有什么作用. 首先 ...

  5. Android开发如何理解Java静态代理 动态代理及动态生成代理对象原理 看这篇就够了

    动态代理与静态代理 前言 代理模式 静态代理 动态代理 JDK代理 动态生成代理对象原理 生成class数据源码 动态代理类真身 总结 前言 近期在研究Hook技术,需要用到动态代理,说到动态代理就会 ...

  6. 设计模式之代理模式(静态代理、Java动态代理、Cglib动态代理)

    代理模式的定义:由于某些原因需要给某对象提供一个代理以控制对该对象的访问.这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介. 提醒:动态代理中涉及到以前的一些知识 ...

  7. 深圳Java培训:Spring框架之动态代理

    深圳Java培训:Spring框架之动态代理 前言 动态代理是一种常用的设计模式,广泛应用于框架中,Spring框架的AOP特性就是应用动态代理实现的,想要理解AOP的实现原理我们就必须先理解动态代理 ...

  8. sock5代理工作原理

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! sock ...

  9. centos6部署sock5代理软件dante

    一.socks简介 socks是一种网络传输协议,主要用于客户端与外网服务器之间通讯的中间传递.根据OSI七层模型来划分,SOCKS属于会话层协议,位于表示层与传输层之间.当防火墙后的客户端要访问外部 ...

最新文章

  1. 【 58沈剑 架构师之路】各种SQL到底加了什么锁?
  2. 如何从值获取C#枚举描述? [重复]
  3. 无招胜有招之Java进阶JVM(七)对象模型
  4. GARFIELD@04-30-2005
  5. Linux基本管理七大流程
  6. 产品经理是怎么产生的?
  7. .NET Core 3.0带来桌面支持(Windows Only)
  8. library的英语怎么读音_英语元音与辅音
  9. 7月25日训练赛签到题HDU1257
  10. android dp sp px_你真的了解android的屏幕适配吗?
  11. cad常青藤插件_做CAD设计,别说你不知道,这些插件有多好用
  12. 电气工程cad实用教程电子版_电气工程cad实用教程
  13. android 获取微信二维码 DiffDevOAuth.auth
  14. 未来10年,最值得投资的40个城市
  15. VS2010出现“automation服务器不能创建对象“
  16. 快速失败(ail-fast)和安全失败(fail-safe)机制
  17. 笔记本电脑计计算机硬盘分区,笔记本电脑如何分区,小编教你笔记本电脑如何分区...
  18. rt linux 测试,Ubuntu下测试RT-Linux的性能
  19. 单片机原理与应用技术(三)———动态数码管显示汇编语言
  20. 使用 WordPress 主题制作的20个精美网页

热门文章

  1. Linux wget命令
  2. Python数据格式化
  3. C++ 随心记5 C++17 较好用的新特性 (一)令代码简洁的特性
  4. 图(二)——图的遍历
  5. 永久免费H5直播点播播放器SkeyeWebPlayer.js实现webrtc流播放
  6. Java以及IDEA下查看字节码的五种方法
  7. 公交云推出公交数据大脑,智能公共出行时代风起云涌
  8. echarts 饼图提示框显示百分比
  9. SpringCloud 注册中心:Nacos 简介、安装和配置
  10. UVA LA3708 Graveyard