golang实现http静态文件服务

这个例子只是一个非常简单的学习示例,用来说明用socket编程来实现一个http服务的例子,大家可以举一反三。

package main

import (
	"bufio"
	"fmt"
	"io/ioutil"
	"net"
	"os"
	"strconv"
)

func FileGetContents(fileName string) (string, error) {
	file, err := os.Open(fileName)
	if err != nil {
		return "", err
	}
	defer file.Close()
	content, err := ioutil.ReadAll(file)
	return string(content), nil
}

func responseHtml(fileName string) string {
	body, _ := FileGetContents(fileName)
	bodyLen := len(body)
	result := ""
	result += "HTTP/1.1 200\r\n"
	result += "Content-Length:" + strconv.Itoa(bodyLen) + "\r\n"
	result += "Content-Type: text/html;charset=utf-8\r\n"
	result += "\r\n" + body + "\r\n"
	return result
}

func readLine(bufr *bufio.Reader) ([]byte, error) {
	p, isPrefix, err := bufr.ReadLine()
	if err != nil {
		return p, err
	}
	var l []byte
	for isPrefix {
		l, isPrefix, err = bufr.ReadLine()
		if err != nil {
			break
		}
		p = append(p, l...)
	}
	return p, err
}

func DealConn(conn net.Conn) {
	// 处理完关闭连接
	defer conn.Close()
	fmt.Println("new conn\n")
	// 针对当前连接做发送和接受操作
	for {
		reader := bufio.NewReader(conn)
		line, err := readLine(reader)
		// 数据读取正确
		if err == nil {
			requestMethod := ""
			requestUrl := ""
			requestProto := ""
			fmt.Sscanf(string(line), "%s%s%s", &requestMethod, &requestUrl, &requestProto)
			fmt.Println("request:", requestMethod, requestUrl, requestProto)
			// 回复消息
			conn.Write([]byte(responseHtml("." + requestUrl)))
		} else {
			break
		}
	}
}

func main() {
	// 建立tcp 服务
	listen, err := net.Listen("tcp", "0.0.0.0:1215")
	if err != nil {
		fmt.Printf("listen failed, err:%v\n", err)
		return
	}

	for {
		// 等待客户端建立连接
		fmt.Printf("accept conn ...... \n")
		conn, err := listen.Accept()
		if err != nil {
			fmt.Printf("accept failed, err:%v\n", err)
			continue
		}

		// 启动一个单独的 goroutine 去处理连接
		go DealConn(conn)
	}
}

此条目发表在 好文推荐 分类目录,贴了 , 标签。将固定链接加入收藏夹。

golang实现http静态文件服务》有 2 条评论

  1. xtgxiso 说:

    大家可以说下什么业务场景下需要自己编写http Server?