文档章节

使用JAVA实现TCP数据转发

BLUE-魏晓峰
 BLUE-魏晓峰
发布于 2013/05/27 16:12
字数 756
阅读 2839
收藏 4
点赞 1
评论 3

你是否有过这样的使用场景,比如有一个数据库或主机,因为安全、网络的关系,在你的电脑上无法直接访问。但是此时你有一个中间的机子,中间机子可以访问上述的数据库或主机,同时你的电脑可以访问该中间机子。

开动歪脑筋,能否在中间的机子上装一个什么软件,可以在你的电脑上直接访问你之前所不能访问的数据库或主机?

答案是肯定的,在中间机子上装一个TCP数据转发软件就可以了。这种现成的软件很多,linux自带的iptable也可以实现该功能。不过因为原理简单、还是自己动手、丰衣足食吧,上代码:

package com.ai.police.portmap;

import java.net.ServerSocket;
import java.net.Socket;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;


public class TranslatePort {
 private transient static Log log = LogFactory.getLog(TranslatePort.class);
 
 public static void main(String[] args) {
  try {
   if(args == null || args.length<3){
    log.error("输出参数不能为空,分别是 本地监听端口、远程IP、远程端口");
    return;
   }
   
   
   
   //获取本地监听端口、远程IP和远程端口
   int localPort = Integer.parseInt(args[0].trim());
   String remoteIp = args[1].trim();
   int remotePort = Integer.parseInt(args[2].trim());
   
   //启动本地监听端口
   ServerSocket serverSocket = new ServerSocket(localPort);
   log.error("localPort="+localPort + ";remoteIp=" + remoteIp +
     ";remotePort="+remotePort+";启动本地监听端口" + localPort + "成功!");
   
   while(true){
    Socket clientSocket = null;
    Socket remoteServerSocket = null;
    try {
     //获取客户端连接
     clientSocket = serverSocket.accept();

     log.error("accept one client");
     //建立远程连接
     remoteServerSocket = new Socket(remoteIp ,remotePort);

     log.error("create remoteip and port success");
     //启动数据转换接口
     (new TransPortData(clientSocket ,remoteServerSocket ,"1")).start();
     (new TransPortData(remoteServerSocket ,clientSocket,"2")).start();
    } catch (Exception ex) {
     log.error("",ex);
    }
    //建立连接远程
   }
  } catch (Exception e) {
   log.error("",e);
  }
 }
}

 

 

package com.ai.police.portmap;

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

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * 用于转发数据
 * @author Administrator
 *
 */
public class TransPortData extends Thread {

 private transient static Log log = LogFactory.getLog(TranslatePort.class);
 
 Socket getDataSocket;
 Socket putDataSocket;
 
 String type;
 
 public TransPortData(Socket getDataSocket , Socket putDataSocket ,String type){
  this.getDataSocket = getDataSocket;
  this.putDataSocket = putDataSocket;
  this.type = type;
 }
 
 public void run(){
  try {
   while(true){

    InputStream in = getDataSocket.getInputStream() ;
    OutputStream out = putDataSocket.getOutputStream() ;
    //读入数据
    byte[] data = new byte[1024];
    int readlen = in.read(data);
    
    //如果没有数据,则暂停
    if(readlen<=0){
     Thread.sleep(300);
     continue;
    }
    
    
    out.write(data ,0,readlen);
    out.flush();
   }
  } catch (Exception e) {
   log.error("type:"+type,e);
  }
  finally{
   //关闭socket
   try {
    if(putDataSocket != null){
     putDataSocket.close();
    }
   } catch (Exception exx) {
   }
   
   try {
    if(getDataSocket != null){
     getDataSocket.close();
    }
   } catch (Exception exx) {
   }
  }
 }
 
}

测试结果:

1、可以实现对oracle数据库、ssh 、telnet等转发,客户端只要连到中间机子对应的端口上,实现了直接操作后台数据库或主机的功能;

2、上述代码不支持HTTP转发,不能实现的原因并不是因为数据没有转发过去,HTTP是基于TCP上的一种高层协议,tcp数据肯定是转发给对应的web服务器了。不能实现的原因是http协议本身的原因,http请求报文中的host参数包含了目的web服务器的ip和端口,直接转发因为host数据不正确导致真正的web服务器会丢弃该请求;另外,还有其它http协议本身的原因,回头我会专门撰写一篇HTTP数据转发来描述解决方案

© 著作权归作者所有

共有 人打赏支持
BLUE-魏晓峰
粉丝 69
博文 30
码字总数 15160
作品 0
福州
高级程序员
加载中

评论(3)

dxdingdu
dxdingdu
楼主有没有关于HTTP转发的解决方案呢
BLUE-魏晓峰
BLUE-魏晓峰

引用来自“kof97”的评论

代码呢?!32
晕,不知道代码怎么没了,我补下
k
kof97
代码呢?!32
使用drozer.bat console connect 时报错的解决方法

1、首先在真实机或者模拟器中启动drozer agent; 2、端口转发:adb forward tcp:31415 tcp:31415; 3、启动drozer:drozer console connect; eg:使用命令:drozer.bat console connect 启动...

