socket 实现的 web 服务器在 Windows 下的读写问题

用 socket 实现了个简陋的 web 服务器。这段代码在 Linux 和 Mac 下运行都是正常的,通过浏览器都可以能响应“Hello world!”;但是在 Windows 下运行时,通过浏览器访问会报错“This site can’t be reached The connection was reset.”。

// socket 实现的简单 web 服务器
package main

import (
	"log"
	"net"
	"os"
)

var content = []byte("HTTP/1.1 200 OK\r\nContent-type:text/plain\r\n\r\nHello world!")

func handleConn(conn net.Conn) {
	conn.Write(content)
	defer conn.Close()
}

func main() {
	addr := "localhost:10000"
	listener, err := net.Listen("tcp", addr)
	checkErr(err)
	defer listener.Close()

	for {
		conn, err := listener.Accept()
		if err != nil {
			log.Fatal(err)
			continue
		}
		go handleConn(conn)
	}
}

func checkErr(err error) {
	if err != nil {
		log.Fatal(err)
		os.Exit(1)
	}
}

后来我把 handleConn 函数修改了一下:

func handleConn(conn net.Conn) {
	var buf = make([]byte, 1024) // buf 要确保所有数据都读出来了
	_, err := conn.Read(buf)
	checkErr(err)
	conn.Write(content)
	defer conn.Close()
}

改完之后,在 Linux, Mac 和 Windows 下都可以响应“Hello world!”了。也就是说在 Windows 系统下必须把连接里的字节全部读取之后才可以,而在 Linux 和 Mac 下则读不读都可以。不知道这是我的代码问题还是说由于系统的原因必须要这样写,又或者是其它原因?

共 0 个回复