Go语言本地8080端口GET请求后连接重置问题解决咨询
解决TCP服务器返回数据后连接立即重置的问题
你的代码存在几个关键问题导致连接重置:
- 直接返回原始请求不符合HTTP协议规范,浏览器无法正确解析响应,触发连接异常
- 读取请求后立即关闭连接,没有遵循HTTP协议的连接关闭逻辑
- 未处理
Read和Write的返回值,无法确认数据是否完整传输
修正方案
- 返回符合HTTP规范的响应内容,包含状态行、响应头和响应体
- 正确处理IO操作的返回值,捕获读写错误
- 确保响应完全发送后再关闭连接
修正后的代码
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
相关产品推荐
相关产品推荐

