m0_60945429 2021-12-18 18:56 采纳率: 87%
浏览 18
已结题

javasocket错误

我上网复制了一个Java端口映射器,但不管用请问是怎么回事?
代码:

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.Arrays;
import java.util.Date;
import java.util.List;

public class PortTransfer extends Thread{

    private static final int bufferSize = 8092;
    private ServerSocket localServerSocket;
    private int localPort ;
    private String remoteHost ;
    private int remotPort;

    public static int soTimeOut = 300000;//5分钟超时
    public static List<String> remoteHosts = Arrays.asList("xxx.xx.xxx.xxx");//remotehosts是远程主机
    public static List<String> remotePorts = Arrays.asList("8899");//远程端口
    public static List<String> serverFrontPorts = Arrays.asList("18899");//内部端口

    public static void main(String[] args) {

        for (int i = 0; i < args.length; i++) {

            if ("-remoteHosts".equals(args[i])) {
                remoteHosts = Arrays.asList(args[i + 1].split(","));
                i++;
            } else if ("-serverFrontPorts".equals(args[i])) {
                serverFrontPorts = Arrays.asList(args[i + 1].split(","));
                i++;
            } else if ("-remotePorts".equals(args[i])) {
                remotePorts = Arrays.asList(args[i + 1].split(","));
                i++;
            }

        }

        for (int i = 0; i < remoteHosts.size(); i++) {

            String remoteHost = remoteHosts.get(i);
            int remotePort = Integer.parseInt(remotePorts.get(i));
            int serverFrontPort = Integer.parseInt(serverFrontPorts.get(i));
            new PortTransfer(serverFrontPort,remoteHost,remotePort).start();

        }


    }

    public PortTransfer(int localPort,String remoteHost,int remotPort){
        this.localPort = localPort;
        this.remoteHost = remoteHost;
        this.remotPort = remotPort;
    }

    public void run() {
        try {
            localServerSocket = new ServerSocket(localPort);

            log("service started , listen on " +localServerSocket.getInetAddress().getHostAddress()+":"+ localPort + " , Remote:"+remoteHost+":"+remotPort);

            // 一直监听,接收到新连接,则开启新线程去处理
            while (true) {
                Socket localSocket = localServerSocket.accept();
                localSocket.setSoTimeout(soTimeOut); //5分钟内无数据传输、关闭链接
                log(localSocket.getRemoteSocketAddress() + "  conected");
                new SocketThread(localSocket).start();
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private final static void log(Object message, Object... args) {
        Date dat = new Date();
        String msg = String.format("%1$tF %1$tT %2$-5s %3$s%n", dat, Thread.currentThread().getId(), String.format(message.toString(),args));
        System.out.print(msg);
    }

    class SocketThread extends Thread{


        private Socket localSocket;
        private Socket remoteSocket;
        private InputStream lin;
        private InputStream rin;
        private OutputStream lout;
        private OutputStream rout;

        public SocketThread(Socket socket) {
            this.localSocket = socket;
        }

        public void run() {
            try {

                remoteSocket = new Socket();
                remoteSocket.setSoTimeout(soTimeOut);//5分钟未收到数据,自动关闭资源
                remoteSocket.connect(new InetSocketAddress(remoteHost, remotPort));

                //设置超时,超过时间未收到客户端请求,关闭资源
                remoteSocket.setSoTimeout(soTimeOut); //5分钟内无数据传输、关闭链接
                rin = remoteSocket.getInputStream();
                rout = remoteSocket.getOutputStream();
                lin = localSocket.getInputStream();
                lout = localSocket.getOutputStream();

                new ReadThread().start();

                //写数据,负责读取客户端发送过来的数据,转发给远程
                byte[] data = new byte[bufferSize];
                int len = 0;
                while((len = lin.read(data)) > 0){
                    //System.out.println("------------>>>" + len);
                    if(len == bufferSize) {//读到了缓存大小一致的数据,不需要拷贝,直接使用
                        rout.write(data);
                    }else {//读到了比缓存大小的数据,需要拷贝到新数组然后再使用
                        byte[] dest = new byte[len];
                        System.arraycopy(data, 0, dest, 0, len);
                        rout.write(dest);
                    }

                }

            } catch (Exception e) {
                //log(localSocket.getLocalAddress()+":"+localSocket.getPort() + " localSocket InputStream disconnected.");
            }finally {
                close();
            }
        }

        //关闭资源
        private void close(){
            try {
                if(remoteSocket !=null && !remoteSocket.isClosed()) {
                    remoteSocket.close();
                    log("remoteSocket>>>>" + remoteSocket.getRemoteSocketAddress() +" socket closed ");
                }
            } catch (IOException e1) {
                e1.printStackTrace();
            }

            try {
                if(localSocket !=null && !localSocket.isClosed()) {
                    localSocket.close();
                    log("localSocket>>>>" + localSocket.getRemoteSocketAddress() +" socket closed ");
                }
            } catch (IOException e1) {
                e1.printStackTrace();
            }

        }

        //读数据线程负责读取远程数据后回写到客户端
        class ReadThread extends Thread {
            @Override
            public void run() {
                try {
                    byte[] data = new byte[bufferSize];
                    int len = 0;
                    while((len = rin.read(data)) > 0){
                        if(len == bufferSize) {//读到了缓存大小一致的数据,不需要拷贝,直接使用
                            lout.write(data);
                        }else {//读到了比缓存大小的数据,需要拷贝到新数组然后再使用
                            byte[] dest = new byte[len];
                            System.arraycopy(data, 0, dest, 0, len);
                            lout.write(dest);
                        }
                    }
                } catch (IOException e) {
                    //log(remoteSocket.getLocalAddress() + ":"+ remoteSocket.getPort() + " remoteSocket InputStream disconnected.");
                } finally {
                    close();
                }
            }

        }


    }

}



  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 12月26日
    • 修改了问题 12月18日
    • 创建了问题 12月18日

    悬赏问题

    • ¥15 咨询一个PYTHON的问题
    • ¥15 机器学习建模调参,roc评价指标
    • ¥15 RCS plot 包内置数据集使用时报错,如何解决?
    • ¥15 keil+mspm0g3507+二维总线舵机
    • ¥15 如何用wireshark分析找出url接口和param参数
    • ¥15 有谁知道这是阿里云那个应用的域名吗,怎么调用?
    • ¥30 正则表达式的一些问题
    • ¥15 C#如何使用不需要安装 Microsoft Excel 的机器上的方法或者库实现:将指定Excel区域导出为图片(例如A1:AO50)
    • ¥15 虚拟机只能接收不能发送
    • ¥15 为什么echarts极坐标柱形图的图形显示的特别小呢