`

JAVA实现socket5代理

    博客分类:
  • JAVA
阅读更多
package test;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Arrays;


public class SocketProxy {
	
	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		ServerSocket serverSocket = new ServerSocket(8080);
		while (true) {
			Socket socket = null;
			try {
				socket = serverSocket.accept();
				new SocketThread(socket).start();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

}

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 };
	private static final byte[] VER = { 5, 0};
	private static final byte[] CONNECT_OK = { 5, 0, 0, 1, 0, 0, 0, 0, 0, 0 };
	
	static{
		System.out.println(Arrays.toString(VER));
		System.out.println(Arrays.toString(CONNECT_OK));
	}

	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();
	}
}


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");
		}
	}
}


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");
		}
	}
}

 /*

代码是摘取别人的,我测试了一下火狐可以用
但是 findHost 方法获取端口有问题,80端口没有问题
如果是:9999,8978 ....等等会有问题
socket发送过来的是 长度为10的byte数组
IP: byte[4-8]字节转字符串用 . 分割就可以了  xx.xx.xx.xx 
端口不知道是怎么转换的例如9999,字节数组byte[9-10] 就是 39,15
端口问题尝试看看一下连接
http://ethen.iteye.com/blog/783338
原文连接:
http://www.open-open.com/lib/view/open1344004339456.html
*/

 

分享到:
评论
1 楼 lcc159591 2017-09-26  
java.net.SocketException: Malformed reply from SOCKS server
at java.net.SocksSocketImpl.readSocksReply(SocksSocketImpl.java:129)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:503)
at java.net.Socket.connect(Socket.java:579)
at java.net.Socket.connect(Socket.java:528)

本地发起请求 报错 怎么解决

相关推荐

    java socket 视频流转发socket

    5. **关闭连接**:完成数据传输后,记得关闭所有打开的Socket和InputStream/OutputStream,以释放系统资源: ```java in.close(); out.close(); clientSocket.close(); forwardSocket.close(); serverSocket....

    java socket 用户真实IP测试

    在Java网络编程中,Socket是实现客户端与服务器端通信的基础组件。当涉及到通过代理服务器或者负载均衡器(如Nginx)进行TCP转发时,获取用户的真实IP地址可能会变得复杂。在标题“java socket nginx tcp转发 用户...

    java socket编写的上网代理

    这样,浏览器的所有HTTP请求都会通过这个本地的Socket代理进行转发。 6. **安全性与性能**: 使用自定义的代理服务器有一定的安全风险,因为它可能成为攻击者的目标。同时,由于Socket通信的开销,可能会影响网络...

    Java代理服务器的实现

    在这个主题中,我们将深入探讨如何在Java中实现一个基本的代理服务器。 首先,`HttpProxy` 和 `SubHttpProxy` 类名暗示了我们可能在处理HTTP协议的代理服务。HTTP代理服务器通常接收来自客户端的HTTP请求,然后转发...

    java实现的代理服务器

    总之,Java实现的代理服务器是通过Java的Socket编程接口实现的,它能帮助我们更好地理解和实践代理服务器的工作原理。通过分析`HttpProxy.java`和`SubHttpProxy.java`的代码,我们可以深入学习网络编程和代理服务器...

    基于Java实现的代理服务器

    Java 实现的代理服务器是一种网络通信工具,它允许客户端通过该服务器作为中介与目标服务器进行交互,从而隐藏了客户端的真实身份或提供了额外的安全性。在本项目中,我们主要关注的是实现了 SOCKS4 和 SOCKS5 协议...

    java实现的代理程序源码

    在Java中,可以使用`java.net.Socket`类实现FTP代理,同时,`org.apache.commons.net.ftp.FTPClient`库提供了一个强大的FTP客户端实现,可以方便地处理各种FTP操作。 **Telnet代理** Telnet是一种远程登录协议,...

    socket通信NIO代理模式demo实例

    在"socket通信NIO代理模式demo实例"中,你可以找到具体的代码实现,包括`Server`端和`Client`端的逻辑,以及如何使用`Selector`进行事件监听。通过对这个示例的学习,你可以深入理解NIO在代理模式中的应用,并能灵活...

    Java使用传统socket手写的远程RPC框架调用框架

    Java使用传统Socket手写的远程RPC(Remote Procedure Call)框架是一种实现分布式系统中不同节点间通信的技术。RPC允许一个程序在不关心远程系统具体实现的情况下,调用另一个远程系统的功能,就像是调用本地方法...

    Java开发的邮件代理服务器

    Java的JSSE(Java Secure Socket Extension)提供了实现这些加密协议的工具。 6. 并发处理:由于邮件服务可能面临大量并发请求,Java的多线程模型和并发库(如ExecutorService和ConcurrentHashMap)能够帮助有效地...

    socketproxy:一个简单的 Java 多线程 Socket 代理服务器。 它侦听传入的连接并将任何通信转发到服务器,同时记录整个对话

    套接字代理一个简单的 Java 多线程 Socket 代理服务器。 它侦听传入的连接并将任何通信转发到服务器,同时记录整个对话。套接字代理服务器这是库的主类。 它可以由第三方实例化,并提供本地端口和服务器的远程主机/...

    代理服务器实现-java(源码)

    在这个Java实现中,我们将探讨如何构建一个简单的代理服务器,并了解涉及的关键概念和技术。 1. **Java基础知识**: - `JFrame` 是Java Swing库中的一个类,用于创建窗口应用程序的基础框架。 - `JTextArea` 是一...

    http代理服务器(socket)

    这是一款http代理服务器,是用java实现的socket编程,实现代理,过滤的功能

    Java编写的HTTP代理

    在Java中实现HTTP代理,开发者会利用Socket编程和HTTP协议的特性来构建这样的系统。 首先,我们需要理解HTTP协议。HTTP(超文本传输协议)是互联网上应用最为广泛的一种网络协议,用于从万维网服务器传输超文本到...

    java网络代理源代码

    4. **Java实现网络代理的关键步骤**: - 创建ServerSocket实例,指定监听的端口号。 - 在ServerSocket上接受来自客户端的连接,返回一个新的Socket实例。 - 读取Socket的InputStream,获取客户端发送的请求。 - ...

    java soap socket 编程资料

    开发者可以使用JAX-WS来实现服务端点和服务客户端代理。 4. 示例:创建一个简单的SOAP服务,包括定义服务接口、实现接口并发布为SOAP服务,然后创建客户端调用服务。 二、Java Socket编程 1. Socket接口:Java的...

    java-websocket-reverse-proxy:Websocket反向代理的Java实现

    Websocket反向代理的Java实现。 与描述的方法类似,但使用Java实现。 这在Java应用程序服务器(例如Spring Boot)中可能很有用。 在根级别有一些nodejs脚本,可用于模仿验证代理服务器所需的功能。 常见的是脚本,...

    java 实现HTTP PROXY

    Java实现HTTP PROXY是一个常见的需求,特别是在开发网络应用或者测试环境中,我们可能需要通过代理服务器转发HTTP请求。本文将深入探讨如何使用Java编程语言来创建一个HTTP代理服务器,并且会涉及相关的源码分析。 ...

    Java写http代理服务器

    在Java中实现HTTP代理服务器,主要涉及到以下几个关键步骤和知识点: 1. **网络编程基础**:熟悉Java的Socket编程是首要的,因为HTTP通信基于TCP/IP协议,我们需要使用Socket来建立客户端和服务器之间的连接。`java...

    基于java的简单socket邮件发送

    在邮件发送系统中,客户端通常扮演的是邮件用户代理(MUA)的角色,负责创建Socket连接到邮件服务器(MDS),并将邮件数据通过这个连接发送出去。服务器端则接收这些连接并处理邮件数据。 1. **创建Socket连接**:...

Global site tag (gtag.js) - Google Analytics