You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言本地8080端口GET请求后连接重置问题解决咨询

解决TCP服务器返回数据后连接立即重置的问题

你的代码存在几个关键问题导致连接重置:

  • 直接返回原始请求不符合HTTP协议规范,浏览器无法正确解析响应,触发连接异常
  • 读取请求后立即关闭连接,没有遵循HTTP协议的连接关闭逻辑
  • 未处理Read和Write的返回值,无法确认数据是否完整传输

修正方案

  1. 返回符合HTTP规范的响应内容,包含状态行、响应头和响应体
  2. 正确处理IO操作的返回值,捕获读写错误
  3. 确保响应完全发送后再关闭连接

修正后的代码

package main

import (
    "fmt"
    "net"
    "time"
)

func handleConnection(c net.Conn) {
    defer func() {
        // 延迟关闭连接,确保响应发送完成
        if err := c.Close(); err != nil {
            fmt.Printf("关闭连接失败: %v\n", err)
        }
    }()

    fmt.Println("Connection Handled")
    request := make([]byte, 1024)
    n, err := c.Read(request)
    if err != nil {
        fmt.Printf("读取请求失败: %v\n", err)
        return
    }
    fmt.Printf("收到请求:\n%s\n", string(request[:n]))

    // 构造标准HTTP响应
    response := "HTTP/1.1 200 OK\r\n" +
        "Content-Type: text/plain; charset=utf-8\r\n" +
        "Content-Length: 13\r\n" +
        "Connection: close\r\n" +
        "\r\n" +
        "Hello, World!"

    _, err = c.Write([]byte(response))
    if err != nil {
        fmt.Printf("发送响应失败: %v\n", err)
        return
    }

    // 短暂延迟确保数据完全发送(部分场景下需要)
    time.Sleep(100 * time.Millisecond)
}

func main() {
    ln, err := net.Listen("tcp", ":8080")
    if err != nil {
        fmt.Printf("监听端口失败: %v\n", err)
        return
    }
    defer ln.Close()
    fmt.Println("服务器启动,监听端口8080...")

    for {
        conn, err := ln.Accept()
        if err != nil {
            fmt.Printf("接受连接失败: %v\n", err)
            continue
        }
        fmt.Println("Connection Accepted")
        go handleConnection(conn)
    }
}

关键修正说明

  • 构造了标准HTTP响应,浏览器能正确解析,避免因格式错误导致的连接异常
  • 处理了Read和Write的返回值,及时捕获并处理IO错误
  • 使用延迟函数关闭连接,并添加错误处理逻辑
  • 可选的短暂延迟确保响应数据完全发送到客户端后再关闭连接
  • 主函数中添加defer ln.Close(),确保程序退出时正确关闭监听端口

内容的提问来源于stack exchange,提问作者Appapa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 11:27:33