socket,连接mysql等数据库操作,go web复习

Posted 旧时星空

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了socket,连接mysql等数据库操作,go web复习相关的知识,希望对你有一定的参考价值。

socket以及go web 的复习

服务器端

import (
	"fmt"
	"net"
	"strings"
)
//定义用户对象,包含发送用户和接收用户
type User struct
	Username string  //发送
	OtherUsername string //接收
	Msg string //发送的信息
	ServerMsg string //服务器的提示信息

var(
	userMap=make(map[string]net.Conn) //多用户时创建的多个连接包括用户间连接
	//和与服务器端连接都保存Conn对象在map中
	user=new(User)
)
func main()
	addr,_:=net.ResolveTCPAddr("tcp4","localhost:8899")
	lis,_:=net.ListenTCP("tcp4",addr)
	for 
		conn, _ := lis.Accept()
		go func() 
			for 
				b := make([]byte, 1024)
				count, _ := conn.Read(b)//将连接中的信息读入到byte数组b中
				array := strings.Split(string(b[:count]), "-")
				//将客户端传递过来的消息解析成user对象
				user.Username = array[0]
				user.OtherUsername = array[1]
				user.Msg = array[2]
				user.ServerMsg = array[3]
				userMap[user.Username]=conn//将每个User与服务器的连接保存到MAP中,
				//如果一个user给对方发消息,下面判断对方user与服务器的连接是否存在
				//进而判断对方是否在线
				//表示与OtherUser的通信是否存在
				//与对方通信即由双方的连接发送信息即 Conn v
				if v, ok := userMap[user.OtherUsername]; ok && v != nil 
					n, err := v.Write([]byte(fmt.Sprintf("%s-%s-%s-%s",user.Username,user.OtherUsername,user.Msg,user.ServerMsg)))
					if n <= 0 || err != nil 
						delete(userMap, user.OtherUsername)
						conn.Close()
						v.Close()
						fmt.Println("if....")
						break
					
					fmt.Println("消息发送成功")
				 else
						user.ServerMsg="对方不在线"
						//与服务器连接的,即由服务器发送
						conn.Write([]byte(fmt.Sprintf("%s-%s-%s-%s",user.Username,user.OtherUsername,user.Msg,user.ServerMsg)))
				

			
		()
	

1.通过net.ResolveTCPAddr方法来创建服务器端的IP地址和端口,方法返回一个addr对象
2.通过net.ListenTCP方法来监听服务器IP与端口的连接,即客户端的访问等连接,方法返回一个listen对象,参数有addr,表示监听addr地址的连接
3.conn, _ := lis.Accept(),表示监听器接收连接,返回一个连接对象

客户端

import (
	"fmt"
	"net"
	"os"
	"strings"
	"sync"
)

type User struct
	Username string
	OtherUsername string
	Msg string
	ServerMsg string

var(
	user=new(User)//当前登录用户信息
	wg sync.WaitGroup //等待组
)
func main()
	wg.Add(1)
    fmt.Println("请输入你的账号")
	fmt.Scanln(&user.Username)
	fmt.Println("请输入发送信息的对象")
	fmt.Scanln(&user.OtherUsername)
	addr,_:=net.ResolveTCPAddr("tcp4","localhost:8899")
	conn,_:=net.DialTCP("tcp4",nil,addr)//建立网络连接
	//发送消息
	go func()
		fmt.Println("请输入要发送的消息(仅提示一次)")
		for
			fmt.Scanln(&user.Msg)
			if user.Msg=="exit"
				conn.Close()
				wg.Done()
				os.Exit(0)
			
			conn.Write([]byte(fmt.Sprintf("%s-%s-%s-%s",user.Username,user.OtherUsername,user.Msg,user.ServerMsg)))
		
	()
	//服务器接受信息
    go func()
    	for 
			b := make([]byte, 1024)
			count, _ := conn.Read(b)
			array := strings.Split(string(b[:count]), "-")
			user2 := new(User)
			user2.Username = array[0]
			user2.OtherUsername = array[1]
			user2.Msg = array[2]
			user2.ServerMsg = array[3]
			if user2.ServerMsg != "" 
				fmt.Println("\\t\\t服务器的消息:", user2.ServerMsg)
			 else 
				fmt.Println("\\t\\t", user2.Username, ":", user2.Msg)
			
		
	()
	wg.Wait()

连接mysql实现新增操作

func main() 
	db,err:=sql.Open("mysql","root:197820@tcp(localhost:3306)/first")
	db.Ping()//真正的打开与mysql的连接
	//                                                        密码    协议    数据库所在的主机IP     端口   数据库名
	defer func()
		if db!=nil
			db.Close()
		
	()
	if err!=nil
		fmt.Println("数据库连接失败")
		return
	
	//2.预处理
	//?表示占位符
	stmt,err:=db.Prepare("insert into people values(default,?,?)")
	defer func()
		if stmt!=nil
			stmt.Close()
		
	()
	if err!=nil
		fmt.Println("预处理失败")
		return
	
	//参数和占位符一一对应
	r,err:=stmt.Exec("李四","北京")
	if err!=nil
		fmt.Println("sql执行失败")
		return
	
	//获取结果
   count,err:=r.RowsAffected()
   if err!=nil
   	fmt.Println("结果获取失败")
   	return
   
   if count>0
   	fmt.Println("新增成功")
   else
   	fmt.Println("新增失败")
   
   id,_:=r.LastInsertId()//获取主键
   fmt.Println(id)

