返回顶部
首页 > 资讯 > 后端开发 > GO >通过原始 TCP 套接字接受和路由 http 请求
  • 684
分享到

通过原始 TCP 套接字接受和路由 http 请求

2024-04-04 23:04:42 684人浏览 安东尼
摘要

积累知识,胜过积蓄金银!毕竟在golang开发的过程中,会遇到各种各样的问题,往往都是一些细节知识点还没有掌握好而导致的,因此基础知识点的积累是很重要的。下面本文《通过原始 tcp 套接字接受和路由

积累知识,胜过积蓄金银!毕竟在golang开发的过程中,会遇到各种各样的问题,往往都是一些细节知识点还没有掌握好而导致的,因此基础知识点的积累是很重要的。下面本文《通过原始 tcp 套接字接受和路由 Http 请求》,就带大家讲解一下知识点,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~

问题内容

我正在构建一个 WEB 服务器,它必须接受来自客户端的 http 请求,但也必须接受来自对等点的原始 tcp 套接字请求。由于 http 在 tcp 上运行,因此我尝试通过 tcp 服务器路由 http 请求,而不是运行两个单独的服务。

有没有一种简单的方法可以使用 net.conn.read() 读取数据,确定它是否是 http get/post 请求并将其传递给内置的 http 处理程序或 Gorilla mux?现在我的代码如下所示,我正在自己构建 http 路由逻辑:

func ListenConn() {
    listen, _ := net.Listen("tcp", ":8080")
    defer listen.Close()
    for {
        conn, err := listen.Accept()
        if err != nil {
            logger.Println("listener.go", "ListenConn", err.Error())
        }
        go HandleConn(conn)
    }
}

func HandleConn(conn net.Conn) {
    defer conn.Close()

    // determines if it is an http request

    scanner := bufio.NewScanner(conn)
    for scanner.Scan() {
        ln := scanner.Bytes()
        fmt.Println(ln)
        if strings.Fields(string(ln))[0] == "GET" {
            http.GetReGIStrationCode(conn, strings.Fields(string(ln))[1])
            return
        }

        ... raw tcp handler code

    }
}


解决方案


混合 http 和原始 tcp 流量不是一个好主意。

考虑应用程序和客户端之间的所有防火墙和路由器。它们都旨在实现安全的 http(s) 传输。他们将如何处理与有效 http 相同端口的 tcp 流量?

作为一种解决方案,您可以将流量拆分到同一应用程序中的两个不同端口。

通过端口分离,您可以独立路由 http 和 tcp 流量,并为每个通道配置适当的网络安全性。

监听 2 个不同端口的示例代码:

package main

import (
    "fmt"
    "net"
    "net/http"
    "os"
)

type httpHandler struct {
}

func (m *httpHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    fmt.Println("HTTP request")
}

func main() {
    // http
    go func() {
        http.ListenAndServe(":8001", &httpHandler{})
    }()

    // tcp
    l, err := net.Listen("tcp", "localhost:8002")
    if err != nil {
        fmt.Println("Error listening:", err.Error())
        os.Exit(1)
    }
    defer l.Close()
    for {
        conn, err := l.Accept()
        if err != nil {
            fmt.Println("Error accepting: ", err.Error())
            os.Exit(1)
        }
        go handleRequest(conn)
    }
}

// Handles incoming requests.
func handleRequest(conn net.Conn) {
    // read/write from connection

    fmt.Println("TCP connection")
    conn.Close()
}

在浏览器中打开http://localhost:8001/并运行命令行 echo -n "test" | nc localhost 8002测试监听器

今天关于《通过原始 TCP 套接字接受和路由 http 请求》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注编程网公众号!

您可能感兴趣的文档:

--结束END--

本文标题: 通过原始 TCP 套接字接受和路由 http 请求

本文链接: https://lsjlt.com/news/595865.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 通过原始 TCP 套接字接受和路由 http 请求
    积累知识,胜过积蓄金银!毕竟在Golang开发的过程中,会遇到各种各样的问题,往往都是一些细节知识点还没有掌握好而导致的,因此基础知识点的积累是很重要的。下面本文《通过原始 TCP 套接字接受和路由...
    99+
    2024-04-04
  • go中通过tcp连接发出http请求
    php小编草莓将为大家介绍如何在Go语言中通过TCP连接发出HTTP请求。在网络开发中,我们常常需要与其他服务器进行通信,并获取数据或发送请求。Go语言提供了丰富的标准库,其中包含了用...
    99+
    2024-02-09
    go语言 标准库
  • python怎样通过get方式,post方式发送http请求和接收http响应
    这期内容当中小编将会给大家带来有关python怎样通过get方式,post方式发送http请求和接收http响应,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。GET方法get方法是直接将要请求的数据放在u...
    99+
    2023-06-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作