Golang编程:网络通信与Socket实践
发表时间: 2022-12-27 10:04
Socket通信
标准库的net包中提供了可移植的网络I/O接口,Socket在TCP/IP网络分层中并不存在,是对TCP/UDP的封装,Socket是实现网络上双向通讯连接的一套API,常称为套接字。
Socket分类:按照连接时间:短连接、长连接;按照客户端和服务端数量:点对点、点对多、多对多。
案例(服务端)
package mainimport ( "fmt" "net")func main() { // Socket通信 // 11111、创建服务器地址 // 创建TCPAddress变量,指定协议tcp4,监听本机8899端口 addr, _ := net.ResolveTCPAddr("tcp4", "localhost:8899") // 22222、创建服务器监听 // 监听TCPAddress设定的地址 server, _ := net.ListenTCP("tcp4", addr) // 最后关闭监听 defer server.Close() // server,_ := net.Listen("tcp","0.0.0.0:8888") fmt.Println("服务器已启动...") // 阻塞式等待客户端消息,返回连接对象,用于接收客户端消息或向客户端发送消息 for { // 33333、接收客户端传递过来的数据 conn, _ := server.Accept() // 44444、转换数据 go func() { // 把数据读取到切片 b := make([]byte, 256) fmt.Println("read之前") count, _ := conn.Read(b) fmt.Println("接收到的数据为:", string(b[:count])) // 发送数据 conn.Write([]byte("我是服务器端")) // 55555、关闭客户端连接 conn.Close() }() } fmt.Println("服务器结束")}
案例(客户端)
package mainimport ( "fmt" "net")func main() { // 客户端 // 1、创建服务器端地址 addr, _ := net.ResolveTCPAddr("tcp4", "127.0.0.1:8899") // 2、创建连接 conn, _ := net.DialTCP("tcp", nil, addr) // 3、发送数据 conn.Write([]byte("hello")) b := make([]byte, 255) count, _ := conn.Read(b) fmt.Println("接收数据为:", string(b[:count])) // 4、关闭连接 conn.Close()}
数据库连接
驱动包,任何编程语言想要连接数据库必须由数据库生成厂商提供统一编数据库调用而开发的内容。Golang的MySQL驱动包:go get
github.com/go-sql-driver/mysql;go mod。
案例
package mainimport ( "database/sql" "fmt" // 此处一定要导入驱动 _ "github.com/go-sql-driver/mysql")func main() { // 数据库连接 // 1、打开连接 db, err := sql.Open("mysql", "root:123456@tcp(localhost:3306)/golang") // 真正的连接 db.Ping() defer func() { if db != nil { db.Close() } }() if err != nil { fmt.Println("数据库连接失败!") return } // 2、预处理SQL 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 } // 3、获取结果 rows, err := r.RowsAffected() if err != nil { fmt.Println("获取结果失败!") return } if rows > 0 { fmt.Println("新增成功~") } else { fmt.Println("新增失败~") } // 获取新增主键的值 id, err := r.LastInsertId() if err != nil { fmt.Println("获取ID失败!") } else { fmt.Println("插入数据的主键ID为:", id) }}
create database golang;create table `people`( id int primary key auto_increment, `name` varchar(20), address varchar(20));
案例2
package mainimport ( "database/sql" "fmt" // 此处一定要导入驱动 _ "github.com/go-sql-driver/mysql")func main() { // 数据库连接 // 修改操作,修改是否成功,通过:RowsAffected()返回0 // 1、创建连接 db, err := sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/golang") db.Ping() // 真正去连接 defer func() { if db != nil { db.Close() } }() if err != nil { fmt.Println("获取数据库连接失败.", err) return } // 2、创建预处理 stmt, err := db.Prepare("update people set name=?,address=? where id=?") defer func() { if stmt != nil { stmt.Close() } }() if err != nil { fmt.Println("创建预处理失败.", err) return } // 3、执行预处理 r, err := stmt.Exec("李四", "丰台", 2) if err != nil { fmt.Println("执行预处理失败.", err) return } rows, err := r.RowsAffected() if err != nil { fmt.Println("修改错误.", err) } if rows > 0 { fmt.Println("修改成功.") } else { fmt.Println("修改失败.") }}
案例3
package mainimport ( "database/sql" "fmt" // 此处一定要导入驱动 _ "github.com/go-sql-driver/mysql")func main() { // 数据库连接 // 数据删除,如果数据不存在,RowsAffected()返回0 // 1、创建连接 db, err := sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/golang") db.Ping() // 真正去连接 defer func() { if db != nil { db.Close() } }() if err != nil { fmt.Println("获取数据库连接失败.", err) return } // 2、创建预处理 stmt, err := db.Prepare("delete from people where id=?") defer func() { if stmt != nil { stmt.Close() } }() if err != nil { fmt.Println("创建预处理失败.", err) return } // 3、执行预处理 r, err := stmt.Exec(2) if err != nil { fmt.Println("执行预处理失败.", err) return } rows, err := r.RowsAffected() if err != nil { fmt.Println("删除错误.", err) } if rows > 0 { fmt.Println("删除成功.") } else { fmt.Println("删除失败.") }}
案例4
package mainimport ( "database/sql" "fmt" // 此处一定要导入驱动 _ "github.com/go-sql-driver/mysql")func main() { // 数据库连接 // 查询, stmt调用的是Query()方法 // 1、创建连接 db, err := sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/golang") db.Ping() // 真正去连接 defer func() { if db != nil { db.Close() } }() if err != nil { fmt.Println("获取数据库连接失败.", err) return } // 2、创建预处理 stmt, err := db.Prepare("select * from people") defer func() { if stmt != nil { stmt.Close() } }() if err != nil { fmt.Println("创建预处理失败.", err) return } // 3、执行预处理 rows, err := stmt.Query() if err != nil { fmt.Println("查询失败.", err) return } // 循环便利结果 for rows.Next() { var id int var name, address string rows.Scan(&id, &name, &address) fmt.Println(id, name, address) } defer func() { if rows != nil { rows.Close() fmt.Println("关闭结果集") } }()}