程序分为站点端和中心端(相当于一个proxy).
这个小功能主要是解决,程序经常让我们去拖日志,特别烦.所以做个小程序.使程序可以自己去线上查看.
有个问题是,不能把游戏服务器暴露出来,还有就是不能占用业务机器的公网带宽.
这个小程序主要就是中心端(proxy)通过内网获取文件,然后转发给访问端.
中心端主要有两个文件,一个是程序文件.一个是我命名为json的文件(主要是根据ID来分辨分站)
主程序文件内容:
package main import ( "encoding/json" "flag" "fmt" "io" "io/ioutil" "net/http" "net/rpc" "regexp" "strings" "text/template" "time" ) var port *string = flag.String("l", "127.0.0.1:2789", "-l 127.0.0.1:2789") var Index string var Filelist string <pre name="code" class="plain">var configlist map[string]string var re *regexp.Regexptype Info struct {Name stringTime time.Time}type Newlist []*Infotype pathlist struct {List NewlistDir string}func main() {flag.Parse()Index = fmt.Sprintf(`<html><title>分区列表</title><body><table>{{range $k,$v := .}}<tr><td><a href="http://%s/{{$k}}/">分区:{{$k}}</a></td></tr>{{end}}</table></body></html>`, *port)Filelist = fmt.Sprintf(`<html><title>文件列表</title><body><table>{{$path := .Dir}}{{range $k,$v := .List}}<tr><td><a href="http://%s{{$path}}/{{$v.Name}}">文件名:{{$v.Name}}</a></td><td> 修改时间:{{$v.Time}}</td></tr>{{end}}</table></body></html>`, *port)re, _ = regexp.Compile("^/[0-9]{7}/")b, _ := ioutil.ReadFile("json")json.Unmarshal(b, &configlist)http.HandleFunc("/", route)e := http.ListenAndServe(*port, nil)fmt.Println(e)}func route(w http.ResponseWriter, r *http.Request) {if r.URL.Path == "/" {t := template.New("")t.Parse(Index)t.Execute(w, configlist)}if re.MatchString(r.URL.Path) {getlist(r.URL.Path, w)}}func getlist(path string, w http.ResponseWriter) {l_path := strings.Split(path, "/")id := l_path[1]path = strings.Join(l_path[2:], "/")client, err := rpc.DialHTTP("tcp", configlist[id])if err != nil {fmt.Println(err)}var x Newlisterr = client.Call("Info_list.List", path, &x)if err != nil {if err.Error() == path {getfile(path, id, w)return}fmt.Fprintln(w, err)return}if path == "" {path = "/" + id} else {path = "/" + id + "/" + path}var Pl pathlist = pathlist{x, path}T := template.New("")T.Parse(Filelist)T.Execute(w, Pl)}func getfile(path, id string, w http.ResponseWriter) error {r, e := http.Get(fmt.Sprintf("http://%s/%s", configlist[id], path))if e != nil {fmt.Println(e)return e}io.Copy(w, r.Body)return nil} json 文件内容:
{"7400006":"192.168.80.247:6987", "7400007":"127.0.0.1:1987"}
目录结构我使用的是: --agent -|
---http.go
---sort.go
--maste.go
http.go内容:
package agent import ( "errors" "fmt" "net/http" "net/rpc" "os" ) var Http_path string type Info_list int func HttpServer(port, path string) { Http_path = path rpc.Register(new(Info_list)) rpc.HandleHTTP() http.Handle("/", http.FileServer(http.Dir(path))) err := http.ListenAndServe(fmt.Sprintf(port), nil) fmt.Println(err) } func (i *Info_list) List(path string, result *Newlist) error { path_l := Http_path + "/" + path info, e := os.Stat(path_l) if e != nil { return e } if info.IsDir() { L, _ := GetFilelist(path_l) *result = L return nil } else { return errors.New(path) } }sort.go内容:
package agent import ( "io/ioutil" "sort" "time" ) type Info struct { Name string Time time.Time } type Newlist []*Info func GetFilelist(path string) (Newlist, error) { l, err := ioutil.ReadDir(path) if err != nil { return []*Info{}, err } var list []*Info for _, v := range l { list = append(list, &Info{v.Name(), v.ModTime()}) } sort.Sort(Newlist(list)) return list, nil } func (I Newlist) Len() int { return len(I) } func (I Newlist) Less(i, j int) bool { return I[i].Time.Unix() < I[j].Time.Unix() } func (I Newlist) Swap(i, j int) { I[i], I[j] = I[j], I[i] }
package main import ( "agent" "flag" ) func main() { var port *string = flag.String("l", ":1789", "-l :1789 或者 -l 127.0.0.1:1789 默认是监听在1789的端口上") var path *string = flag.String("p", "./", "-p ./ 或者 -p D:\\code") flag.Parse() go agent.HttpServer(*port, *path) select {} }
var configlist map[string]string var re *regexp.Regexp
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/fyxichen/article/details/46971619