文档章节

使用JAVA实现TCP数据转发

何天贵
 何天贵
发布于 2013/05/27 16:12
字数 756
阅读 8.3K
收藏 4

#程序员薪资揭榜#你做程序员几年了?月薪多少?发量还在么?>>>

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

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

答案是肯定的,在中间机子上装一个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数据转发来描述解决方案

© 著作权归作者所有

何天贵
粉丝 70
博文 31
码字总数 15545
作品 0
福州
技术主管
私信 提问
加载中

评论(3)

dxdingdu
dxdingdu
楼主有没有关于HTTP转发的解决方案呢
何天贵
何天贵 博主

引用来自“kof97”的评论

代码呢?!32
晕,不知道代码怎么没了,我补下
k
kof97
代码呢?!32
JAVA入门到精通-第84讲-网络基础

QQ后台界面(服务器界面):可以对用户管理 强制有人下线 豪华版:腾讯公司 im 项目,即时通讯项目; 后台“启动服务器” 服务器架设在公网上,是可以实现网络聊天的; --------------------...

osc_s26r3w6g
2018/12/01
3
0
2019最新大厂必问面试真题360道,进BAT必看,40w年薪不接受反驳!

前言 最近为了方便面试复习,我把各类面试题给汇总了一下,每道题都是经过自己筛选后觉得需要掌握的,此次整理包括 Java、数据结构与算法、计算机网络、操作系统、数据库等。后面月亮会把这些...

我最喜欢三大框架
2019/05/06
50
0
Java实现ModbusTCP通信

一个项目,需要用Java实现使用ModbusTCP和硬件设备通信 资料 代码下载 本文的代码和仿真软件:蓝奏云下载 官网资料 Modbus官网 Modbus协议 Modbus技术资源 MODBUS TCP / IP 关于Java的开源库...

osc_29lf73z8
2019/05/08
39
0
【DataBase】H2 DateBase的拓展使用

连接模式   支持以下连接模式: 嵌入模式(使用JDBC的本地连接) 服务器模式(使用JDBC或ODBC over TCP / IP进行远程连接) 混合模式(同时本地和远程连接) 嵌入模式   在嵌入模式下,应...

osc_nubdt7rk
2019/05/28
2
0
JavaTCP和UDP套接字编程

原文地址:http://www.cnblogs.com/MindMrWang/p/8919890.html在我们刚开始入门Java后端的时候可能你会觉得有点复杂,包含了很多杂七杂八的知识,例如文件上传下载,监听器,JDBC,请求重定向...

osc_039ggp1i
2018/04/23
1
0

没有更多内容

加载失败,请刷新页面

加载更多

如果我有jQuery背景,那么“ AngularJS中的思考”吗? [关闭]

问题: Closed . 已关闭 。 This question needs to be more focused . 这个问题需要更加集中 。 It is not currently accepting answers. 它当前不接受答案。 Want to improve this questio......

技术盛宴
40分钟前
9
0
ArrayList-不常用方法

这篇笔记主要记录一些不常用方法,了解一下可以干什么,有个印象。 改变数组容量 /** * 将该<tt> ArrayList </ tt>实例的容量调整为列表的当前大小。 * 应用程序可以使用此操作来最大程度...

jackdawl
44分钟前
4
0
PCDN+路由器就能赚钱? 揭秘京东云无线宝背后的黑科技

受疫情影响,今年视频直播、点播等在线视频业务迎来了爆发期,看视频成为人们宅在家中的主要消遣方式之一,由此带来的互联网流量增长大幅增加了对 CDN流量的消耗。传统CDN依赖于运营商、IDC...

京东智联云开发者
46分钟前
16
0
Oracle 中关于 group by 的那些坑

分组聚合Group by 在mysql中,对group by 的使用限制是比较宽松,还是比较灵活的, 表数据之间的调取是完全没问题的; 而在Oracle中,对group by 就有一定限制,两句相同的SQL语句,可能在mysql中不...

煌sir
今天
20
0
MySQL服务器的SQL模式

与其它数据库不同,MySQL 服务器可以在不同的 SQL 模式下运行,并且可以针对不同的客户端以不同的方式应用这些模式,具体取决于 sql_mode 系统变量的值。 SQL 模式定义了 MySQL 数据库所支持...

Linux就该这么学
今天
36
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部