go服务端代码

项目流产,记录一下服务端代码:

1、http解析;

2、json解析;

3、mysql存储

 

package main

import (
	"database/sql"
	"encoding/json"
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"io/ioutil"
	 // "log"
	// "io"
	"net/http"
)

///数据解析结构体
type rfid_message struct {
	Node_device_number int
	Node_device_mac        string
	// Number int
	Rec_time string
	Position string
	Data     string
}

type Mesg_mesg struct {
	Rfid_dev rfid_message
}

//数据返回结构体
type Post_Res struct {
	PackTpye   string `json:"PackTpye"`
	State      int    `json:"state"`
	MacAddress string `json:"mac"`
}

type Packslice struct {
	Package []Post_Res `json:"pack"`
}

func helloHandler(w http.ResponseWriter, req *http.Request) {

	if req.Method == "GET" {
		body, _ := ioutil.ReadAll(req.Body)

		body_str := string(body)
		fmt.Println(body_str)

		var mesg Mesg_mesg
		err := json.Unmarshal([]byte(body_str), &mesg)
		if err != nil {
			fmt.Println(err)
		}

		fmt.Println(mesg.Rfid_dev.Data)
		//fmt.Println(mesg.Rfid_dev.Node_device_mac)

		var s Packslice
		s.Package = append(s.Package, Post_Res{PackTpye: "serv_return_post", State: 1, MacAddress: "1234567890ABCE"})

		b, err := json.Marshal(s)
		if err != nil {
			fmt.Println("json err: ", err)
		}

		fmt.Println(string(b)) 打印需要返回的json
		w.Write([]byte(b))

		db, err := sql.Open("mysql", "toone:123456@(192.168.1.237:3306)/user_data") //链接数据库
		if err != nil {
			//log.Fatal(err)
		}
		defer db.Close()
		er := db.Ping()
		if er != nil {
			fmt.Println("数据库连接失败")
			return
		}
                // fmt.Println(mesg.Rfid_dev.Node_device_number, mesg.Rfid_dev.Rec_time, mesg.Rfid_dev.Position, mesg.Rfid_dev.Data, mesg.Rfid_dev.Node_device_mac)
		 Query(db, mesg.Rfid_dev.Node_device_number, mesg.Rfid_dev.Rec_time, mesg.Rfid_dev.Position, mesg.Rfid_dev.Data, mesg.Rfid_dev.Node_device_mac) /// 首先查询是否有记录

	}

}

func Insert(db *sql.DB, a int, b string, c string, d string, e string) {
	//a:Node_device_number_dev
	//b:Node_device_mac
	//c:Rec_time
	//d:Position
	//e:Data

	stmt, err := db.Prepare("INSERT INTO work SET node_device_number=?,rec_time_first=?,postion=?,data=?,dev_mac=?")
	if err != nil {
		fmt.Println(err)
		return
	}

	res, err := stmt.Exec(a, b, c, d, e)
	id, err := res.LastInsertId()
	if err != nil {
		panic(err)
	}

	fmt.Println(id)

}
func SubString(str string,begin,length int) (substr string) {
	lth := len(str)

	
	if begin < 0 {
		begin = 0
	}
	if begin >= lth {
		begin = lth
	}
	end := begin + length
	if end > lth {
		end = lth
	}

	// 返回子串
	return string(str[begin:end])
}

func Query(db *sql.DB, a int, b string, c string, d string, e string) {
         fmt.Println(a,b,c,d,e)
         //fmt.Println(mesg.Rfid_dev.Node_device_number, mesg.Rfid_dev.Rec_time, mesg.Rfid_dev.Position, mesg.Rfid_dev.Data, mesg.Rfid_dev.Node_device_mac)	
        // var  cc int =0;
          var  s int =0;
         //var  ss_dat string;
         s = len(d)/24;
	 for i := 0; i < s; i++ {
         v:= SubString(d,i*24,24)
         fmt.Println("=====>>>>\r\n")
          fmt.Println(v)
          fmt.Println("=====>>>>\r\n")
         var select_string string
	select_string = fmt.Sprintf("select * from work where data='%s';", v) //查询data字段
	fmt.Println(string(select_string))
	rows := db.QueryRow(select_string) //查询单行

	//rows, err:= db.Query("select * from work where data = ?;",dta)//查询多行
	//   defer rows.Close() //查询多行

	var ID int  // store query count
	var node_device_number int
	var rec_time_first string
	var postion sql.NullString
	var data sql.NullString
	var rec_time_last sql.NullString
        var dev_mac sql.NullString
   
        var time_tmp string

	err := rows.Scan(&ID, &node_device_number, &rec_time_first, &postion, &data, &rec_time_last,&dev_mac)

	fmt.Println("rows_id ?", ID)
	if (err != nil ) { //没有查询到记录
		// log.Fatal(err)
         fmt.Println("第一次打卡")
         fmt.Println(ID, node_device_number, rec_time_first, postion, data, rec_time_last,dev_mac)
          Insert(db, a, b, c, v, e)
	}else{
             time_tmp =  (rec_time_first) //存放第一次打卡时间
            fmt.Println("第二次打卡")
            Updata(db, a, b, c, v, e,time_tmp,ID)
       } 
        
       }

}


