Golang http ABC

shengjuntu · · 1311 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。
//html 文件参见
http://www.ieyebrain.com:8080/pts/src/master/

package main

import (
	"flag"
	"net/http"
	"io"
	"strings"
	"strconv"
)

type ClientInfo struct {
	id int
	ip string
	name string
}


var (
	addr = flag.String("addr", ":9191", "pts master address")
	clients = make(map[int] ClientInfo)
	sn = 0
	
)

type Web struct {
	w http.ResponseWriter
	req *http.Request 
}


func  newWeb(w http.ResponseWriter, req *http.Request) *Web {
	return &Web{w:w,req:req}
}

func (p *Web) getClientIp() string {
	r := p.req
    	ip := r.Header.Get("X-Real-IP")
    	if ip == "" {
    		ip = strings.Split(r.RemoteAddr, ":")[0]
    	}
    	if ip == "[" {
    		ip = "localhost"
    	}
    	return ip
}

func (p *Web) beginTag(tag string) {
	io.WriteString(p.w, "<" + tag  + ">")
}

func (p *Web) endTag(tag string) {
	io.WriteString(p.w, "</" + tag + ">")
}

func (p *Web) tagVal(tag string, val string) {
	io.WriteString(p.w, "<" + tag + ">" +  val + "</" + tag +  ">")
}

func (p *Web) write(val string) {
	io.WriteString(p.w, val)
}

func (p *Web) htmlTmpl(title string, body string) {
	p.beginTag("html")
	p.beginTag("head")
	p.tagVal("title", title)
	p.endTag("head")
	p.write(body)
	p.endTag("body")
	p.endTag("html")
}




func listHandler(w http.ResponseWriter, req *http.Request) {
	web := newWeb(w,req)
	web.beginTag("html")
	web.beginTag("head")
	web.tagVal("title", "PTS Master")
	web.endTag("head")
	
	web.beginTag("body")	
	web.beginTag("ul")
	for _,v := range clients {
		web.beginTag("li")
		web.write(strconv.Itoa(v.id))
		web.write(" : ")
		web.write(v.ip)
		web.endTag("li")
	}

	web.write(`<hr>`);
	web.write(`<a href="index.html">home</a>`);
	web.endTag("ul")
	web.endTag("body")
	web.endTag("html")
}

func loginHandler(w http.ResponseWriter, req *http.Request) {
	web := newWeb(w,req)

	req.ParseForm()
	id := sn //req.Form["id"]
	//name := req.Form["name"]
	ip := web.getClientIp()
	
	clients[id] = ClientInfo {
			id:id,
			name:ip,
			ip:ip}
	sn++

	web.htmlTmpl("LoginOK",`<a href="list">loginRecord</a>`)
	
}

func main() {
	flag.Parse()
	fileSvr := http.FileServer(http.Dir("html"))
	http.Handle("/",fileSvr) 
	http.HandleFunc("/list", listHandler)
	http.HandleFunc("/login", loginHandler)
	
	err := http.ListenAndServe(*addr, nil)
	panic(err)

}



有疑问加站长微信联系

本文来自:开源中国博客

感谢作者:shengjuntu

查看原文:Golang http ABC

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:812540095

1311 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传