内网穿刺私人电脑实现公网TCP聊天
- 一、推荐www.natfrp.com
- 二、私人电脑内网穿刺
- 三、搭建JAVA服务器
- 四、互联
一、推荐www.natfrp.com
二、私人电脑内网穿刺
注册完成后点击首页-服务-隧道列表
创建隧道
隧道选择TCP隧道,本地端口输入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地址,然后输入软件分配的端口号即可互联通信,注意要先打开服务器,再使用手机连接