Socket不同局域网下进行连接【利用frp】

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文件。

  1. 将文件传输到opt里面
  2. 解压文件
# 下面是我下载的版本
tar xzvf frp_0.39.0_linux_amd64.tar.gz
  1. 删除压缩包
rm frp_0.39.0_linux_amd64.tar.gz
  1. 进入frp…目录
cd frp_0.39.0_linux_amd64
  1. 修改或者默认服务端的frp监听端口

frps.ini 是服务端的简单配置,frps_full.ini是服务端的高级配置,这里默认

cat frps.ini

请添加图片描述

  1. 启动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博客

服务端
请添加图片描述
客户端请添加图片描述

参考

处于不同局域网下的Socket通信(配置)_猪猪的博客-CSDN博客_socket编程怎么跨局域网通信

  • 0
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 OMNeT++ 中,可以使用 C++ 标准库中的 Socket API 来进行 socket 编程。要连接外部端口,您需要编写自己的模块,并在其中创建一个 socket。以下是一个简单的例子,演示了如何在 OMNeT++ 中使用 socket 连接到一个外部端口: ```c++ #include <omnetpp.h> #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h> using namespace omnetpp; class MyModule : public cSimpleModule { private: int sockfd; struct sockaddr_in servaddr; protected: virtual void initialize() override; virtual void handleMessage(cMessage *msg) override; }; Define_Module(MyModule); void MyModule::initialize() { sockfd = socket(AF_INET, SOCK_STREAM, 0); // 设置服务器地址和端口号 bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(80); inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr); // 连接服务器 if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) != 0) { EV << "连接失败" << endl; return; } EV << "连接成功" << endl; } void MyModule::handleMessage(cMessage *msg) { // 处理消息 } ``` 在上面的代码中,我们创建了一个名为 `MyModule` 的模块,并在其中定义了一个整数 `sockfd` 和一个 `sockaddr_in` 结构体 `servaddr`,用于保存服务器地址和端口信息。在 `initialize()` 方法中,我们创建了一个 `SOCK_STREAM` 类型的 socket,并将其连接到指定的服务器地址和端口。如果连接成功,我们会在控制台上打印一条连接成功的消息。在 `handleMessage()` 方法中,我们可以处理传入的消息。这里没有做任何事情,因为我们只是想展示如何使用 socket 连接外部端口。 请注意,上面的示例仅演示了如何使用 socket 连接到一个外部端口。如果您需要发送或接收数据,请使用 `send()` 和 `recv()` 函数。此外,还应该注意遵循 OMNeT++ 模块之间通信的规则。例如,在 `handleMessage()` 方法中,您可能需要将消息发送到其他模块,而不是直接处理它们。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值