Conéctese de forma remota al servicio de socket local en la red pública [penetración de intranet]


1. Configurar el servicio de socket local

Entorno de demostración del servidor Java

  • jdk1.8
  • Marco: springboot+maven
  • Herramientas de desarrollo: IDEA

Introduzca las coordenadas maven del marco netty encapsulado por el tercer paquete en el archivo pom

<dependency>
   <groupId>io.github.fzdwx</groupId>
   <artifactId>sky-http-springboot-starter</artifactId>
   <version>0.10.6</version>
</dependency>

Nota: El iniciador springbootweb debe comentarse en el archivo pom. El iniciador web inicia de manera predeterminada el servicio tomcat, lo que entrará en conflicto con el servicio netty.

inserte la descripción de la imagen aquí

Cree un servidor java y créelo en modo de interfaz, lo cual es conveniente para llamadas externas

@GetMapping("/getConnect")
public void getConnect(HttpServerRequest request){
    
    

    request.upgradeToWebSocket(ws -> {
    
    

    ws.mountOpen(h->{
    
    

           ws.send("连接成功,开始聊天吧!");
       });

     ws.mountText(s -> {
    
    

         System.out.println(s);

             //对方回复
             System.out.println("客户端回复: "+s);

             //获取控制台输入的值
             Scanner scanner =new Scanner(System.in);

             String next = scanner.next();

             ws.send(next);

     });

    });

}

Inicie el servicio, aparece la siguiente información para indicar que el inicio se realizó correctamente y el puerto expuesto predeterminado: 9999

inserte la descripción de la imagen aquí

2. El servicio de socket local está expuesto a la red pública

Para exponer los servicios locales a la red pública, podemos lograrlo a través de la penetración de la intranet cpolar, sin necesidad de una IP de red pública o un enrutador. Si no ha instalado cpolar, consulte la documentación del sitio web oficial - Guía de inicio

2.1 Crear un puerto de mapeo de túneles 9999

Una vez completada la instalación y configuración local de cpolar, visite el puerto local 9200 ( http://127.0.0.1:9200 ) en el navegador e inicie sesión en la interfaz de administración de la interfaz de usuario web de cpolar.

Haga clic en Gestión de túneles a la izquierda - Crear túnel:

  • Nombre del túnel: se puede personalizar, tenga cuidado de no duplicar el nombre del túnel existente
  • protocolo: tcp
  • Dirección local: 9999
  • Tipo de puerto: libre de elegir al azar
  • Región: Seleccionar China VIP

hacer clic创建

inserte la descripción de la imagen aquí

Nota: El túnel selecciona una dirección TCP y un puerto temporales, que cambiarán dentro de las horas 24. Si necesita corregir la dirección TCP, puede actualizar a un paquete profesional para corregir la dirección TCP.

2.2 Obtener la dirección de la red pública

Una vez que el túnel se haya creado correctamente, haga clic en el estado de la lista de túneles en línea de la izquierda, puede ver el túnel recién creado y se ha generado la dirección de red pública correspondiente, cópielo.

inserte la descripción de la imagen aquí

3. Conéctese al servidor de socket local a través de la red pública

En este punto, el servidor websocket ha sido expuesto desde el localhost local a la red pública, y luego creamos un cliente para probar la red pública para acceder a la conexión del servidor socket.

Tome el cliente de socket basado en go como ejemplo, conecte el servidor de socket java a través de la red pública

  • ir versión: 1.19
  • Herramientas de desarrollo: VSCODE

Descargue el marco websocket a través de git

go get github.com/gorilla/websocket

inserte la descripción de la imagen aquí

Cree un cliente GO, tenga en cuenta: ¡el valor del Host es la dirección de red pública del túnel copiado arriba!

package main

import (
    "fmt"
    "log"
    "net/url"

    "github.com/gorilla/websocket"
)

func main() {
    
    

    // 定义服务端的地址

    u := url.URL{
    
    
        Scheme: "ws",
        Host:   "3.tcp.vip.cpolar.cn:10793", //地址为复制隧道的公网地址
        Path:   "/eth/getConnect"} //服务端controller 映射地址

    // 与服务端建立连接
    c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
    if err != nil {
    
    
        log.Fatal("dial:", err)
    }
    defer c.Close()

    // 阻塞主线程
    down := make(chan byte)

    // 启动一个线程,读取从服务端发送过来的数据
    go func() {
    
    
        for {
    
    
            _, message, _ := c.ReadMessage()
            fmt.Println("服务端回复:" + string(message))
        }
    }()

    //启动一个线程输入消息
    go func() {
    
    

        for {
    
    
            var input string

            fmt.Scanln(&input)

            c.WriteMessage(websocket.TextMessage, []byte(input))

        }

    }()

    for {
    
    
        <-down
    }
}

Luego inicie el servicio, conéctese al servidor y las palabras devueltas por el servidor indican que la conexión es exitosa

inserte la descripción de la imagen aquí

El cliente ingresa información en la consola y hace clic en Enter

inserte la descripción de la imagen aquí

El servidor recibe e imprime la información enviada por el cliente

inserte la descripción de la imagen aquí

Ingrese un mensaje en la consola del servidor y presione Entrar

inserte la descripción de la imagen aquí

El cliente recibe el mensaje de respuesta del servidor y la conexión es exitosa.

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/probezy/article/details/128480924
Recomendado
Clasificación