carlos
2015/10/27
0
0
用RMI实现基于Java的分布式计算(1)

向您介绍使用RMI实现Java的分布式计算。由于Java具有跨平台、代码可移植性、安全高效等广泛而强大的功能,因而在开发网络Java分布式应用的时候,可以用它自身的机制实现分布式计算。 概述 随...

山哥
2012/02/24
0
0
SpringMVC之接收请求参数和页面传参

Spring接收请求参数 1,使用HttpServletRequest获取 Java代码 @RequestMapping("/login.do") public String login(HttpServletRequest request){ String name = request.getParameter("name")......

白志华
2015/09/23
0
0
做几道基础的Java测试题,看看最近有进步吗?欢迎来学习

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

启示录是真的
05/24
0
0
Rserve与Java的跨平台通信

R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大。 R语言作为统计学一门语言,一直在小众领域闪耀着光芒。直到大数据的爆发,R语言...

zh119893
2014/04/20
0
2
Java NIO 之 Channel(通道)

历史回顾: Java NIO 概览 Java NIO 之 Buffer(缓冲区) 其他高赞文章: 面试中关于Redis的问题看这篇就够了 一文轻松搞懂redis集群原理及搭建与使用 一 Channel(通道)介绍 通常来说NIO中的所...

山川_84b6
05/15
0
0
Golang通过Thrift框架完美实现跨语言调用

  每种语言都有自己最擅长的领域,Golang 最适合的领域就是服务器端程序。   做为服务器端程序,需要考虑性能同时也要考虑与各种语言之间方便的通讯。采用http协议简单,但性能不高。采用...

qinerg
2013/09/29
0
19
新瓶装老酒–PHP结合Java构建Web应用的新思路

本文最早发布在CSDN的博客上,是我为LAJP写的第一篇文章,说明了当时创建LAJP的思路,现在 迁移到这里。 PHP和Java各自有着鲜明的特点: PHP简单、易学,开发动态网页效率高,草根文化气息浓...

刁忆飞
2010/06/03
0
0
Apache+Tomcat负载平衡设置方法详细解析

worker.worker2.host=www2.x.comworker.worker2.port=8009worker.worker2.lbfactor=3.5worker.worker2.cachesize=10worker.worker2.cache_timeout=600worker.worker2.socket_keepalive=1work......

罗进
2010/01/24
0
0
Java编程基础知识点和技术点归纳

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰
05/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

对基于深度神经网络的Auto Encoder用于异常检测的一些思考

一、前言 现实中,大部分数据都是无标签的,人和动物多数情况下都是通过无监督学习获取概念,故而无监督学习拥有广阔的业务场景。举几个场景:网络流量是正常流量还是攻击流量、视频中的人的...

冷血狂魔
18分钟前
0
0
并发设计之A系统调用B系统

A-->B A在发送请求之前,用乐观锁,减少对B的重复调用,这样一定程度上是幂等性。 比如A系统支付功能,要调用B系统进行支付操作,但是前端对"支付"按钮不进行控制,即用户会不断多次点击支付...

汉斯-冯-拉特
38分钟前
0
0
HTTP协议通信原理

了解HTTP HTTP(HyperText Transfer Protocol)是一套计算机通过网络进行通信的规则。计算机专家设计出HTTP,使HTTP客户(如Web浏览器)能够从HTTP服务器(Web服务器)请求信息和服务。 HTTP使用...

寰宇01
今天
0
0
【Java动态性】之反射机制

一、Java反射机制简介

谢余峰
今天
1
0
Centos 6.X 部署环境搭建

1.Linux学习笔记CentOS 6.5(一)--CentOS 6.5安装过程

IT追寻者
今天
0
0
博客即同步至腾讯云+社区声明

我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=8vy9bsmadbko...

xiaoge2016
今天
1
0
大数据教程(3.1):Linux系统搭建网络YUM源服务器

博主在前面的2.5章节讲述了linux系统本地YUM服务器的搭建和httpd轻量级静态网站服务器的安装,本节博主将为大家分享内网环境中搭建自己的网络YUM服务器的全过程。如果大家对本地YUM服务器还不...

em_aaron
今天
1
0
蚂蚁技术专家:一篇文章带你学习分布式事务

小蚂蚁说: 分布式事务是企业集成中的一个技术难点,也是每一个分布式系统架构中都会涉及到的一个东西,特别是在这几年越来越火的微服务架构中,几乎可以说是无法避免,本文就围绕分布式事务...

Java大蜗牛
今天
1
0
新的Steam应用将拓展服务项目

导读 未来几周,Steam将推出两个免费的应用程序Steam Link和Steam Video。这两个应用程序都旨在拓展Steam平台的业务和便利性。 即将开放的Steam Link应用程序最先提供了Android测试版,它将允...

问题终结者
今天
0
0
golang 第三方包的使用总结

golang 第三方包的安装的方法: 1. go get 安装 $ go get github.com/gin-gonic/gin 注意:执行go get 命令需要先安装git命令,并配置git全局变量。 2. 源码包安装 由于国内网络问题,很多时...

科陆李明
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部