Java 端口转发
上班的网络是通过http代理的。因为前段时间搬了工位,这几天同事的ip一直不能通过代理上网,但是我的可以。
为了能让他也能上网,所以用java做了下转发。他电脑配置代理服务器为我电脑的ip
方案
本机监听端口,比如8888,收到的请求直接转发到我们的代理服务器。这样代理服务器以为是我电脑访问,所以会放行。因为共享带宽,只作为临时解决网络问题的方案。
TranslatePort.java
import java.net.ServerSocket;
import java.net.Socket;
public class TranslatePort {
public static void main(String[] args) {
try {
//获取本地监听端口、远程IP和远程端口
int localPort = Integer.valueOf(args[0]);
String remoteIp = args[1];
int remotePort = Integer.valueOf(args[2]);
//启动本地监听端口
ServerSocket serverSocket = new ServerSocket(localPort);
System.out.println("localPort="+localPort + ";remoteIp=" + remoteIp +
";remotePort="+remotePort+";启动本地监听端口" + localPort + "成功!");
Socket clientSocket = null;
Socket remoteServerSocket = null;
while(true){
try {
//获取客户端连接
clientSocket = serverSocket.accept();
System.out.println("accept one client");
//建立远程连接
remoteServerSocket = new Socket(remoteIp ,remotePort);
System.out.println("create remoteip and port success");
//启动数据转换接口
(new TransPortData(clientSocket ,remoteServerSocket ,"1")).start();
(new TransPortData(remoteServerSocket ,clientSocket,"2")).start();
} catch (Exception ex) {
ex.printStackTrace();
}
//建立连接远程
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
TransPortData.java
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class TransPortData extends Thread {
Socket getDataSocket;
Socket putDataSocket;
String type;
public TransPortData(Socket getDataSocket, Socket putDataSocket, String type) {
this.getDataSocket = getDataSocket;
this.putDataSocket = putDataSocket;
this.type = type;
}
@Override
public void run() {
try {
InputStream in = getDataSocket.getInputStream();
OutputStream out = putDataSocket.getOutputStream();
Long lastTime = System.currentTimeMillis();
while (true) {
//读入数据
byte[] data = new byte[1024];
int readlen = in.read(data);
if (System.currentTimeMillis() - lastTime > 60000L) {
break;
}
if (getDataSocket.isClosed() || putDataSocket.isClosed()) {
break;
}
//如果没有数据,则暂停
if (readlen <= 0) {
Thread.sleep(300);
continue;
}
lastTime = System.currentTimeMillis();
out.write(data, 0, readlen);
out.flush();
}
} catch (Exception e) {
System.out.println("type:" + type);
e.printStackTrace();
} finally {
//关闭socket
try {
if (putDataSocket != null) {
putDataSocket.close();
}
} catch (Exception exx) {
}
try {
if (getDataSocket != null) {
getDataSocket.close();
}
} catch (Exception exx) {
}
}
}
}
参考:https://blog.csdn.net/weixin_34409357/article/details/92052664