- 浏览: 813156 次
- 性别:
- 来自: 西安
文章分类
- 全部博客 (307)
- struts (8)
- hibernate (3)
- spring (32)
- opensourceproject (12)
- javaScript (9)
- primeton EOS (2)
- journey of heart (10)
- Design pattern (6)
- ejb (17)
- point (37)
- Linux&Unix (22)
- ibatis (10)
- AJAX (6)
- DB (26)
- Protocol (6)
- chart (4)
- web server (11)
- webservice (7)
- integration (3)
- tuxedo (5)
- ext (4)
- android (1)
- c/c++ (12)
- JVM (1)
- paginationFrame (2)
- code (2)
- report (1)
- High-performance web (1)
- svn (1)
- JQuery (1)
- workDaily (2)
- cloud (16)
- Python (8)
- English (2)
- shell (5)
- googleCode (1)
- nio (1)
- hyper-v (1)
- debug (3)
- vbs (2)
- openstack (3)
- K8S (1)
- Mesos (0)
- Spark (0)
- Marathon (0)
最新评论
-
钱图大展:
chao2751021 写道lib包哪里去下载,找不到
大型网站用户行为记录的一个实现--基于clickStream(第一部分) -
钱图大展:
无法下载
大型网站用户行为记录的一个实现--基于clickStream(第一部分) -
fm395728572:
shell脚本中用到了环境变量,但是获取不到,例如脚本中有一句 ...
ganymed-ssh2 for Java -
liuhanjiang:
我qq147229234
大型网站用户行为记录的一个实现--基于clickStream(第一部分) -
liuhanjiang:
博主 我利用您提供的方法实现博文中介绍的clickstream ...
大型网站用户行为记录的一个实现--基于clickStream(第一部分)
前段时间把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上,你只要改改配置文件就可以了
- HttpAdapter.rar (313.3 KB)
- 下载次数: 95
发表评论
-
eclipse link 方式管理插件
2012-02-24 15:55 1555以配置tomcat插件为例: (条件:F:\eclip ... -
使用mapinfo 开发GIS 应用
2011-03-18 06:56 12981. mapJ 对象是在tomcat启动的时候 从web ... -
java mail adapter
2011-01-21 12:23 15332011.04.27: 使用jmail 发送中文标题的 ... -
4种调用https服务的方式
2011-01-05 23:45 8791以前在网厅的时候,请求计费的账单开 ... -
正则表达式30分钟入门教程
2010-11-17 12:58 1477正则表达式30分钟入门教程 -
java 异常层次
2010-05-26 16:14 1339Java 中的异常类,包括内置的异常类以及自定义的异常类,都直 ... -
java 解惑你知多少 (转载)
2010-04-26 12:43 1203(1) http://jiangzhengjun.it ... -
jvm调优
2010-04-16 15:35 1286(1) http://pengjiaheng.itey ... -
谈谈重构
2010-04-15 13:34 1318代码重构阅读心得[转] http://www.cnblogs ... -
session会话跟踪的一个小例子
2010-03-14 18:16 1870内容包括: 必备知识: ... -
cookie机制和session机制的区别
2010-03-14 17:06 1201一、cookie机制和sessio ... -
Cookie详解
2010-03-14 16:02 1400Cookie在英文中是小甜品 ... -
什么是Cookie?
2010-03-14 15:06 1453按照Netscape官方文档中 ... -
任务、进程和线程的区别(转)
2010-02-04 17:16 2284任务(task)是最抽象 ... -
加密,解密,认证,数字签名,公钥私钥
2010-01-13 20:42 2334Bob,Alice和数字证书 网络安全中最知名的 ... -
JNI
2009-12-26 14:09 1586JNI是Java Native Inter ... -
JSON在处理hibernate中的cascade对象时的解决方案
2009-12-24 22:12 1526如果数据间存在级联关系,在hibernate中极容易嵌套而 ... -
digester框架 将 XML->JavaBean
2009-11-08 17:38 1755digester组件简化了xml文 ... -
什么是P问题、NP问题和NPC问题
2009-10-25 20:20 2055什么是P问题、NP问题和NPC问题 出自mat ... -
用Fat Jar Eclipse Plug-In打包可执行jar文件
2009-09-30 08:29 3963Fat Jar Eclipse Plug-In [FJEP] ...
相关推荐
"C#使用Socket发送HTTP/HTTPS请求的实现代码" C#中使用Socket发送HTTP/HTTPS请求是一种高效的方法,特别是在需要自定义HTTP封包或对HTTP请求进行深入控制时。本文主要介绍了如何使用C#的Socket类来发送HTTP/HTTPS...
### Socket 实现 HTTP 代理服务器的关键知识点 ...综上所述,通过以上知识点的学习和理解,我们能够更好地掌握如何使用 Socket 实现一个基本的 HTTP 代理服务器,并且在这个过程中还需要深入理解 HTTP 协议的工作机制。
本文将深入探讨如何在C#中使用Socket类设置代理,以便进行网络通信。首先,我们需要理解Socket类的基本概念,它是网络编程的基础,允许我们通过TCP或UDP协议与远程服务器进行低级别的交互。 ### Socket类简介 ...
在实现过程中,我们需要构造这样的请求字符串,并通过socket发送到服务器。 在MTK平台中,socket编程主要涉及到`socket()`、`connect()`、`send()`、`recv()`等函数。`socket()`用于创建一个新的socket描述符,`...
主要介绍了nodejs使用socket5进行代理请求的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
"vc++编写的基于socket5的代理服务器源代码" 指的是一项使用Microsoft Visual C++(vc++)编程语言开发的软件项目,该项目实现了基于Socket5协议的代理服务器功能。Socket5是一种通用的代理协议,允许客户端通过...
Privoxy作为一个代理服务器,可以接收来自客户端的HTTP请求,并将这些请求转发到Socket5代理,反之亦然,从而实现了协议之间的转换。这样,即使客户端只支持HTTP,也能利用Socket5代理的特性。 Privoxy的安装通常很...
`c++socket4代理`指的是使用SOCKET API来实现对HTTP协议的代理支持,其中“4”可能指的是HTTP/1.0版本,尽管现代HTTP已经发展到HTTP/1.1及以上版本。为了通过代理服务器发送HTTP请求,我们需要构造一个带有代理信息...
基于Socket的web代理服务器的设计与实现是指使用C#语言和Socket编程技术设计和实现一个web代理服务器,以解决IP资源不足的问题,提高用户的上网体验。本文将详细介绍代理服务器的设计与实现过程,包括客户端-代理...
本主题“基于python与socket的http代理设计与实现”聚焦于如何使用Python的socket库来创建一个HTTP代理服务器。HTTP代理在网络安全、数据抓取和匿名浏览等方面有着广泛的应用。 首先,我们需要理解HTTP协议。HTTP...
资源介绍:。Socket+OpenSSL API 打造HTTP请求类,支持HTTPS。源码部分代码(socket、openssl),来自论坛、Q...完成了一些常用的基本操作,使用中若有问题,请回帖留言。资源作者:。heize。资源界面:。资源下载:。
在"socket通信NIO代理模式demo实例"中,你可以找到具体的代码实现,包括`Server`端和`Client`端的逻辑,以及如何使用`Selector`进行事件监听。通过对这个示例的学习,你可以深入理解NIO在代理模式中的应用,并能灵活...
本文将详细解析"HTTP.RAR_HTTP请求响应_SOCKET HTTP请求"这一主题,帮助你理解如何通过Socket编程实现HTTP请求并接收响应。 首先,让我们了解HTTP的基本概念。HTTP是一种应用层协议,用于在Web上交换各种类型的数据...
总结来说,这个项目是利用Java Socket实现了一个简单的HTTP代理服务器,用户可以通过配置浏览器的代理设置来使用它。尽管它可能不包含复杂的功能,如缓存、身份验证或协议转换,但对于学习网络编程和理解HTTP代理...
以下是使用Raw Socket实现简单Ping程序的关键步骤: 1. **创建Raw Socket**:使用`socket()`函数创建一个RAW类型的套接字,指定协议族为AF_INET(IPv4)和协议类型为 IPPROTO_ICMP。 ```cpp int sock = socket(AF_...
`ServerSocket`用于监听特定端口上的连接请求,而`Socket`则用于建立客户端与代理服务器之间的连接。 2. **HTTP协议解析**:当代理服务器接收到客户端的HTTP请求时,需要解析请求头和请求体。这涉及到对HTTP请求行...
在实现过程中,我们将采用Java语言和Socket编程技术,借助第三方库实现HTTP协议的解析和封装,同时使用多线程技术实现并发处理。具体实现包括: 1. 建立Socket连接,监听客户端请求。 2. 解析HTTP请求报文,获取...
SocketListener 是使用该库的程序需要实现的接口。 因此,它需要注册为 SocketProxyServer 实例的侦听器。命令行如果你想运行/测试它,你可以运行 Main.class。 启动参数是: 监听的端口号服务器主机将请求重定向到...
客户端可以通过配置网络设置,使用Socket5代理来通过SS5服务器进行网络访问。这通常涉及在浏览器或其他应用程序中输入服务器的IP地址和端口号,以及之前设置的用户名和密码。 **五、SS5工作原理** SS5作为Socket5...