文档章节

sock转发 tcp端口转发

林小宝
 林小宝
发布于 2018/06/07 16:46
字数 336
阅读 75
收藏 0

代码

import java.io.Closeable;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
import java.util.concurrent.CountDownLatch;

public class NAT extends Thread {
	private final Socket socket;
	private final InetSocketAddress target;

	public NAT(Socket socket, InetSocketAddress target) {
		this.socket = socket;
		this.target = target;
	}

	@Override
	public void run() {
		InputStream in = null, targetIn = null;
		OutputStream out = null, targetOut = null;
		Socket targetSocket = null;
		try {
			log("proxy %s to %s", socket.getInetAddress(),target);
			in = socket.getInputStream();
			out = socket.getOutputStream();
			targetSocket = new Socket(target.getAddress(), target.getPort());
			targetIn = targetSocket.getInputStream();
			targetOut = targetSocket.getOutputStream();
			CountDownLatch latch = new CountDownLatch(1);
			transfer(latch, in, targetOut);
			transfer(latch, targetIn, out);
			latch.await();
		} catch (Exception ignored) {
		} finally {
			closeIo(in);
			closeIo(out);
			closeIo(targetIn);
			closeIo(targetOut);
			closeIo(socket);
			closeIo(targetSocket);
		}

	}

	private static String LOG_FORMATTER = "%1$tF %1$tT %2$-3s %3$s%n";

	private static  void log(String message, Object... args) {
		Date dat = new Date();
		message = null == message ? " " : message;
		String data = args.length > 0 ? String.format(message, args) : message;
		Thread curr = Thread.currentThread();
		String msg = String.format(LOG_FORMATTER, dat, curr.getId(), data, curr.getName());
		System.out.print(msg);
	}

	/**
	 * 数据交换.主要用于tcp协议的交换
	 * 
	 * @createTime 2014年12月13日 下午11:06:47
	 * @param lock
	 *            锁
	 * @param in
	 *            输入流
	 * @param out
	 *            输出流
	 */
	public static void transfer(final CountDownLatch latch, final InputStream in, final OutputStream out) {
		new Thread() {
			public void run() {
				byte[] bytes = new byte[1024];
				int n;
				try {
					while ((n = in.read(bytes)) > 0) {
						out.write(bytes, 0, n);
						out.flush();
					}
				} catch (Exception ignored) {
				}
				if (null != latch) {
					latch.countDown();
				}
			};
		}.start();
	}

	private void closeIo(Closeable closeable) {
		if (null != closeable) {
			try {
				closeable.close();
			} catch (IOException ignored) {
			}
		}
	}

	public static void main(String[] args) throws IOException {
		String tmp = args.length > 0 ? args[0] : "53";
		int port = Integer.valueOf(tmp);
		tmp = args.length > 1 ? args[1] : "127.0.0.1";
		String targetHost = tmp;
		tmp = args.length > 1 ? args[2] : "1053";
		int targetPort = Integer.valueOf(tmp);
		log("proxy %s to %s:%s", port,targetHost,targetPort);
		InetSocketAddress net = new InetSocketAddress(targetHost, targetPort);
		ServerSocket sso = new ServerSocket(port);
		Socket socket = null;
		while (null != (socket = sso.accept())) {
			new NAT(socket, net).start();
		}
		sso.close();
	}
}

© 著作权归作者所有

林小宝
粉丝 5
博文 30
码字总数 11167
作品 2
深圳
私信 提问
实现一个简单的 SOCK V5 代理服务器 --- 协议

SOCK 基于 TCP 之上,属于会话层协议,最初由 David Koblas 提出,第一个成熟通用的版本是 NEC 开发的 SOCK V4,但是它不支持认证,不支持代理 UDP 协议,所以功能更为强大的 SOCK V5(RFC 19...

koala bear
2016/08/19
0
0
负载均衡通讯转发分发器(G5)源代码分析

负载均衡通讯转发分发器(G5)源代码分析 (以版本v1.1.0为准) G5源代码文件只有.c(2400行)和.h(260行)两个源文件,行数虽然不多,但是技术密集度较高,分析源码主要从基于epoll(ET)事件处理...

calvinwilliams
2014/04/13
0
0
socket创建及nginx负载均衡(TCP反向代理非HTTP代理)

NGINX 编译需要加这两个模块,才可进行tcp代理转发 --with-stream --with-streamsslmodule nginx.conf(stream需要跟http同级) stream { upstream stream_backend { server 127.0.0.1:2401......

沉淀岁月
2016/12/01
108
0
iptables 设置端口转发/映射(NAT)

一 :从一台机到另一台机端口转发 1.启用网卡转发功能 #echo 1 > /proc/sys/net/ipv4/ip_forward 2.转发至DB服务器Oracle端口1521: 举例:从192.168.0.132:21521(新端口)访问192.168.0.211:1...

bz_z
2018/06/19
0
0
ssh服务端口转发详解

端口转发的概念和应用 什么是端口转发呢,我们知道,SSH 会自动加密和解密所有 SSH 客户端与服务端之间的网络数据。但是,SSH 还同时提供了一个非常有用的功能,这就是端口转发。它能够将其他...

腿快抖断了
2017/10/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Taro ScrollView 组件的 scrollTop 属性是个坑

官方issue:ScrollView设置scrollTop没效果 同样的,设置 scrollTop=0 并不能实现置顶,官方回复早就修复了,我的 Taro 版本已经是最新的,然而并未修复。 万能的评论区,给出了失效的原因。...

dkvirus
13分钟前
0
0
Qt那些事0.0.21

这次还是关于PRO文件中QMAKE_POST_LINK的故事。 平时都是使用VS2015作为编译器,恰巧想用MinGW编一版程序,结果偏偏出现了错误。话说测试的这个项目可是在Linux下(fodera 20)可以正确编译通...

Ev4n
23分钟前
0
0
OSChina 周六乱弹 —— 抖音外放 亲妈下葬。

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @巴拉迪维 :一直没想明白黎明是怎么混进「四大天王」的,直到最近网易云音乐心动模式开启之后 #今日歌曲推荐# 《那有一天不想你》- 黎明 手机...

小小编辑
54分钟前
274
8
Linux使用源码包安装软件

前言: 最近整理一些以前的学习笔记。 过去都是存储在本地,此次传到网络留待备用。 源码包 Linux软件多数免费、开源,是开发人员编写的,具有很强可读性的一组相关代码文本。 源码包 --> 编...

迷失De挣扎
今天
6
0
IPv4如何转换为IPv6?

ipv6已经逐渐在应用,现在已经有很多的运营商支持ipv6,前天我们也发布了如何让电脑使用ipv6地址?有很多朋友在问?ipv6有什么作用,它的表示方式是什么,今天我们来一起来详细了解下ipv6相关计...

xiangyunyan
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部