package main

import (
	"io/ioutil"
	"net/http"
	"os"
)

func main() {
	args := os.Args //获取输入的参数
	/*	遍历参数
		for i,s := range args{
			print("--",i,"--",s,"\n")
		}
	*/
	//初始化端口以及检验用户输入
	port := "8080"
	argsLength := len(args)
	if argsLength != 2 && argsLength != 1 {
		print("please enter the port\n")
		return
	}
	if argsLength == 2 {
		port = args[1]
	}
	portLength := len(port)
	if portLength != 4 {
		print("error port\n")
		return
	}
	//加载本地文件
	loadPage("", "")
	var handle http.Handler
	//绑定host 开始服务
	print("the server is starting...the port:", port, "\n")
	err := http.ListenAndServe("0.0.0.0:"+port, handle)
	print(err, "\n")
	print("please review your port")
}

func loadPage(path string, urlPath string) {
	var files []os.FileInfo
	if path == "" {
		path = "./"
	}
	if urlPath == "" {
		urlPath = "/"
	}
	//获取当前文件夹下所有文件包括文件夹
	files, _ = ioutil.ReadDir(path)
	for _, f := range files {
		if f.IsDir() { //如果当前是一个文件夹
			loadPage(appendPath(path, f.Name()), appendUrlPath(urlPath, f.Name()))
		} else {
			//绑定文件名
			if path == "./" {
				loadHandle(path+f.Name(), urlPath+f.Name())
			} else {
				loadHandle(path+"/"+f.Name(), urlPath+"/"+f.Name())
			}
		}
	}
}

//文件名和文件绑定
func loadHandle(path string, urlPath string) {
	bytes, _ := ioutil.ReadFile(path)
	//print("\n", urlPath, "\n")
	http.HandleFunc(urlPath, func(writer http.ResponseWriter, request *http.Request) {
		writer.Write(bytes)
	})
}

//拼接路径
func appendPath(prefixPath string, suffixPath string) string {
	if prefixPath == "./" {
		return prefixPath + suffixPath
	}
	return prefixPath + "/" + suffixPath
}

//拼接url->端口号后部分
func appendUrlPath(prefixUrlPath string, suffixUrlPath string) string {
	if prefixUrlPath == "/" {
		return prefixUrlPath + suffixUrlPath
	}
	return prefixUrlPath + "/" + suffixUrlPath
}

启动方式 go run server.go 9977 端口可以不指定,默认 8080

go语言编译以后直接生成可执行文件(相对于系统,如果是在windows上编译就只能在windows上运行,Linux同理),不依赖go环境,类似gcc 编译,编译以后可以使用 cmd 窗口运行 server.exe 9977,或编写bat文件添加  server.exe 9977

采用相对路径,会先遍历和源码文件相同路径下的文件。

如同文件夹下有index.html 可以访问 http://127.0.0.1:9977/index.html

github:https://github.com/crazyjay97/GoLangLearn

