采用golang实现server和client
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进行正则匹配即可完成模糊查询的功能
链接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)
}
数据库内容