外出先でのネットワークプログラミング
サーバー側server.go
import "net"
// 为每一个客户端请求开启协程
func process(conn net.Conn) {
defer conn.Close() //关闭连接
for {
buf := make([]byte, 1024)
//等待读取conn里的client消息,如果没收到消息会阻塞,n代表读到的字节数
n,err := conn.Read(buf)
// 将收到的client信息打印,注意1:必须是Print因为从client读取时已带换行换行,真正读取的数据到n为止
fmt.Print(string(buf[:n]))
}
}
func main() {
// 服务器监听8000端口
listen, err = net.Listen("tcp", 0.0.0.0:8000)
defer listen.Close()
// 等待客户端连接
for {
conn, err = listen.Accept()
// 得到客户端的ip和port
ip_port := conn.RemoteAddr().string
go process(conn)
}
}
クライアントclient.go
import "net"
import "bufio"
func main() {
// server端的ip和port
conn, err = net.Dial("tcp", 192.168.1.10:8888)
// 客户端发送数据到服务器
// ①:client先从终端获取标准输入
reader,err := bufio.NewReader(os.Stdin)
line,err := reader.ReadString('\n') // 以换行作为终止标志
// ②:将读取的数据发给server,参数是byte类型的切片,返回的是字符串
n,err := conn.Write([]byte(line))
fmt.Printf("发送给server的数据:%v", n)
}
Redisの
-
デフォルトのポート6379
-
データベースの切り替え:1を選択
-
データの追加:セット名をデフォルトでデータベースに追加AMBER 0
-
flushdb:現在のデータベースをクリア
-
flushall:すべてのデータベースをクリア
-
デル名:データのセットを削除します。
-
10歳のアンバーMSET名前:同時に複数の値を設定します
-
MGET名の年齢:同時に複数の値を取得
-
オブジェクトのハッシュ割り当て:HSET USER1名アンバー
-
hget USER1「名前」:オブジェクトのハッシュ値を取得します。
-
hgetall USER1:ハッシュは、一度、すべての情報を取得します
-
hmset user2の名前「ルーシー」44歳の仕事の「Java」:すべて一度にハッシュ割り当て
-
hmget user2の名の年齢:より多くのフェッチハッシュ
-
いくつかの属性を設定し、ハッシュ・ビュー・オブジェクト:HLENはuser2
-
hexistユーザー名:ハッシュオブジェクトが指定したフィールドを持つかどうかをチェックします
Redisのリスト:キー値が複数に対応することができます
- 挿入リスト(左):hpush NUM 1 2 3
- リストの挿入(右):rpush num個1 2 3
- リストは、すべてを取得します:LRANGE 0 -1
- リストのポップアップ(左端):LPOP NUM
- リストのポップアップ(右端):RPOP NUM
- 削除リスト:デルNUM
- リストの長さ:llen NUM
Redisのセット:無秩序
- インサート:マイク・ベラSADD名アンバー
- さらに、挿入された:SADD名マイクが失敗を追加するよう求め
- 表示:smembers名
- sismember名マイク:指定されたキーデータが存在するかどうか確認してください
- SREM名のベラ:指定されたデータベラを削除します
Redisの接続を行きます
import "github.com/xxx/redis"
func main() {
// go连接redis
conn,er := redis.Dial("tcp", "192.168.1.10:6379")
defer conn.Close()
// 向redis写入数据,返回值是空接口类型,set首字母大小写随意
_,err = conn.Do("set", "name", "amber")
// res对应的是空接口类型,需要类型转换
res,err := redis.String(conn.Do("get", "name"))
// 上述的set/get均可更换成hset/hget等方式
}
Redisの接続プールの
定義:による閉鎖へのリソースの消費を削減しながら、クライアントは、接続を要求する場合、接続プールから直接それぞれが利用でき、閉じられていない、複数の接続プールCONNを作成
import "github.com/xxx/redis"
var pool *redis.Pool //定义全局pool
// 程序启动时初始化连接池
func init() {
pool = &redis.Pool{
MaxIdle : 8, //最大空闲数
MaxActice : 0, //最大连接数,0代表不限制
IdleTimeout : 100, //中断连接超过100s,放回连接池
Dial : func() (redis.Conn{}, err){
return redis.Dial("tcp", "192.168.1.10:6379") //初始化连接,指定主机
}
}
}
func main() {
// 从pool取出连接
conn := pool.Get()
defer conn.Close()
_, err := conn.Do("set", "name", "amber")
r, err := redis.String(conn.Do("get", "name"))
fmt.Println("name=", r)
}
// pool要始终保持开启,不可关闭