欢迎光临
我们一直在努力

go语言学习例子No.29–页面实时获取系统信息6

简单的添加账号和密码

server服务端

package main

import (
	"fmt"
	"io"
	"net"
	"net/http"
	"strings"
	"text/template"
)

type Consys struct {
	data string
	c  net.Conn

}
var info string

func index(w http.ResponseWriter, r *http.Request) {
	t, _ := template.ParseFiles("index.html") //找模板
	t.Execute(w, nil)                         //执行模板
}
func ajax(w http.ResponseWriter, r *http.Request) {
	w.Header().Set("Content-type", "application/json;charset=utf-8")
	fmt.Fprintln(w,info)
}
func main() {
	go startserver()//开个协程,要不然会跟http的监听有冲突
	http.Handle("/assets/", http.StripPrefix("/assets/", http.FileServer(http.Dir("assets"))))
	http.HandleFunc("/", index)      //函数也是一种变量
	http.HandleFunc("/ajax", ajax) //函数也是一种变量
	http.ListenAndServe(":8082", nil)
}



func startserver(){
	addr, _ := net.ResolveTCPAddr("tcp4", "localhost:8899")
	lis, _ := net.ListenTCP("tcp4", addr)
	fmt.Println("服务器已启动")

	for {//通过gorountine,每个客户端分配一个独立协程。
		conn, _ := lis.Accept()
		go handleConn(conn)
	}

	fmt.Println("服务器结束")
}

func handleConn(conn net.Conn){
	defer conn.Close()
	b := make([]byte, 256)
	count, err := conn.Read(b)//接收第一个传过来的账号和密码
	if err != nil && err != io.EOF{//这里判断一下err,如果断开就跳出循环,关闭当前连接
		fmt.Println("客户端断开连接")
		return
	}
	arr := strings.Split(string(b[:count]),":")//验证账号和密码
	if arr[0] != "abc" || arr[1] != "123" {
		fmt.Println("用户名或者密码错误!")
		return
	}
	for{//验证通过了,就一直保持连接接收信息
		count, err := conn.Read(b)
		if err != nil && err != io.EOF{//这里判断一下err,如果断开就跳出循环,关闭当前连接
			fmt.Println("客户端断开连接")
			break
		}
		info = string(b[:count])
	}
}

client客户端

package main
import (
	"encoding/json"
	"fmt"
	"strconv"
	"time"
	net2 "net"

	"github.com/shirou/gopsutil/cpu"
	"github.com/shirou/gopsutil/disk"
	"github.com/shirou/gopsutil/mem"
	"github.com/shirou/gopsutil/net"
	"github.com/shirou/gopsutil/host"
)

type Sys struct {
	Cpuused      int
	Memused      int
	Memavailable float64
	Swaptotal	float64
	Swapfree	float64
	Memtotal     float64
	Disktotal    float64
	Diskfree     float64
	Diskused     int
	Netsend      float64
	Netrecv      float64
	Netup        string
	Netdown      string
	Uptime      int
}
func main(){
	//服务器端ip和端口
	conn, _ := net2.Dial("tcp", "localhost:8899")
	//向服务端发送数据
	s:=Sys{}
	c := make(chan []byte,2)//设置2个缓存,这样取了一个就会马上放进去一个
	go func() {
		for{
			s = getstatus()
			d, _ := json.Marshal(s)
			c<-d
		}
	}()
	_,err:=conn.Write([]byte("hqhyco:jiajia111"))//发送账号密码
	if err != nil {//如果验证不通过就结束程序
		fmt.Println(err.Error())
		return
	}
	for{
		_,err:=conn.Write(<-c)
		if err != nil {
			fmt.Println(err.Error())
			break
		}
	}
	////关闭连接
	conn.Close()
}
func toG(i uint64) float64 {
	return float64(i) / 1024 / 1024 / 1024
}
func toKB(i uint64) float64 {
	return float64(i) / 1024
}
func toMB(i uint64) float64 {
	return float64(i) / 1024 / 1024
}
func Decimal(value float64) float64 {
	value, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", value), 64)
	return value
}

func getNetSpeed() (string, string) {
	// 读取所有网卡网速
	Net, _ := net.IOCounters(true)
	// 定义网速保存变量
	var rx, tx uint64
	// 循环网络信息
	for _, nv := range Net {
		// 去除多余信息
		if "eth0" == nv.Name {
			// 加上网速信息
			rx += nv.BytesRecv
			tx += nv.BytesSent
		}
	}
	// 暂停一秒
	time.Sleep(time.Second)
	// 重新读取网络信息
	Net, _ = net.IOCounters(true)
	// 网络信息保存变量
	var rx2, tx2 uint64
	// 循环网络信息
	for _, nv := range Net {
		// 去除多余信息
		if "eth0" == nv.Name {
			// 加上网速信息
			rx2 += nv.BytesRecv
			tx2 += nv.BytesSent
		}
	}
	// 两次相减
	if toKB(rx2-rx) > 1024 || toKB(tx2-tx) > 1024 {
		down:= strconv.FormatFloat(toMB(rx2 - rx),'f',2,64)+"MB/S"
		up:= strconv.FormatFloat(toMB(tx2 - tx),'f',2,64)+"MB/S"
		return down, up
	} else {
		down:= strconv.FormatFloat(toKB(rx2 - rx),'f',2,64)+"KB/S"
		up:= strconv.FormatFloat(toKB(tx2 - tx),'f',2,64)+"KB/S"
		return down, up
	}

}
func getstatus() Sys {
	s := Sys{}
	m, _ := mem.VirtualMemory()
	c, _ := cpu.Percent(time.Second, false)
	d, _ := disk.Usage("/")
	n, _ := net.IOCounters(true)
	swap,_:=mem.SwapMemory()
	s.Netsend = Decimal(toG(n[1].BytesSent))
	s.Netrecv = Decimal(toG(n[1].BytesRecv))
	s.Diskused = int(d.UsedPercent)
	s.Diskfree = Decimal(toG(d.Free))
	s.Disktotal = Decimal(toG(d.Total))
	s.Memused = int(m.UsedPercent)
	s.Memtotal = Decimal(toG(m.Total))
	s.Memavailable = Decimal(toG(m.Available))
	s.Cpuused = int(c[0])
	s.Netdown, s.Netup = getNetSpeed()
	s.Uptime = int(getUptime()/60/60/24)
	s.Swaptotal=Decimal(toG(swap.Total))
	s.Swapfree=Decimal(toG((swap.Free)))
	return s
}
func getUptime() uint64 {//获取的是秒数
	up, err := host.BootTime()
	if nil != err {
		return 0
	}
	return uint64(time.Now().Unix()) - up
}

简单的添加了单一的用户名和密码

 收藏 (0) 打赏

您可以选择一种方式赞助本站

支付宝扫一扫赞助

微信钱包扫描赞助

未经允许不得转载:家里蹲的狐狸 » go语言学习例子No.29–页面实时获取系统信息6

分享到: 生成海报
avatar

热门文章

  • 评论 抢沙发

    • QQ号
    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址

    登录

    忘记密码 ?

    切换登录

    注册

    我们将发送一封验证邮件至你的邮箱, 请正确填写以完成账号注册和激活