Proxy.java

package com.dc.tcp.proxy;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Proxy {
 
 public static void main(String[] args) {
  try {
   ServerSocket server = new ServerSocket(8081);
   while (true) {
    Socket socket = server.accept();
    Pool.getInstance().getExecutor().execute(new ProxyWorker(socket));
   }
  } catch (IOException e) {
   e.printStackTrace();
  }
  
 }
}

ProxyWorker.java

package com.dc.tcp.proxy;

import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException; public class ProxyWorker implements Runnable {     private Socket server = null;
    private Socket client = null;     public ProxyWorker(Socket client) {
        try {
            server = new Socket("10.126.3.163", 3306);
            this.client = client;
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }     @Override
    public void run() {
        Pool.getInstance().getExecutor().execute(new ProxySender(client, server));
        Pool.getInstance().getExecutor().execute(new ProxyReceiver(client, server));
    }
}

ProxySender.java

package com.dc.tcp.proxy;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; public class ProxySender implements Runnable { private Socket client = null;
private Socket server = null;
private Logger log = LoggerFactory.getLogger(ProxySender.class); public ProxySender(Socket client, Socket server) {
super();
this.server = server;
this.client = client;
} @Override
public void run() {
try {
InputStream is = server.getInputStream();
OutputStream os = client.getOutputStream();
// log.info("send:");
while (true) {
int flag = 0;
if ((flag = is.read()) == -1) {
break;
} else {
int count = is.available();
if (count > 0) {
byte[] b = new byte[count];
is.read(b);
byte[] temp = new byte[count + 1];
temp[0] = (byte) flag;
for (int i = 0; i < b.length; i++) {
temp[i + 1] = b[i];
}
// log.info(new String(temp));
String tempStr = "";
for (int i = 0; i < temp.length; i++) {
tempStr += " " + temp[i];
}
// log.info(tempStr);
os.write(temp);
}
}
}
} catch (IOException e) {
e.printStackTrace();
if (client != null) {
try {
client.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
if (server != null) {
try {
server.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
log.info("sender close socket");
}
if (client != null) {
try {
client.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
if (server != null) {
try {
server.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
log.info("sender close socket");
} }

ProxyReceiver.java

package com.dc.tcp.proxy;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; public class ProxyReceiver implements Runnable { private Socket server = null;
private Socket client = null;
private Logger log = LoggerFactory.getLogger(ProxyReceiver.class); public ProxyReceiver(Socket client, Socket server) {
super();
this.server = server;
this.client = client;
} @Override
public void run() {
try {
InputStream is = client.getInputStream();
OutputStream os = server.getOutputStream();
log.info("receive:");
while (true) {
int flag = 0;
if ((flag = is.read()) == -1) {
break;
} else {
int count = is.available();
if (count > 0) {
byte[] b = new byte[count];
is.read(b);
byte[] temp = new byte[count + 1];
temp[0] = (byte) flag;
for (int i = 0; i < b.length; i++) {
temp[i + 1] = b[i];
}
log.info(new String(temp));
String tempStr = "";
for (int i = 0; i < temp.length; i++) {
tempStr += " " + temp[i];
}
log.info(tempStr);
os.write(temp);
}
}
}
} catch (IOException e) {
e.printStackTrace();
if (client != null) {
try {
client.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
if (server != null) {
try {
server.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
log.info("receiver close socket");
}
if (client != null) {
try {
client.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
if (server != null) {
try {
server.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
log.info("receiver close socket");
} }

Pool.java

package com.dc.tcp.proxy;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; public class Pool { private static Pool instance = null;
private ExecutorService executor = null; private Pool() {
super();
executor = Executors.newFixedThreadPool(6);
} public static Pool getInstance() {
if (instance == null) {
synchronized (Pool.class) {
if (instance == null) {
instance = new Pool();
}
}
}
return instance;
} public ExecutorService getExecutor() {
return executor;
} }

tcp转发的更多相关文章

  1. centos7 编译安装nginx+tcp转发

    一.依赖 1. gcc 安装安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,则需要安装: yum install gcc-c++ 2. PCRE pc ...

  2. 手头没证书,如何给https做代理?Nginx TCP转发

    线上的一个海外充值接口(https)经常因我朝网络问题中断,想借助hk的机器做个https反向代理又没证书. 一开始 一开始想到的办法是借助Nginx的tcp转发进行代理: 编译NGINX时加入 -- ...

  3. Golang TCP转发到指定地址

    Golang TCP转发到指定地址 第二个版本,设置指定ip地址 代码 // tcpForward package main import ( "fmt" "net&qu ...

  4. Golang tcp转发 remoteAddr错误

    Golang tcp 转发 第一版本 accept获取的Conn里的localAddr做为源地址,remoteAddr来做为目的地址 // tcpForward package main import ...

  5. [转帖]【rinetd】CentOS7.x上轻量级TCP转发工具rinetd的安装配置

    [rinetd]CentOS7.x上轻量级TCP转发工具rinetd的安装配置 https://www.jianshu.com/p/2605d247b944 这一个写的更加全面了. 2019.07.0 ...

  6. nginx编译安装以及配置tcp转发

    依赖包安装 yum -y install gcc gcc-c++ make automake autoconf pcre pcre-devel zlib zlib-devel openssl open ...

  7. FreeBSD NGINX TCP转发

    前几天搞转发,研究了下TCP转发,现在记录下来 首先加载模块 注意:这是FreeBSD的位置.并且需要NGINX支持 load_module /usr/local/libexec/nginx/ngx_ ...

  8. p2p-tunnel 打洞内网穿透系列(三)TCP转发访问内网web服务

    系列文章 p2p-tunnel 打洞内网穿透系列(一)客户端配置及打洞 p2p-tunnel 打洞内网穿透系列(二)TCP转发访问远程共享文件夹 p2p-tunnel 打洞内网穿透系列(三)TCP转发 ...

  9. p2p-tunnel 打洞内网穿透系列(二)TCP转发访问内网共享文件夹

    系列文章 p2p-tunnel 打洞内网穿透系列(一)客户端配置及打洞 p2p-tunnel 打洞内网穿透系列(二)TCP转发访问远程共享文件夹 p2p-tunnel 打洞内网穿透系列(三)TCP转发 ...

  10. CentOS7.x上轻量级TCP转发工具rinetd的安装配置

    一.实验背景 Linux下端口转发一般都使用iptables来实现,使用iptables可以很容易将TCP和UDP端口从防火墙转发到内部主机上. 如果需要将流量从专用地址转发到不在您当前网络上的机器上 ...

随机推荐

  1. Talk about VR

    Virtual reality --VR ,虚拟现实,是利用计算机模拟一个三维空间的世界,提供用户关于各种感官的模拟,让用户感觉身临其境,可以及时,没有限制地观察三维空间内的事物,用户进行位置移动时, ...

  2. ZYNQ学习之——MIO

    1.GPIO基础知识 Zynq7000 系列芯片有 54 个 MIO(multiuse I/O) ,它们分配在 GPIO 的 Bank0 和Bank1 隶属于 PS 部分, 这些 IO 与 PS 直接 ...

  3. Spring注解学习

    参考链接 http://blog.csdn.net/xyh820/article/details/7303330/

  4. Git Pro - (2)分支

    Git 保存的不是文件差异或者变化量,而只是一系列文件快照. 在 Git中提交时,会保存一个提交(commit)对象,它包含一个指向暂存内容快照的指针,作者和相关附属信息,以及一定数量(也可能没有)指 ...

  5. 【Python】【学习笔记】持续更新

    调用模块的两种方式: #方式1 from decimal import Decimal Decimal('1.00') #方式2 import decimal decimal.Decimal('1.0 ...

  6. git 撤销commit

    如果不小心commit了一个不需要commit的文件,可以对其进行撤销. 先使用git log 查看 commit日志 commit 422bc088a7d6c5429f1d0760d008d86c5 ...

  7. ARCGIS进行地理配准并加载到谷歌地球中查看

    普通的地图图片如何能让其附有经纬度坐标和投影信息,如何能将普通的地图图片加载到诸如谷歌地球等相关的三维地球软件当中进行生产或学习使用呢,这就要用到gis当中常用的一种功能,叫做地理配准.地理配准并不复 ...

  8. JS最基础的获取元素的值实现加减乘除运算

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  9. JAVA-系统-【3】-java应用连接oracle正常,但是网页却报错java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver

    这是因为jar包已经导入了项目的应用部分,网页的lib去没有导入. 导入以后还要刷新项目,最好重启tomcat,就解决了..

  10. NTFS u盘支持 - centos6

    uname -r bash-4.1# uname -r2.6.32-431.el6.x86_64 ---- http://repository.it4i.cz/mirrors/repoforge/re ...