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. 设计规 ...
随机推荐
- matlab批量合并txt文件
1: %% merge.m 2: %%%%Main程序%%%%%% 3: %%%%%% 4: %%%%%%本程序合并完各个子文件夹中的txt到主文件目录下,并且合并的文件以子文件夹名字命名 5: %% ...
- Ubuntu Navicat正版永久使用方法
最近技安不再带自己的mac book来公司工作了,公司多出来一个台式机,配置还挺高.于是乎就拿过来用了. 装上了Ubuntu14.04 LTS版,正常的开发工具如vagrant,vitualbox,s ...
- windows命令行
[drive:] Change the current driver, without changing its current directory cd [drive:] [path] Just c ...
- 直接修改托管堆栈中的type object pointer(类型对象指针)
都知道.NET是一个强对象类型的框架. 那么对于对象类型又是怎么确定的呢. 最初的我简单认为数据的类型就是定义时字段的类型修饰决定的(回来发现这种观点是绝对错误的) 我们知道引用对象存储在托管堆栈中, ...
- Android技能杂谈——如何优雅的处理控件的点击事件
首先分享一个最佳实践: 大家开发复杂一些的Android应用的时候常常会写一个BaseActivity或者BaseFragment,里面写上一些基本而公用的方法,比如监听网络状况.弹出对话框.设置ac ...
- unity3d 扩展NGUI —— 限制UI点击响应间隔
当某个按钮按下后给服务器发送某条消息 如果玩家短时间内疯狂点击按钮很多次,这将会给服务器发送很多条无用数据 不但增加了服务器的压力,发送数据还浪费流量,甚至可能引发一些莫名其妙的bug 所以,限制UI ...
- 细说 Web API参数绑定和模型绑定
今天跟大家分享下在Asp.NET Web API中Controller是如何解析从客户端传递过来的数据,然后赋值给Controller的参数的,也就是参数绑定和模型绑定. Web API参数绑定就是简 ...
- RockWare RockWorks的Ollydbg调试过程及注册机(破解)思路
最近拿到了RockWorks15的安装包,可惜没有破解,试用也只能用14天.用PEiD工具察看了一下,Delphi编写的程序,竟然没加壳.本想用OllyDBG调试进去爆破一下,不意发现注册码很简单,如 ...
- 【BZOJ1008】【HNOI2008】越狱(数学排列组合题)
1008: [HNOI2008]越狱 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3140 Solved: 1317[Submit][Status] ...
- 线段树好题(2004集训队林涛PPT中的3题)
1.snake:主要是要意识到全局的可能连法只有一种= =(略坑,题目的最小长度是唬人的……),所以关键就是能否构造出符合题意的图,可以考虑搜索解决,搜出一个就OK了,但是会发现那些满足条件中线段在非 ...