使用Golang打造自己的http服务器 1.0版本的更多相关文章

  1. 动手打造轻量web服务器(二)路由

    tomcat启动慢?自己动手打造轻量web服务器(一) 上篇讲了怎么做一个最简单的web服务器,这篇就是在上篇加上URL路由功能(什么是路由?) 首先,根据http获得请求行 val scanner ...

  2. 基于Nettty打造自己的MVC服务器

    最近开始折腾Netty,体验下NIO编程.既然学习了,就要做点东西出来,要不然不容易掌握学到的东西.在Netty的官方demo上都有各种case的sample,打造Http服务器的核心代码就是从Sam ...

  3. 新阿里云服务器从0开始配置为python开发环境

    由于每次打开linux虚拟机比较麻烦,于是尝试一下云服务器,在阿里云领取了一个月的试用服务器,这里记录一下新服务器从0配置成python开发环境的步骤,以便以后配置新服务器时有个参考. 免费领取一个月 ...

  4. Windows Server 2003服务器.net4.0+IIS6.0的服务器,IE11浏览器访问的不兼容性

    工作中发生了一件诡异的事情: 程序在Win7+.NET4.0+IIS7.5的服务器部署,IE8和IE11请求时,响应的样式都正常. 但是在美的同事反映说,Windows Server 2003服务器. ...

  5. Serv-U无法连接到服务器127.0.0.1,端口43958 FTP服务器不能启动

    端口43958,这是Serv-U的本地管理端口,只允许127.0.0.1连接.    在出现“Serv-U无法连接到服务器127.0.0.1,端口43958”这个错误的时候,一般ftp软件无法自动启动 ...

  6. GIT用服务器上的版本强制覆盖掉本地的版本(转)

    以前在机子上使用git下载了linux git版本库上的源代码,由于在阅读源代码的过程中,难免会对本地的文件进行修改,这样就导致本地文件与服务器上的文件版本不一致,我想做的就是用服务器上的版本强制覆盖 ...

  7. linux服务器查看redis版本:

    linux服务器查看redis版本:redis-server-v

  8. 注册asp.net 4.0版本到IIS服务器中

    在IIS服务器的运维的过程中,有时候部署asp.net网站发现未安装.net framework对应版本信息,此时就需要重新将.net framework对应的版本注册到IIS中,此处以重新注册.ne ...

  9. linux服务器升级python版本(python2与python3共存)

    linux服务器升级python版本 ######################################## 第一步先安装sqlite-devel,因为python2也有这个,python3 ...

随机推荐

  1. 关于学习JAVA第二章的心得

    这章主要讲了JAVA的变量,数据类型和运算符的使用方法及规则. 其实在大一的时候接触过一点C和C++的知识所以对变量,数据类型,运算符还是有一定了解的. 变量其实就是存储数据的空间.我们每次使用某一种 ...

  2. go项目

    1.循环使用缓存 每条日志需要开辟缓存块来存储内容,以减少频繁的内存分配与回收.日志结构体定义如下: type MLogger struct { // freeList is a list of by ...

  3. Item 22: 当使用Pimpl机制时,在实现文件中给出特殊成员函数的实现

    本文翻译自<effective modern C++>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 如果你曾经同过久的编译时间斗争过,那么你肯定对Pi ...

  4. Python之Flask笔记

    在这里先说一下最开始所经历的一些错误app=Flask(_name_),当初拼写的时候怎么都报错后来发现此处是两个'_' 配置文件 app.config.from_object(__name__) 在 ...

  5. Unique Snowflakes UVA - 11572 (离散化+尺取法)

    Emily the entrepreneur has a cool business idea: packaging and selling snowflakes. She has devised a ...

  6. Vicious Keyboard CodeForces - 801A (暴力+模拟)

    题目链接 题意: 给定一个字符串,最多更改一个字符,问最多可以有多少个“VK”子串? 思路: 由于数据量很小,不妨尝试暴力写.首先算出不更改任何字符的情况下有多个VK字串,然后尝试每一次更改一个位置的 ...

  7. git更新提交代码常用命令

    git pull 拉取代码 git add -A 提交所有变化(包括删除.新增.修改) git commit -m "注释" 本地仓库提交 git push origin mast ...

  8. java.lang.LinkageError: JAXB 2.0 API is being loaded from the bootstrap classloader

    我的解决办法:    1.如果是application工程,则在程序中打印出         system.out.println(System.getProperty("java.endo ...

  9. 【学习总结】Git学习-参考廖雪峰老师教程-期末总结

    学习总结之Git学习-总 目录: 一.Git简介 二.安装Git 三.创建版本库 四.时光机穿梭 五.远程仓库 六.分支管理 七.标签管理 八.使用GitHub 九.使用码云 十.自定义Git 期末总 ...

  10. Linux reboot与init 6区别

    Reboot与init 6的区别 - flyingcloud_2008的专栏 - CSDN博客https://blog.csdn.net/flyingcloud_2008/article/detail ...