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. 设计规 ...
随机推荐
- pandas 给数据打标签
import numpy as np import pandas as pd df = pd.DataFrame(np.random.randint(0,100,100), columns=['sco ...
- GridView自定义分页
CSS样式 首先把CSS样式代码粘贴过来: .gv { border: 1px solid #D7D7D7; font-size:12px; text-align:center; } .gvHeade ...
- 在matlab和opencv中分别实现稀疏表示
在本文中,稀疏表示的原理不再具体讲解,有需要的同学请自行百度. 本文采用OMP算法来求解稀疏系数.首先随机生成字典数据和待测试数据 字典数据: dic =[ 6, 7, 9, 9, 7, 0, 6, ...
- ListView中多个EditText设置焦点 多次点击异常报错
08-17 18:23:09.825: ERROR/AndroidRuntime(1608): FATAL EXCEPTION: main 08-17 18:23:09.825: ERROR/Andr ...
- 使用logstash+elasticsearch+kibana快速搭建日志平台
日志的分析和监控在系统开发中占非常重要的地位,系统越复杂,日志的分析和监控就越重要,常见的需求有: * 根据关键字查询日志详情 * 监控系统的运行状况 * 统计分析,比如接口的调用次数.执行时间.成功 ...
- 自己写的一个关于Linq to Entity 动态查询的例子
这两天一直想写一个动态查询的方式,先是晚上查询了一下,发现大家写的差不多都是一样的[如:http://www.cnblogs.com/ASPNET2008/archive/2012/10/28/274 ...
- Jmeter使用指南
序言 由于公司在来年需要进行压力测试,所以也就借节假日的机会来学习一下压力测试的步骤,由于本人的学习时间比较短,希望各位大神朋友们能够多多的谅解并指正在下的错误,在此仅表敬意 适应人群 1.初入门的压 ...
- 机器学习中的矩阵方法(附录A): 病态矩阵与条件数
1. 病态系统 现在有线性系统: Ax = b, 解方程 很容易得到解为: x1 = -100, x2 = -200. 如果在样本采集时存在一个微小的误差,比如,将 A 矩阵的系数 400 改变成 4 ...
- javascript继承(七)—用继承的方式实现照片墙功能
照片墙DEMO下载 注意:图片有四种类型:1可放大:2可拖动:3既可放大也可拖动:4都不行.由于每个图片的构造函数不同而不同(目前在火狐上调试的,其它的浏览器可能不行,请见谅,主要讲继承的思想.以后会 ...
- DOM系列---DOM操作样式
发文不易,若转载传播,请亲注明出处,谢谢! 一.操作样式 CSS作为(X)HTML的辅助,可以增强页面的显示效果.但不是每个浏览器都能支持最新的CSS能力.CSS的能力和DOM级别密切相关,所以我们有 ...