连接mysql实现修改操作

func main() 
	db, _ := sql.Open("mysql", "root:197820@tcp(localhost:3306)/first")
	//db.Ping()
	defer func() 
		if db != nil 
			db.Close()
		
	()
	stmt, _ := db.Prepare("update people set name=?,address=? where id=?")
	defer func() 
		if stmt != nil 
			stmt.Close()
		
	()
	r, _ := stmt.Exec("冠军侯", "大唐", 1)
	count, _ := r.RowsAffected()
	if count > 0 
		fmt.Println("修改成功")
	 else 
		fmt.Println("修改失败")
	

连接mysql实现删除操作

func main() 
	db, _ := sql.Open("mysql", "root:197820@tcp(localhost:3306)/first")
	//db.Ping()
	defer func() 
		if db != nil 
			db.Close()
		
	()
	stmt, _ := db.Prepare("delete from people  where id=?")
	defer func() 
		if stmt != nil 
			stmt.Close()
		
	()
	r, _ := stmt.Exec("冠军侯", "大唐", 1)
	count, _ := r.RowsAffected()
	if count > 0 
		fmt.Println("删除成功")
	 else 
		fmt.Println("删除失败")
	

连接mysql实现数据查询

func main() 
	db, _ := sql.Open("mysql", "root:197820@tcp(localhost:3306)/first")
	//db.Ping()
	defer func() 
		if db != nil 
			db.Close()
		
	()
	stmt, _ := db.Prepare("select * from people")
	defer func() 
		if stmt != nil 
			stmt.Close()
		
	()
    rows, err := stmt.Query()//这里与上不同,这是Query()查询
	if err != nil 
		fmt.Println("获取结果失败")
		return
	
	defer func() 
		if rows != nil 
			rows.Close()
		
	()
    for rows.Next() //rows.Next()方法判断下一行是否存有数据,有的话指针会自动指向下一行
		var id int   //每次循环临时声明变量
		var name string
		var address string
		rows.Scan(&id, &name, &address) //读取数据库每一行的数据
		fmt.Println(id, name, address)
	
	defer func() 
		if rows != nil 
			rows.Close()
			fmt.Println("关闭结果集")
		
	()

web的多种请求方式

GET:向服务器请求资源地址

HEAD:只要求响应头

POST:直接返回响应内容

PUT:创建资源

DELETE:删除资源

TRACE:返回请求本身

OPTIONS:返回服务器支持HTTP方法列表

CONNECT:建立网络连接

PATCH:修改资源

简单的go web

func welcome(w http.ResponseWriter,r *http.Request)
	w.Header().Set("Content-TYPE","text/html;charset=utf-8") //设置响应头为html文本格式,浏览器会对此进行解析使得html代码可以生效
	fmt.Fprintln(w,"服务器返回的信息<b>加粗</b>") //在响应流中进行打印,即在浏览器页面

func main() 
	http.HandleFunc("/aaa", welcome)           //设置资源访问路径对应的函数
	http.ListenAndServe("localhost:8081", nil) //监听 服务器地址和端口号

//handler是处理一个请求的处理器,是接口

单控制器即ServeMux负责接受请求并把请求分发给处理器,即不同的访问地址交给不同的处理器进行响应

type MyHandler struct



func(m *MyHandler) ServeHTTP(w http.ResponseWriter,r *http.Request) 
	w.Write([]byte("返回的数据哈哈"))

func main() 
	h := MyHandler
	server := http.ServerAddr: "localhost:8090", Handler: &h//通过Server绑定端口和处理器
	server.ListenAndServe()

多处理器

type MyHandler struct


type MyHandle struct



func(m *MyHandle) ServeHTTP(w http.ResponseWriter,r *http.Request) 
	w.Write([]byte("222222"))


func(m *MyHandler) ServeHTTP(w http.ResponseWriter,r *http.Request) 
	w.Write([]byte("111111"))

func main() 
	h := MyHandler
	h2 := MyHandle
	server := http.ServerAddr: "localhost:8090"
	http.Handle("/first", &h)
	http.Handle("/second", &h2)
	server.ListenAndServe()

多函数

func first(w http.ResponseWriter,r *http.Request)
	fmt.Fprintln(w,"多函数1111")

func second(w http.ResponseWriter,r *http.Request)
	fmt.Fprintln(w,"多函数2222")

func main() 
	server := http.ServerAddr: "localhost:8090"
	http.HandleFunc("/first", first)
	http.HandleFunc("/second", second)
	server.ListenAndServe()

HTML静态模板

(w http.ResponseWriter,r *http.Request)
	fmt.Fprintln(w,"多函数1111")

func second(w http.ResponseWriter,r *http.Request)
	fmt.Fprintln(w,"多函数2222")

func main() 
	server := http.ServerAddr: "localhost:8090"
	http.HandleFunc("/first", first)
	http.HandleFunc("/second", second)
	server.ListenAndServe()

更多socket知识可以参考博客园,超详细

以上是关于socket,连接mysql等数据库操作,go web复习的主要内容,如果未能解决你的问题,请参考以下文章

Go 操作mysql使用举例---连接本地数据库

Go语言中mysql数据库操作

Go语言中mysql数据库操作

Go基础之--操作Mysql

Go操作MySQL

Go defer