`
8366
  • 浏览: 813156 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

使用socket实现的请求代理

阅读更多

 

    前段时间把TCP/UDP协议复习了一下,了解了一般网络编程的基本步骤,以前在工作中遇到以下两个问题,就可以使用socket代理的方式实现:

 

1.和化为10000号调接口的时候,我们是java web 系统,他们是vc++ 开发的系统,我们对10000号提供webservice服务,联调的时候就比较麻烦,我们走的是http,向一个wsdl地址发送String,然后接受服务器返回的String,相同的入参字符串,给了10000号系统,他们调用就总报错,因为服务器端截获不到报文,我无法定位错误原因,我们的web 系统使用的是 axis 实现的webservice,在地层已经帮助我们封装好了 soap 协议的报文,而10000号系统使用的是socket,如何获得10000号系统的请求报文的底层呢??就需要我们使用 一下的一个 socket代理

 

                                             c++ ---------------- <- ----------- java

                      10000号系统 ----------------> Scoket代理------------------>目标服务器

 

 

也就是我们使用socket 代理截获底层报文,然后又代理吧报文发给目标服务器,然后socket代理接受目标服务器的报文,返回给10000号系统,这个时候我们就有了 请求和返回的报文,把它以文件的形式存在硬盘上。然后分析报文。

 

2.和ismp联调的时候他们给了wsdl的发布地址,http://133.64.64.13:5011/IsmpCrmEngineService?wsdl,我本地开发就是ping不通,自然也钓不上他们的服务,估计是路由问题,可是我们的服务器 133.64.80.9 可以ping通这个

地址,于是我们也可以使用socket代理,我们在133.64.80.9 部署socket代理 ,我们去请求socket代理,让 代理去请求 目标地址

 

3.socket 代理 还有一个好处就比较牛逼了,我们的系统需要调用tuxedo系统的服务,走的也是socket,比如你现在家,你boss打电话说生产系统 页面上不能查话费了,查话费走的是tuxedo,然你去电信看看,找找原因,你当然不愿意

不愿意飙到电信,可是你如何知道是接口问题还是别的问题呢?? 你在家里的网络环境如何调用电信DCN网络环境的tuxedo服务呢?嘿嘿,我们生产环境 是一个web系统 在公网上有一个ip地址,你可以把 Scoket代理部署到生产环境上,然后你在家里的 公网上调用 socket代理 ,然代理去调用 DCN网内部的服务,把结果从电信的DCN 网络环境中的

请求结果报文返回给公网上的你。(请勿模仿,后果自负

 

 

下面我们就根据以上的构想,开发一个socket代理:(知道tcp/udp协议和编程技巧),不明白的可以看我的

 

tcp编程:http://8366.iteye.com/admin/blogs/419331

udp编程:http://8366.iteye.com/admin/blogs/420395

 

代码:

 

 

1.    写缓存文件

 

import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.log4j.Logger;

/**
 * 写缓存文件
 *  *
 */
public class FileWrite
{
	private static Logger log = Logger.getLogger(FileWrite.class);
	
	/** 文件编号 */
	static int file_no = 0;
	
	/**
	 * 写文件
	 * @param buff 内容
	 * @param len 长度
	 * @param type 文件后缀
	 * @throws Exception
	 */
	public static void writeFile(byte[] buff, int len, String type)
	{
		file_no++;
		
		//文件路径
		StringBuilder fileNo = new StringBuilder(SocketProxy.OUT_PATH);
		//文件名编号3位对齐
		for (int i = 0; i < 3 - ("" + file_no).length(); i++)
		{
			fileNo.append("0");
		}
		//文件编号
		fileNo.append(file_no);
		fileNo.append("_");
		//文件后缀
		fileNo.append(type);
		
		FileOutputStream out = null;
		try
		{
			out = new FileOutputStream(fileNo.toString());
			out.write(buff, 0, len);
		}
		catch (IOException e)
		{
			log.error("写文件异常", e);
		}
		finally
		{
			try
			{
				out.close();
			}
			catch (IOException e)
			{
			}
		}
	}
}

 

 2.请求线程

 

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

import org.apache.log4j.Logger;


public class SubRequest extends Thread
{
	private static Logger log = Logger.getLogger(SubRequest.class);

	/** 外部socket */
	Socket outSideSocket;
	/** 外部输入 */
	InputStream in;
	
	/** 内部socket */
	Socket inSideSocket;
	/** 向服务端输出 */
	OutputStream out;
	
	/** 外部输入缓冲区 */
	byte[] buff = new byte[SocketProxy.OUT_INPUT_BUF_LENGTH];
	
	public SubRequest(Socket outSideSocket, Socket inSideSocket)throws Exception
	{
		this.outSideSocket = outSideSocket;
		this.inSideSocket = inSideSocket;
		
		in = outSideSocket.getInputStream();		
		out = inSideSocket.getOutputStream();
	}
	
	public void run()
	{
		while(true)
		{
			try
			{
				int n = in.read(buff);
				log.info("输入字节数:" + n);
				
				//输入字节长度-1表示连接关闭
				if (n == -1)
				{
					break;
				}
				
				//写文件
				FileWrite.writeFile(buff, n, "request");
				//输出
				out.write(buff, 0, n);
			}
			catch (Exception e)
			{
				log.error("输入异常", e);
				break;
			}
		}
		
		//关闭socket
		if (!outSideSocket.isClosed())
		{
			try
			{
				in.close();
				outSideSocket.close();
				log.info("关闭外部socket");
			}
			catch (IOException ex)
			{						
			}
		}
		if (!inSideSocket.isClosed())
		{
			try
			{
				out.close();
				inSideSocket.close();
				log.info("关闭内部socket");
			}
			catch (IOException ex)
			{						
			}
		}

	}
	

}

 

3.接受线程

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

import org.apache.log4j.Logger;


public class SubResponse extends Thread
{
	private static Logger log = Logger.getLogger(SubResponse.class);
	
	/** 外部socket */
	Socket outSideSocket;
	/** 向客户端输出 */
	OutputStream out;
	
	/** 内部socket */
	Socket inSideSocket;
	/** 服务端输入 */
	InputStream in;
	
	/** 内部发送缓冲区 */
	byte[] buff = new byte[SocketProxy.IN_OUTPUT_BUF_LENGTH];

	
	public SubResponse(Socket outSideSocket, Socket inSideSocket)throws Exception
	{
		this.outSideSocket = outSideSocket;
		out = outSideSocket.getOutputStream();
		
		this.inSideSocket = inSideSocket;
		in = inSideSocket.getInputStream();
	}
	
	public void run()
	{
		while (true)
		{
			try
			{
				int n = in.read(buff);
				log.info("输出字节数:" + n);
				
				//输入字节长度-1表示连接关闭
				if (n == -1)
				{
					break;
				}
				
				//写文件
				FileWrite.writeFile(buff, n, "response");
				//输出
				out.write(buff, 0, n);
			}
			catch (Exception e)
			{
				log.error("输出异常", e);
				break;
			}
		}
		
		//关闭socket
		if (!outSideSocket.isClosed())
		{
			try
			{
				out.close();
				outSideSocket.close();
				log.info("关闭外部socket");
			}
			catch (IOException ex)
			{						
			}
		}
		if (!inSideSocket.isClosed())
		{
			try
			{
				in.close();
				inSideSocket.close();
				log.info("关闭内部socket");
			}
			catch (IOException ex)
			{						
			}
		}
	}
}

 

 

4.主线程

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

import org.apache.log4j.Logger;


public class SocketProxy
{
	private static Logger log = Logger.getLogger(SocketProxy.class);

	/** 代理对外侦听端口 */
	static int port = 9999;

	/** 内部服务端IP  */
	static String ip = "133.64.41.134";
	/** 内部服务端端口  */
	static int in_port =8299;

	/** 客户端输入缓冲区长度 */
	static final int OUT_INPUT_BUF_LENGTH = 2048 * 10;
	/** 服务端输出缓冲区长度 */
	static final int IN_OUTPUT_BUF_LENGTH = 4096 * 10;

	/** 侦听报文输出目录 */
	static final String OUT_PATH = "c:/";

	/** 代理对外侦听Socket */
	ServerSocket serverSocket;

	public static void main(String[] args)
	{
		SocketProxy socketProxy = new SocketProxy();

		log.info("服务侦听:" + port);

		socketProxy.run();
	}

	public SocketProxy()
	{
		try
		{
			//侦听
			serverSocket = new ServerSocket(port);
		}
		catch (IOException e)
		{
			log.error("Server bind port " + port + " ERR.", e);
			System.exit(-1);
		}
	}

	public void run()
	{
		while(true)
		{
			try
			{
				Socket socket = serverSocket.accept();

				log.debug("接收到1个外部连接请求");

				//连接内部服务
				Socket inSideSocket = new Socket(ip, in_port);

				//启动Request子线程
				new SubRequest(socket, inSideSocket).start();
				//启动Response子线程
				new SubResponse(socket, inSideSocket).start();
			}
			catch (Throwable e)
			{
				log.warn("socket异常,退出", e);
				System.exit(-1);
			}
		}
	}
}

 

 

 

 使用方法:

 

在SocketProxy.java 中配置

 /** 代理对外侦听端口,也就是你的socket代理监听那个端口的消息*/
 static int port = 9999;

 /** 内部服务端IP,也就是收到请求以后,转发给哪个目标ip地址  */
 static String ip = "133.64.64.13";
 /** 内部服务端端口 ,目标地址的端口号 */
 static int in_port =5011;

 /*请求和相应报文在硬盘上的存放位置*/

static final String OUT_PATH = "c:/";

运行SocketProxy.java

 

然后我们请求的使用 只需要讲请求的 目标地址换成代理Socket的 ip 地址和它监听的端口号就可以了

 

 

附件描述:

 

附件中是 一个Socket代理,改了个名字 叫HttpAdapter, 写了个shell,可以部署在linux ,unix上,你只要改改配置文件就可以了

分享到:
评论

相关推荐

    c#使用Socket发送HTTP/HTTPS请求的实现代码

    "C#使用Socket发送HTTP/HTTPS请求的实现代码" C#中使用Socket发送HTTP/HTTPS请求是一种高效的方法,特别是在需要自定义HTTP封包或对HTTP请求进行深入控制时。本文主要介绍了如何使用C#的Socket类来发送HTTP/HTTPS...

    socket实现HTTP代理服务器

    ### Socket 实现 HTTP 代理服务器的关键知识点 ...综上所述,通过以上知识点的学习和理解,我们能够更好地掌握如何使用 Socket 实现一个基本的 HTTP 代理服务器,并且在这个过程中还需要深入理解 HTTP 协议的工作机制。

    c# socket设置代理

    本文将深入探讨如何在C#中使用Socket类设置代理,以便进行网络通信。首先,我们需要理解Socket类的基本概念,它是网络编程的基础,允许我们通过TCP或UDP协议与远程服务器进行低级别的交互。 ### Socket类简介 ...

    MTK中使用socket实现http的get请求

    在实现过程中,我们需要构造这样的请求字符串,并通过socket发送到服务器。 在MTK平台中,socket编程主要涉及到`socket()`、`connect()`、`send()`、`recv()`等函数。`socket()`用于创建一个新的socket描述符,`...

    nodejs使用socket5进行代理请求的实现

    主要介绍了nodejs使用socket5进行代理请求的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    vc++编写的基于socket5的代理服务器源代码

    "vc++编写的基于socket5的代理服务器源代码" 指的是一项使用Microsoft Visual C++(vc++)编程语言开发的软件项目,该项目实现了基于Socket5协议的代理服务器功能。Socket5是一种通用的代理协议,允许客户端通过...

    privoxy socket5代理到http代理的转换工具

    Privoxy作为一个代理服务器,可以接收来自客户端的HTTP请求,并将这些请求转发到Socket5代理,反之亦然,从而实现了协议之间的转换。这样,即使客户端只支持HTTP,也能利用Socket5代理的特性。 Privoxy的安装通常很...

    http_test.zip_SOCKET用户_c++socket4代理_代理_代理 socket_代理验证

    `c++socket4代理`指的是使用SOCKET API来实现对HTTP协议的代理支持,其中“4”可能指的是HTTP/1.0版本,尽管现代HTTP已经发展到HTTP/1.1及以上版本。为了通过代理服务器发送HTTP请求,我们需要构造一个带有代理信息...

    基于Socket的web代理服务器的设计与实现毕业论文.docx

    基于Socket的web代理服务器的设计与实现是指使用C#语言和Socket编程技术设计和实现一个web代理服务器,以解决IP资源不足的问题,提高用户的上网体验。本文将详细介绍代理服务器的设计与实现过程,包括客户端-代理...

    基于python与socket的http代理设计与实现

    本主题“基于python与socket的http代理设计与实现”聚焦于如何使用Python的socket库来创建一个HTTP代理服务器。HTTP代理在网络安全、数据抓取和匿名浏览等方面有着广泛的应用。 首先,我们需要理解HTTP协议。HTTP...

    Socket+OpenSSL API 打造HTTP请求类,支持HTTPS

    资源介绍:。Socket+OpenSSL API 打造HTTP请求类,支持HTTPS。源码部分代码(socket、openssl),来自论坛、Q...完成了一些常用的基本操作,使用中若有问题,请回帖留言。资源作者:。heize。资源界面:。资源下载:。

    socket通信NIO代理模式demo实例

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

    http.rar_http请求响应_socket http 请求

    本文将详细解析"HTTP.RAR_HTTP请求响应_SOCKET HTTP请求"这一主题,帮助你理解如何通过Socket编程实现HTTP请求并接收响应。 首先,让我们了解HTTP的基本概念。HTTP是一种应用层协议,用于在Web上交换各种类型的数据...

    java socket编写的上网代理

    总结来说,这个项目是利用Java Socket实现了一个简单的HTTP代理服务器,用户可以通过配置浏览器的代理设置来使用它。尽管它可能不包含复杂的功能,如缓存、身份验证或协议转换,但对于学习网络编程和理解HTTP代理...

    利用RawSocket实现简单的Ping程序 ICMP协议

    以下是使用Raw Socket实现简单Ping程序的关键步骤: 1. **创建Raw Socket**:使用`socket()`函数创建一个RAW类型的套接字,指定协议族为AF_INET(IPv4)和协议类型为 IPPROTO_ICMP。 ```cpp int sock = socket(AF_...

    java 实现HTTP PROXY

    `ServerSocket`用于监听特定端口上的连接请求,而`Socket`则用于建立客户端与代理服务器之间的连接。 2. **HTTP协议解析**:当代理服务器接收到客户端的HTTP请求时,需要解析请求头和请求体。这涉及到对HTTP请求行...

    基于HTTP代理服务器的实现的毕业设计,Socket编程技术,借助第三方库实现HTTP协议的解析和封装,使用多线程技术实现并发

    在实现过程中,我们将采用Java语言和Socket编程技术,借助第三方库实现HTTP协议的解析和封装,同时使用多线程技术实现并发处理。具体实现包括: 1. 建立Socket连接,监听客户端请求。 2. 解析HTTP请求报文,获取...

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

    SocketListener 是使用该库的程序需要实现的接口。 因此,它需要注册为 SocketProxyServer 实例的侦听器。命令行如果你想运行/测试它,你可以运行 Main.class。 启动参数是: 监听的端口号服务器主机将请求重定向到...

    SS5 Linux 下开源的 Socket5 代理软件

    客户端可以通过配置网络设置,使用Socket5代理来通过SS5服务器进行网络访问。这通常涉及在浏览器或其他应用程序中输入服务器的IP地址和端口号,以及之前设置的用户名和密码。 **五、SS5工作原理** SS5作为Socket5...

Global site tag (gtag.js) - Google Analytics