是什么导致 Go 服务器中的“对等连接重置”错误?

我在 Go 中编写了一个基本的 Web 服务器,但它似乎无法正确处理任何请求,而我得到的只是“接收失败:对等方重置连接”。


我很高兴服务器确实可以正确启动和停止,并且我可以看到它正在侦听我配置的端口 8080。我还排除了解析 YAML 配置文件的问题——它肯定会被解析到 http.Server{}。


我真的不知道还有什么要检查的,并且努力寻找任何指向正确方向的东西。


我也会提前道歉,因为我知道我在下面粘贴了大量代码,但我真的不知道错误来自什么以及来自哪里。


鉴于服务器正在运行,当我点击“/”端点/路由时,我希望得到“Hello from Go!” 回来了。


目录结构

❯ tree . | grep -iE 'cmd|server.go|go.mod|go.sum|server.yaml'

├── cmd

│   └── server.go

├── go.mod

├── go.sum

└── server.yaml

服务器.go

package main


import (

    "context"

    "errors"

    "fmt"

    "log"

    "net/http"

    "os"

    "os/signal"

    "syscall"

    "time"


    "gopkg.in/yaml.v3"

)


type Config struct {

    Port            string `yaml:"Port"`

    ReadTimeout     int    `yaml:"ReadTimeout"`

    WriteTimeout    int    `yaml:"WriteTimeout"`

    IdleTimeout     int    `yaml:"IdleTimeout"`

    ShutdownTimeout int    `yaml:"ShutdownTimeout"`

    ErrorLog        string `yaml:"ErrorLog"`

}


func main() {

    if len(os.Args) != 2 {

        log.Fatal("Missing arguments")

    }


    configFile, err := os.Open(os.Args[1])

    if err != nil {

        log.Fatal(err)

    }

    defer configFile.Close()


    // TODO: Implement a custom ServeMux + routes


    serverConfig := Config{}

    yamlDecoder := yaml.NewDecoder(configFile)

    err = yamlDecoder.Decode(&serverConfig)

    if err != nil {

        log.Fatal(err)

    }


    errorLogFile, err := os.OpenFile(serverConfig.ErrorLog, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)

    if err != nil {

        log.Fatal(err)

    }

    defer errorLogFile.Close()

    errorLog := log.New(errorLogFile, "ERROR : ", log.LstdFlags|log.Lshortfile)


    server := &http.Server{

        Addr:         fmt.Sprintf(":%s", serverConfig.Port),

        ReadTimeout:  time.Duration(serverConfig.ReadTimeout),

        WriteTimeout: time.Duration(serverConfig.WriteTimeout),

        IdleTimeout:  time.Duration(serverConfig.IdleTimeout),

        ErrorLog:     errorLog,

    }


    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {

        fmt.Fprintln(w, "Hello from Go!")

    })



幕布斯7119047
浏览 86回答 1
1回答

一只斗牛犬

正如评论中提到的,这个问题与超时值太短有关——每个 5 纳秒。这是因为 time.Duration 表示为两个瞬间之间经过的时间,以 int64 纳秒计数。所以我需要将其转换为几秒钟,以获得我所期望的。从文档:“持续时间将两个瞬间之间的经过时间表示为 int64纳秒计数。该表示将最大可表示持续时间限制为大约 290 年。”参考解决方案:server := &http.Server{    Addr:         fmt.Sprintf(":%s", serverConfig.Port),    ReadTimeout:  time.Duration(serverConfig.ReadTimeout) * time.Second,    WriteTimeout: time.Duration(serverConfig.WriteTimeout) * time.Second,    IdleTimeout:  time.Duration(serverConfig.IdleTimeout) * time.Second,    ErrorLog:     errorLog,}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go