分类
Java 笔记

JAVA实现端口转发功能

使用vmware workstation发现NAT模式端口转发存在一些问题。

1.在windows系统下虚拟XP,在XP中使用VPN,然后用ccproxy架设代理。虚拟xp使用的是NAT模式连网,使用vmware workstation自带的端口转发工具设置808端口转发(ccproxy代理端口)不能上网。

2.在centos系统下vmware workstation的网络工具中,没有NAT端口转发选项。手动更改配置文件实现端口转发失败。

其实我要的功能很简单,就一个端口转发。在B机器上安装好虚拟机C,用A机器去连接。因为B机器和A机器是不同网段且不相通(但是A能连接B),所以A连接C需要B转发。使用vmware workstation自带转发实现不了,于是自己写了一个端口转发的小程序。是使用JAVA编写的,能运行于全平台。

实现原理很简单,在B机器上运行程序,监听一个端口用于被连接,当收监听端口收到数据后向C机器发送数据,这样就实现B机器的中转功能了。注意的是需要创建两个socket分别用于数据的读写。以下是数据传输代码:

private static int BUFFER_SIZE = 10240;
private Socket getDataSocket;
private Socket putDataSocket;
public TransPortData(Socket getDataSocket, Socket putDataSocket) {
this.getDataSocket = getDataSocket;
this.putDataSocket = putDataSocket;
}
@Override
public void run() {
try {
while (true) {
InputStream in = getDataSocket.getInputStream();
OutputStream out = putDataSocket.getOutputStream();
// 读入数据
byte[] data = new byte[BUFFER_SIZE];
int readlen = in.read(data);
// 如果没有数据,则暂停
if (readlen <= 0) {
Thread.sleep(300);
continue;
}
out.write(data, 0, readlen);
out.flush();
}
} catch (Exception e) {
} finally {
// 关闭socket
try {
if (putDataSocket != null) {
putDataSocket.close();
}
} catch (Exception exx) {
}
try {
if (getDataSocket != null) {
getDataSocket.close();
}
} catch (Exception exx) {
}
}
}

附上可运行的demo:JAVA端口转发

发表评论

电子邮件地址不会被公开。