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,连接mysql等数据库操作,go web复习的主要内容,如果未能解决你的问题,请参考以下文章