内网穿刺私人电脑实现公网TCP聊天

内网穿刺私人电脑实现公网TCP聊天

  • 一、推荐www.natfrp.com
  • 二、私人电脑内网穿刺
  • 三、搭建JAVA服务器
  • 四、互联

一、推荐www.natfrp.com

打开www.natfrp.com

二、私人电脑内网穿刺

注册完成后点击首页-服务-隧道列表
在这里插入图片描述
创建隧道
隧道选择TCP隧道,本地端口输入2978自定义端口
在本地端口输入自定义2978
创建成功后点击服务-软件下载
在这里插入图片描述
首页复制访问密钥在这里插入图片描述
在启动器里面输入密钥,打开隧道

在这里插入图片描述

三、搭建JAVA服务器

打开Intellij-IDEA,启动服务器代码,端口号为2978
在这里插入图片描述
服务器代码

public class ServerSocketFrame extends JFrame {
    private JTextField tf_send;
    private JTextArea ta_info;
    private ServerSocket server; // 声明ServerSocket对象
    private Socket socket; // 声明Socket对象socket
    private Vector<Socket> vector = new Vector<Socket>();// 用于存储连接到服务器的客户端套接字对象
    private int counts = 0;// 用于记录连接的客户人数

    public void getServer() {
        try {
            server = new ServerSocket(2978); // 实例化Socket对象
            ta_info.append("服务器套接字已经创建成功\n"); // 输出信息
            while (true) { // 如果套接字是连接状态
                socket = server.accept(); // 实例化Socket对象
                counts++;
                ta_info.append("第" + counts + "个客户连接成功\n"); // 输出信息
                PrintWriter out = new PrintWriter(socket.getOutputStream(),
                        true);
                out.println(String.valueOf(counts - 1));// 向客户端发送套接字索引
                vector.add(socket);// 存储客户端套接字对象
                new ServerThread(socket).start();// 创建并启动线程序
            }
        } catch (Exception e) {
            e.printStackTrace(); // 输出异常信息
        }
    }

    class ServerThread extends Thread {
        Socket socket = null; // 创建Socket对象
        BufferedReader reader; // 声明BufferedReader对象

        public ServerThread(Socket socket) { // 构造方法
            this.socket = socket;
        }

        public void run() {
            try {
                if (socket != null) {
                    reader = new BufferedReader(new InputStreamReader(socket
                            .getInputStream())); // 实例化BufferedReader对象
                    int index = -1;// 存储退出的客户端索引值
                    try {
                        while (true) { // 如果套接字是连接状态
                            String line = reader.readLine();// 读取客户端信息
                            try {
                                index = Integer.parseInt(line);// 获得退出的客户端索引值
                            } catch (Exception ex) {
                                index = -1;
                            }
                            if (line != null) {
                                ta_info.append("接收到客户机发送的信息:" + line + "\n"); // 获得客户端信息
                            }
                        }
                    } catch (Exception e) {
                        if (index != -1) {
                            vector.set(index, null);// 将退出的客户端套接字设置为null
                            ta_info.append("第" + (index + 1) + "个客户端已经退出。\n"); // 输出异常信息
                        }
                    } finally {
                        try {
                            if (reader != null) {
                                reader.close();// 关闭流
                            }
                            if (socket != null) {
                                socket.close(); // 关闭套接字
                            }
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }

    private void writeInfo(PrintWriter writer, String text) {
        writer.println(text);
    }

    public static void main(String[] args) { // 主方法
        ServerSocketFrame frame = new ServerSocketFrame(); // 创建本类对象
        frame.setVisible(true);// 显示窗体
        frame.getServer(); // 调用方法
    }

    public ServerSocketFrame() {
        super();
        setTitle("服务器端程序");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 379, 260);

        final JScrollPane scrollPane = new JScrollPane();
        getContentPane().add(scrollPane, BorderLayout.CENTER);

        ta_info = new JTextArea();
        scrollPane.setViewportView(ta_info);

        final JPanel panel = new JPanel();
        getContentPane().add(panel, BorderLayout.SOUTH);

        final JLabel label = new JLabel();
        label.setText("服务器发送的信息:");
        panel.add(label);

        tf_send = new JTextField();
        tf_send.setPreferredSize(new Dimension(150, 25));
        panel.add(tf_send);

        final JButton button = new JButton();
        button.addActionListener(new ActionListener() {
            public void actionPerformed(final ActionEvent e) {
                for (int i = 0; i < vector.size(); i++) {
                    Socket socket = vector.get(i);// 获得连接成功的套接字对象
                    PrintWriter writer;
                    try {
                        if (socket != null && !socket.isClosed()) {
                            writer = new PrintWriter(socket.getOutputStream(),
                                    true);// 创建输出流对象
                            writeInfo(writer, tf_send.getText()); // 将文本框中信息写入流
                        }
                    } catch (IOException e1) {
                        e1.printStackTrace();
                    }
                }
                ta_info.append("服务器发送的信息是:" + tf_send.getText() + "\n"); // 将文本框中信息显示在文本域中
                tf_send.setText(""); // 将文本框清空
            }
        });
        button.setText("发  送");
        panel.add(button);

        final JPanel panel_1 = new JPanel();
        getContentPane().add(panel_1, BorderLayout.NORTH);

        final JLabel label_1 = new JLabel();
        label_1.setForeground(new Color(0, 0, 255));
        label_1.setFont(new Font("", Font.BOLD, 22));
        label_1.setText("一对多通信——服务器端程序");
        panel_1.add(label_1);
    }
}

四、互联

手机下载网络调试助手
然后输入ip地址
点击软件日志即可查看,或者使用任务管理器ping一下也可以获得公网ip地址,然后输入软件分配的端口号即可互联通信,注意要先打开服务器,再使用手机连接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

matken

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值