热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java本地如何用tcp转发流量,使用JAVA实现TCP数据转发

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

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

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

答案是肯定的,在中间机子上装一个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 &#61;&#61; null || args.length<3){

log.error("输出参数不能为空&#xff0c;分别是 本地监听端口、远程IP、远程端口");

return;

}

//获取本地监听端口、远程IP和远程端口

int localPort &#61; Integer.parseInt(args[0].trim());

String remoteIp &#61; args[1].trim();

int remotePort &#61; Integer.parseInt(args[2].trim());

//启动本地监听端口

ServerSocket serverSocket &#61; new ServerSocket(localPort);

log.error("localPort&#61;"&#43;localPort &#43; ";remoteIp&#61;" &#43; remoteIp &#43;

";remotePort&#61;"&#43;remotePort&#43;";启动本地监听端口" &#43; localPort &#43; "成功&#xff01;");

while(true){

Socket clientSocket &#61; null;

Socket remoteServerSocket &#61; null;

try {

//获取客户端连接

clientSocket &#61; serverSocket.accept();

log.error("accept one client");

//建立远程连接

remoteServerSocket &#61; 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;

/**

* 用于转发数据

* &#64;author Administrator

*

*/

public class TransPortData extends Thread {

private transient static Log log &#61; LogFactory.getLog(TranslatePort.class);

Socket getDataSocket;

Socket putDataSocket;

String type;

public TransPortData(Socket getDataSocket , Socket putDataSocket ,String type){

this.getDataSocket &#61; getDataSocket;

this.putDataSocket &#61; putDataSocket;

this.type &#61; type;

}

public void run(){

try {

while(true){

InputStream in &#61; getDataSocket.getInputStream() ;

OutputStream out &#61; putDataSocket.getOutputStream() ;

//读入数据

byte[] data &#61; new byte[1024];

int readlen &#61; in.read(data);

//如果没有数据&#xff0c;则暂停

if(readlen<&#61;0){

Thread.sleep(300);

continue;

}

out.write(data ,0,readlen);

out.flush();

}

} catch (Exception e) {

log.error("type:"&#43;type,e);

}

finally{

//关闭socket

try {

if(putDataSocket !&#61; null){

putDataSocket.close();

}

} catch (Exception exx) {

}

try {

if(getDataSocket !&#61; null){

getDataSocket.close();

}

} catch (Exception exx) {

}

}

}

}

测试结果&#xff1a;

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

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



推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 【shell】网络处理:判断IP是否在网段、两个ip是否同网段、IP地址范围、网段包含关系
    本文介绍了使用shell脚本判断IP是否在同一网段、判断IP地址是否在某个范围内、计算IP地址范围、判断网段之间的包含关系的方法和原理。通过对IP和掩码进行与计算,可以判断两个IP是否在同一网段。同时,还提供了一段用于验证IP地址的正则表达式和判断特殊IP地址的方法。 ... [详细]
author-avatar
0704034铜豌豆
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有