var ID int  // store query count
	var node_device_number int
	var rec_time_first string
	var postion sql.NullString
	var data sql.NullString
	var rec_time_last sql.NullString
        var dev_mac sql.NullString

func Updata(db *sql.DB, a int, b string, c string, d string, e string,f string, g int) {
      fmt.Println(a,b,c,d,e,f)
      sql := fmt.Sprintf(
		"update work set node_device_number='%d', rec_time_first='%s', postion='%s', data='%s', rec_time_last='%s', dev_mac='%s' where ID='%d'",
		a,
		f,
		c,
                d,
                b,
                e,
                g)
      fmt.Println(sql)
        result, err := db.Exec(sql) 
        if err != nil {
             fmt.Println("exec failed:", err, ", sql:", sql) 
             return 
             } 
          id, err := result.RowsAffected() 
       if err != nil { 
            fmt.Println("RowsAffected failed:", err) 
            return 
             }
       fmt.Println("受影响行数 %d",id)


}

func main() {

	 //Query(db)
	//Insert(db)

	 hh := http.HandlerFunc(helloHandler) // 通过 HandlerFunc 把函数转换成 Handler 接口的实现对象
	http.Handle("/", hh)
	http.ListenAndServe(":8090", nil)
 
}

 

RPC(Remote Procedure Call,远程过程调用)是一种通信协议,它允许程序调用远程计算机上的服务,就像调用本地服务一样。下面是使用Go实现RPC客户端和服务端代码示例。 ### 1. 定义RPC服务 定义一个名为`HelloService`的RPC服务,该服务提供一个名为`Hello`的方法,该方法接受一个字符串类型的参数,并返回一个字符串类型的结果。 ```go type HelloService struct {} func (s *HelloService) Hello(request string, reply *string) error { *reply = "Hello, " + request return nil } ``` ### 2. 注册RPC服务 在服务端,我们需要将`HelloService`注册到RPC服务中。 ```go func main() { // 创建RPC服务器 rpcServer := rpc.NewServer() // 注册HelloService服务 err := rpcServer.RegisterName("HelloService", new(HelloService)) if err != nil { log.Fatal("RegisterName error:", err) } // 启动监听 listener, err := net.Listen("tcp", ":1234") if err != nil { log.Fatal("ListenTCP error:", err) } // 接收连接并为每个连接创建一个goroutine处理RPC请求 for { conn, err := listener.Accept() if err != nil { log.Fatal("Accept error:", err) } go rpcServer.ServeConn(conn) } } ``` ### 3. 调用RPC服务 在客户端,我们需要创建一个RPC客户端,连接到RPC服务,并调用`HelloService`的`Hello`方法。 ```go func main() { // 连接RPC服务器 client, err := rpc.Dial("tcp", "localhost:1234") if err != nil { log.Fatal("Dial error:", err) } defer client.Close() // 调用HelloService的Hello方法 var reply string err = client.Call("HelloService.Hello", "world", &reply) if err != nil { log.Fatal("Call error:", err) } fmt.Println(reply) } ``` 这里我们通过`rpc.Dial`方法连接到RPC服务,然后通过`client.Call`方法调用`HelloService`的`Hello`方法,并将字符串`"world"`作为参数传递给该方法。最后打印`reply`变量的值。 注意:以上代码示例中省略了错误处理,实际使用时需要加上相关的错误处理代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值