1.题目

Screenshot_20220402_113401.png

2.思路

采用golang实现server和client

rpc

server

golang原生支持rpc,我们使用net/rpc包中的方法即可

type Book struct {
	Name   string
	BookID int
}

type BookList []Book

type BookManager struct {
	db sql.DB
}

func NewBookManager(db *sql.DB) *BookManager {
	var bm BookManager
	bm.db = *db
	return &bm
}
func (t *BookManager) Add(args *Book, reply *bool) error {
	stmt, err := t.db.Prepare("insert into library set name =?,bookID=?")
	if err != nil {
		*reply = false
		fmt.Println(err)
		return err
	}
	_, err = stmt.Exec(args.Name, args.BookID)
	if err != nil {
		*reply = false
		fmt.Println(err)
		return err
	}
	*reply = true
	return nil
}

func (t *BookManager) QueryByName(args *string, reply *BookList) error {
	sql := "select name,bookID from library where name like '%" + *args + "%'"
	rs, err := t.db.Query(sql)
	if err != nil {
		*reply = BookList{}
		fmt.Println(err)
		return err
	}
	for rs.Next() {
		var bookResult Book
		err = rs.Scan(&bookResult.Name, &bookResult.BookID)
		if err != nil {
			*reply = BookList{}
			fmt.Println(err)
			return err
		}
		*reply = append(*reply, bookResult)
	}
	return nil
}

func (t *BookManager) QueryById(args *int, reply *Book) error {
	sql := "select name,bookID from library where bookID = " + fmt.Sprintln(*args)
	rs, err := t.db.Query(sql)
	if err != nil {
		*reply = Book{}
		fmt.Println(err)
		return err
	}
	for rs.Next() {
		err = rs.Scan(&reply.Name, &reply.BookID)
		if err != nil {
			*reply = Book{}
			log.Println(err)
			return err
		}
	}
	return nil
}

func (t *BookManager) Delete(args *int, reply *bool) error {
	stmt, err := t.db.Prepare("delete from library where bookID =?")
	if err != nil {
		*reply = false
		log.Println(err)
		return err
	}
	_, err = stmt.Exec(args)
	if err != nil {
		*reply = false
		log.Println(err)
		return err
	}
	*reply = true
	return nil
}
func main() {
	db, err := sql.Open("mysql", "root:******@tcp(175.24.118.206:3306)/homework")
	if err != nil {
		panic(err)
	}
	manager := rpc_server.NewBookManager(db)
	rpc.Register(manager)
	rpc.HandleHTTP()
	l, err := net.Listen("tcp", ":1234")
	if err != nil {
		log.Fatal("listen err:", err)
	}
	http.Serve(l, nil)
}

模糊查询

使用mysql的like进行正则匹配即可完成模糊查询的功能

clinet

链接server,调用使用call调用方法即可

func main() {
	clinet, err := rpc.DialHTTP("tcp", "127.0.0.1:1234")
	if err != nil {
		panic(err)
	}
	var args1 rpc_server.Book
	args1.Name = "test"
	args1.BookID = 1
	var reply1 bool
	err = clinet.Call("BookManager.Add", &args1, &reply1)
	if err != nil {
		log.Println(err)
	}
	fmt.Println("1:", reply1)
	args2 := "te"
	var reply2 rpc_server.BookList
	err = clinet.Call("BookManager.QueryByName", &args2, &reply2)
	if err != nil {
		log.Println(err)
	}
	fmt.Println("2:", reply2)
	args3 := 4
	var reply3 rpc_server.Book
	err = clinet.Call("BookManager.QueryById", &args3, &reply3)
	if err != nil {
		log.Println(err)
	}
	fmt.Println("3:", reply3)
	args4 := 2
	var reply4 bool
	err = clinet.Call("BookManager.Delete", &args4, &reply4)
	if err != nil {
		log.Println(err)
	}
	fmt.Println("4:", reply4)

}

3.结果

数据库内容