`
asdf314159265
  • 浏览: 247267 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

java代理

 
阅读更多

package net.tools.web;

import java.io.*;
import java.net.*;

public class TunnelClient implements Runnable
{

	private static String tunnelurl;

	private static void toBytes(long l, byte[] b, int offset, int len)
	{
		for(int i = 0; i < len; i++)
			b[i + offset] = (byte) (l >> (len * 8 - 8 - i * 8));
	}

	private static long fromBytes(byte[] b, int offset, int len)
	{
		long l = 0;
		for(int i = 0; i < len; i++)
			l |= ((long) (b[i + offset] & 0x00ff)) << (len * 8 - 8 - i * 8);
		return l;
	}

	private static void writeTo(InputStream in, OutputStream out, byte[] buf) throws IOException
	{
		if(buf == null)
			buf = new byte[65536];
		int len;
		while((len = in.read(buf)) > 0)
		{
			out.write(buf, 0, len);
			out.flush();
		}
	}

	private static int readByte(InputStream in) throws IOException
	{
		int b = in.read();
		if(b < 0)
			throw new EOFException();
		return b;
	}

	private static void fill(InputStream in, byte[] buf, int offset, int len) throws IOException
	{
		while(len > 0)
		{
			int n = in.read(buf, offset, len);
			if(n <= 0)
				throw new EOFException();
			offset += n;
			len -= n;
		}
	}

	private static class Tunnelling implements Runnable
	{

		private Socket ssock;

		private InputStream in;

		private OutputStream out;

		private byte[] sessionId;

		private String tunnelurl;

		private Tunnelling(Socket ssock, InputStream in, OutputStream out, byte[] sessionId, String tunnelurl)
		{
			this.ssock = ssock;
			this.in = in;
			this.out = out;
			this.sessionId = sessionId;
			this.tunnelurl = tunnelurl;
		}

		public void run()
		{
			byte[] buf = new byte[65536];
			try
			{
				while(true)
				{
					URLConnection conn = new URL(tunnelurl).openConnection();
					conn.setDoOutput(true);
					OutputStream out = conn.getOutputStream();
					out.write(2);
					out.write(sessionId);
					out.flush();
					InputStream in = conn.getInputStream();
					if(in.read() != 1)
						throw new EOFException();
					writeTo(in, ssock.getOutputStream(), buf);
				}
			}
			catch (IOException e)
			{
				//e.printStackTrace();
			}
			finally
			{
				try
				{
					ssock.close();
				}
				catch (Exception e)
				{}
				try
				{
					in.close();
				}
				catch (Exception e)
				{}
				try
				{
					out.close();
				}
				catch (Exception e)
				{}
				try
				{
					URLConnection conn = new URL(tunnelurl).openConnection();
					OutputStream out = conn.getOutputStream();
					out.write(4);
					out.write(sessionId);
					out.flush();
					conn.getInputStream();
				}
				catch (Exception e)
				{}
			}
		}
		
	}

	private Socket ssock;

	private TunnelClient(Socket ssock)
	{
		this.ssock = ssock;
	}

	public void run()
	{
		InputStream in = null;
		try
		{
			OutputStream sout = ssock.getOutputStream();
			InputStream sin = ssock.getInputStream();
			readByte(sin);
			int len = readByte(sin);
			for(int i = 0; i < len; i++)
				readByte(sin);
			sout.write(5);
			sout.write(0);
			readByte(sin);
			int cmd = readByte(sin);
			readByte(sin);
			int addrtype = readByte(sin);
			String remoteaddress = null;
			byte[] buf = new byte[65536];
			switch(addrtype)
			{
			case 1:
				{
					remoteaddress = "" + readByte(sin);
					for(int i = 1; i < 4; i++)
					{
						remoteaddress += ".";
						remoteaddress += readByte(sin);
					}
				}
				break;
			case 3:
				{
					len = readByte(sin);
					fill(sin, buf, 0, len);
					remoteaddress = new String(buf, 0, len);
				}
				break;
			case 4:
				throw new IOException("No accept address type 4");
			default:
				throw new IOException("No accept address type " + addrtype);
			}
			fill(sin, buf, 0, 2);
			switch(cmd)
			{
			case 1:
				URLConnection conn = new URL(tunnelurl).openConnection();
				conn.setDoOutput(true);
				OutputStream out = conn.getOutputStream();
				out.write(1);
				byte[] addr = remoteaddress.getBytes();
				out.write(addr.length);
				out.write(addr);
				out.write(buf, 0, 2);//port
				out.flush();
				in = conn.getInputStream();
				if(readByte(in) != 1)
					throw new EOFException();
				byte[] sessionId = new byte[8];
				fill(in, sessionId, 0, 8);
				sout.write(5);
				sout.write(0);
				sout.write(0);
				sout.write(1);
				sout.write(0);
				sout.write(0);
				sout.write(0);
				sout.write(0);
				sout.write(0);
				sout.write(0);
				sout.flush();
				new Thread(new Tunnelling(ssock, in, sout, sessionId, tunnelurl)).start();
				while((len = sin.read(buf)) > 0)
				{
					conn = new URL(tunnelurl).openConnection();
					conn.setDoOutput(true);
					out = conn.getOutputStream();
					out.write(3);
					out.write(sessionId);
					out.write(buf, 0, len);
					out.flush();
					if(conn.getInputStream().read() != 1)
						throw new EOFException();
				}
				break;
			case 2:
				throw new IOException("No accept command.");
			case 3:
				throw new IOException("No accept command.");
			default:
				throw new IOException("No accept command.");
			}
		}
		catch (IOException e)
		{
			//e.printStackTrace();
		}
		finally
		{
			try
			{
				ssock.close();
			}
			catch (Exception e)
			{}
			try
			{
				in.close();
			}
			catch (Exception e)
			{}
		}
	}

	public static void main(String[] args) throws Exception
	{
		ServerSocket sssock = new ServerSocket(Integer.parseInt(args[0]));
		tunnelurl = args[1];
		while(true)
		{
			Socket ssock = sssock.accept();
			new Thread(new TunnelClient(ssock)).start();
		}
	}

}


分享到:
评论

相关推荐

    lotus domino java代理_获取传递值json

    Lotus Domino Java 代理获取传递值 JSON Lotus Domino 是一种基于Notes技术的服务器端应用程序, Lotus Domino Java 代理是指在 Domino 服务器上运行的 Java 代理程序,可以用来处理用户请求、提供数据服务等。今天...

    lotus domnio java代理输出html代理

    Lotus Domino是一个企业级的应用开发平台,而Java代理在Lotus Domino中被用来处理服务器端的任务,例如数据处理、业务逻辑或响应HTTP请求。在这个特定的案例中,`JQueryReportToolJavaAgent`是一个Java代理,它被...

    lotus domnio java代理传值

    在Lotus Domino开发环境中,Java代理是用于执行服务器端任务的重要工具,它们可以自动化许多功能,如处理数据、发送邮件等。"lotus domnio java代理传值"这个主题主要涉及如何在Java代码中创建和使用代理,并在代理...

    JAVA代理

    总结一下,`JAVA代理`涉及到的主要知识点包括: 1. **静态代理**:手动创建代理类,通过代理类对目标对象进行方法调用的拦截和增强。 2. **动态代理**:利用Java的`Proxy`类和`InvocationHandler`接口,动态地创建...

    Java代理模式Java动态代理

    ### Java代理模式与Java动态代理详解 #### 一、代理模式概述 代理模式是一种软件设计模式,它在客户端和目标对象之间提供了一种间接层。这种模式的主要目的是控制客户端对目标对象的访问,并且可以在不修改原有...

    java代理实现webservice接口拦截器功能

    本文根据java代理实现CXF拦截器异常时只能进入fault拦截器而不能继续向下执行的问题。 利用java代理让RMI具有拦截器的功能。

    lotus Domino BS开发 通过java 代理导出excel.doc

    本教程将聚焦于如何利用Java代理来实现Excel文档的导出。 Lotus Domino是一款强大的协作软件,它提供了丰富的开发环境,包括服务器端的LotusScript和客户端的JavaScript,但在此场景下,我们使用的是Java代理,因为...

    lotus domnio java代理获取当前用户名

    在 Lotus Domino 中,Java 代理是可以运行在 Domino 服务器上的小程序,它可以执行特定的任务,如获取当前用户名。 在 Java 代理中,获取当前用户名是一个常见的需求。 Lotus Domino 提供了多种方式来获取当前...

    java代理模式

    Java代理模式是一种设计模式,它在面向对象编程中扮演着重要的角色,主要目的是为了在不修改原有对象的基础上,为对象添加额外的功能或者控制对对象的访问。代理模式的核心思想是通过代理类来间接调用目标类的方法,...

    Java代理模式例子

    Java代理模式 事例很生动,非常容易理解,推荐给大家。

    java 代理服务器源码

    java 代理服务源码 测试通过可以,可以自己修改成为自己的代理类。

    Java代理服务器程序

    Java代理服务器程序是一种用于转发网络请求的应用,它在客户端与目标服务器之间起到中介的作用。这样的设计使得用户可以通过代理服务器访问互联网,从而实现多种功能,如匿名浏览、负载均衡、缓存优化、网络监控等。...

    java代理机制 JDK动态代理和cglib代理 详解

    Java代理机制是Java编程中一个重要的特性,它允许我们在不修改原有代码的基础上,为已有类增加额外的功能。本文将深入探讨两种主要的Java代理实现:JDK动态代理和CGLIB代理。 一、JDK动态代理 JDK动态代理基于接口...

    java代理源码

    Java代理源码主要涉及到的是Java编程中的动态代理和网络代理技术。在Spring MVC框架下,开发者经常使用代理模式来扩展或增强对象的功能,同时,这里的"代理.war"文件表明这是一个Web应用程序,通常用于部署在如...

    Java代理学习

    通过深入理解这两种代理方式,开发者可以更好地利用Java代理机制来优化代码结构,实现更复杂的业务需求。在实际项目中,结合AOP框架如Spring AOP,可以进一步简化代理的使用,提高代码的可维护性和复用性。

    java 代理例子 -javaagent,premain方式实现

    Java代理是一种在运行时增强或拦截对象方法调用的技术,它可以让我们在不修改原有代码的情况下,为类添加新的功能或行为。在Java中,代理主要分为两种:静态代理和动态代理。静态代理是通过手动创建代理类来实现的,...

    Java 代理 代理模式 静态代理与动态代理 常见的动态代理实现 .md

    ### Java 代理模式详解 #### 1. 代理模式概览 代理模式是一种设计模式,主要目的是为了控制或提供对某对象的访问。在代理模式中,代理对象充当客户端与真实对象之间的中介,使得客户端可以通过代理对象间接地访问...

    Lotusscript java代理自动下载指定路径文件

    Lotusscript java代理自动下载指定路径文件。可批量下载指定路径

    Java代理模式模板代码,包含动态代理与静态代理

    Java代理模式是一种设计模式,它允许我们为一个对象创建一个代理,这个代理对象可以在不影响原始对象功能的基础上,增强或扩展其行为。代理模式在软件开发中广泛应用,例如用于权限控制、事务管理、日志记录等场景。...

    java 代理模式详解

    总结一下,Java代理模式的核心在于`Proxy`类和`InvocationHandler`接口,它们共同实现了在运行时动态创建符合特定接口的代理对象。通过代理,我们可以在不修改原始对象代码的情况下,添加额外的功能或者控制对原始...

Global site tag (gtag.js) - Google Analytics