为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
幕布斯7119047 2022-10-31 16:52:41
我在 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服务器.gopackage mainimport (    "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!")    })
查看完整描述

1 回答

?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

正如评论中提到的,这个问题与超时值太短有关——每个 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,

}


查看完整回答
反对 回复 2022-10-31
  • 1 回答
  • 0 关注
  • 85 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号