Socket不同局域网下进行连接【利用frp】
原理
云服务器和本地Socket连接
拥有一台有公网IP的云服务器作为中转站,将局域网下的电脑将数据信息发送给中转的服务器,然后这个中转的服务器将收到的数据转给另外一台电脑,这样就可以实现两台电脑之间的互相通信。
原因:我们可以实现在局域网下的通信而不能在不是同一局域网下的通信是因为,不同的私网之间是无法通信的,我们使用的192.168.x.x都是私网,但是所有的私网却都可以和公网ip直接通信的。所以。想要在两个私网之间通信的话,我们就需要多一个步骤,也就是需要一个公网的IP作为中转站。
公网IP
拥有云服务器之后,会有一个公网IP地址。
配置安全组
将公网IP的某些端口开放,这样frp才能通过这个端口通信。配置完成之后,云服务器重启。
添加一条访问规则
其它云具体查看 阿里云/腾讯云/华为云安全组配置开放端口_Guoye的专栏-CSDN博客_华为云安全组设置
配置frp
frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp 协议,为 http 和 https 应用协议提供了额外的能力,且尝试性支持了点对点穿透。
即:通过frp配置服务器来实现中转站的功能
下载对应的frp版本
平台软件包下载的地址:https://github.com/fatedier/frp/releases
服务器上配置frp
我的是centos,利用xshell操纵,xftp传输frp文件。
- 将文件传输到opt里面
- 解压文件
# 下面是我下载的版本
tar xzvf frp_0.39.0_linux_amd64.tar.gz
- 删除压缩包
rm frp_0.39.0_linux_amd64.tar.gz
- 进入frp…目录
cd frp_0.39.0_linux_amd64
- 修改或者默认服务端的frp监听端口
frps.ini 是服务端的简单配置,frps_full.ini是服务端的高级配置,这里默认
cat frps.ini
- 启动frp
./frps -c ./frps.ini
客户端上配置frp
客户端时windows,直接用记事本打开,修改frpc.ini里面的内容,基本配置为
- server_addr : frp 服务端的公网 IP
- server_port :frp 服务端监听的端口(这个就是之前在服务器上配置的端口)
- type:连接类型
- local_ip:本地客户端的IP地址(私网)
- local_port:本地将要被访问的端口 6000 (必须有)
然后在此文件夹shift+右键,打开powershell,运行 ./frpc.exe ,会出现如下结果
而此时服务端会有
这下就连接成功了。
Socket代码
服务端
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Server{
private ServerSocket serverSocket;
Server(int port) throws Exception {
serverSocket = new ServerSocket(port);
}
// 持续等待用户连接
public void run() {
while(true) {
try {
Socket server = serverSocket.accept();
DataInputStream in = new DataInputStream(server.getInputStream());
DataOutputStream out = new DataOutputStream(server.getOutputStream());
System.out.println(in.readUTF());
out.writeUTF("再见");
server.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String args[]) throws Exception {
Server server = new Server(6060);
server.run();
}
}
客户端
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;
public class Client {
private static String servername = "";// 对应服务端监听的ip地址和端口
private static int port = 6060;
public static void main(String args[]) throws Exception {
Socket client = new Socket(servername,port);
DataInputStream in = new DataInputStream(client.getInputStream());
DataOutputStream out = new DataOutputStream(client.getOutputStream());
out.writeUTF("我来连接了");
System.out.println(in.readUTF());
client.close();
}
}
结果
在服务端运行Server代码,客户端运行代码。
配置java具体查看这篇文章阿里云服务器配置Java环境_ddgo的博客-CSDN博客
服务端
客户端