成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > Golang Socket Server自定義協(xié)議的簡單實現(xiàn)方案

Golang Socket Server自定義協(xié)議的簡單實現(xiàn)方案

熱門標(biāo)簽:江蘇呼叫中心外呼系統(tǒng)有效果嗎 貴州電話智能外呼系統(tǒng) 谷歌美發(fā)店地圖標(biāo)注 400開頭電話怎樣申請 利用地圖標(biāo)注位置 杭州人工智能電銷機(jī)器人費用 官渡電銷外呼管理系統(tǒng)怎么收費 地圖區(qū)域圖標(biāo)注后導(dǎo)出 赤峰電銷

在Server和Client通訊中,由于網(wǎng)絡(luò)等原因很可能會發(fā)生數(shù)據(jù)丟包的現(xiàn)象。如果數(shù)據(jù)缺失,服務(wù)端接收的信息不完整,就會造成混亂。

我們需要在Server和Client之間建立一個通訊協(xié)議,通過協(xié)議中的規(guī)則,判斷當(dāng)前接收到的信息是否完整。根據(jù)信息的完整情況,采取不同的處理方式。

通訊協(xié)議protocol的核心就是設(shè)計一個頭部。如果傳來的信息不包含這個頭部,就說明當(dāng)前信息和之前的信息是同一條。那么就把當(dāng)前信息和之前的那條信息合并成一條。

而協(xié)議主要包含的功能是封裝(Enpack)和解析(Depack)。Enpack是客戶端對信息進(jìn)行數(shù)據(jù)封裝。封裝之后可以傳遞給服務(wù)器。Depack是服務(wù)器對信息進(jìn)行數(shù)據(jù)解析。

其中有個Const部分,用于定義頭部、頭部長度、客戶端傳入信息長度。

在代碼中,我們這樣定義:

const (
 ConstHeader = "Headers"
 ConstHeaderLength = 7
 ConstMLength = 4
)

頭部的內(nèi)容為"Headers",長度為7。所以ConstHeaderLenth=7.

而信息傳遞過程中,我們會把int類型轉(zhuǎn)換成byte類型。一個int的長度等于4個byte的長度。因此,我們設(shè)置ConstMLength=4.代表客戶端的傳來的信息大小。

自定義協(xié)議protocal的代碼示例如下:

/**
* protocol
* @Author: Jian Junbo
* @Email: junbojian@qq.com
* @Create: 2017/9/14 11:49
*
* Description: 通訊協(xié)議處理
*/
package protocol 
import (
 "bytes"
 "encoding/binary"
)
 
const (
 ConstHeader = "Headers"
 ConstHeaderLength = 7
 ConstMLength = 4
)
 
//封包
func Enpack(message []byte) []byte {
 return append(append([]byte(ConstHeader), IntToBytes(len(message))...), message...)
}
 
//解包
func Depack(buffer []byte) []byte {
 length := len(buffer)
 
 var i int
 data := make([]byte, 32)
 for i = 0; i  length; i++ {
 
  if length  i + ConstHeaderLength + ConstMLength{
   break
  }
  if string(buffer[i:i+ConstHeaderLength]) == ConstHeader {
   messageLength := ByteToInt(buffer[i+ConstHeaderLength : i+ConstHeaderLength+ConstMLength])
   if length  i+ConstHeaderLength+ConstMLength+messageLength {
    break
   }
   data = buffer[i+ConstHeaderLength+ConstMLength : i+ConstHeaderLength+ConstMLength+messageLength]
  }
 }
 
 if i == length {
  return make([]byte, 0)
 } 
 return data
}
 
//字節(jié)轉(zhuǎn)換成整形
func ByteToInt(n []byte) int {
 bytesbuffer := bytes.NewBuffer(n)
 var x int32
 binary.Read(bytesbuffer, binary.BigEndian, x) 
 return int(x)
}
 
//整數(shù)轉(zhuǎn)換成字節(jié)
func IntToBytes(n int) []byte {
 x := int32(n)
 bytesBuffer := bytes.NewBuffer([]byte{})
 binary.Write(bytesBuffer, binary.BigEndian, x)
 return bytesBuffer.Bytes()
}

Server端主要通過協(xié)議來解析客戶端發(fā)送來的信息。建立一個函數(shù),用來完成連接對接收信息的處理。其中建立了通道readerChannel,并把接收來的信息放在通道里。

在放入通道之前,使用protocol和Depack對信息進(jìn)行解析。

//連接處理
func handleConnection(conn net.Conn) {
 //緩沖區(qū),存儲被截斷的數(shù)據(jù)
 tmpBuffer := make([]byte, 0)
 //接收解包
 readerChannel := make(chan []byte, 10000)
 go reader(readerChannel)
 
 buffer := make([]byte, 1024)
 for{
  n, err := conn.Read(buffer)
  if err != nil{
   Log(conn.RemoteAddr().String(), "connection error: ", err)
   return
  }
  tmpBuffer = protocol.Depack(append(tmpBuffer, buffer[:n]...))
  readerChannel - tmpBuffer  //接收的信息寫入通道
 
 }
 defer conn.Close()
}

如果信息讀取發(fā)生錯誤(包括讀取到信息結(jié)束符EOF),都會打印錯誤信息,并跳出循環(huán)。

Log(conn.RemoteAddr().String(), "connection error: ", err)

return

由于通道內(nèi)的數(shù)據(jù)是[]byte型的。需要轉(zhuǎn)換成string。這個工作有專門的獲取通道數(shù)據(jù)的reader(readerChannel chan []byte)來完成。

//獲取通道數(shù)據(jù)
func reader(readerchannel chan []byte) {
 for{
  select {
  case data := -readerchannel:
   Log(string(data))  //打印通道內(nèi)的信息
  }
 }
}

查看Server端代碼示例:

/**
* MySocketProtocalServer
* @Author: Jian Junbo
* @Email: junbojian@qq.com
* @Create: 2017/9/14 13:54
* Copyright (c) 2017 Jian Junbo All rights reserved.
*
* Description: 服務(wù)端,接收客戶端傳來的信息
*/
package main 
import (
 "net"
 "fmt"
 "os"
 "log"
 "protocol"
)
 
func main() {
 netListen, err := net.Listen("tcp", "localhost:7373")
 CheckErr(err)
 defer netListen.Close()
 
 Log("Waiting for client ...")  //啟動后,等待客戶端訪問。
 for{
  conn, err := netListen.Accept()  //監(jiān)聽客戶端
  if err != nil {
   Log(conn.RemoteAddr().String(), "發(fā)了了錯誤:", err)
   continue
  }
  Log(conn.RemoteAddr().String(), "tcp connection success")
  go handleConnection(conn)
 }
}
 
//連接處理
func handleConnection(conn net.Conn) {
 //緩沖區(qū),存儲被截斷的數(shù)據(jù)
 tmpBuffer := make([]byte, 0)
 //接收解包
 readerChannel := make(chan []byte, 10000)
 go reader(readerChannel)
 
 buffer := make([]byte, 1024)
 for{
  n, err := conn.Read(buffer)
  if err != nil{
   Log(conn.RemoteAddr().String(), "connection error: ", err)
   return
  }
  tmpBuffer = protocol.Depack(append(tmpBuffer, buffer[:n]...))
  readerChannel - tmpBuffer  //接收的信息寫入通道 
 }
 defer conn.Close()
}
 
//獲取通道數(shù)據(jù)
func reader(readerchannel chan []byte) {
 for{
  select {
  case data := -readerchannel:
   Log(string(data))  //打印通道內(nèi)的信息
  }
 }
}
 
//日志處理
func Log(v ...interface{}) {
 log.Println(v...)
}
 
//錯誤處理
func CheckErr(err error) {
 if err != nil {
  fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())
  os.Exit(1)
 }
}

客戶端使用Enpack封裝要發(fā)送到服務(wù)端的信息后,寫入連接conn中。

/**
* MySocketProtocalClient
* @Author: Jian Junbo
* @Email: junbojian@qq.com
* @Create: 2017/9/14 15:23
* Copyright (c) 2017 Jian Junbo All rights reserved.
*
* Description: 
*/
package main 
import (
 "net"
 "time"
 "strconv"
 "protocol"
 "fmt"
 "os"
)
 
//發(fā)送100次請求
func send(conn net.Conn) {
 for i := 0; i  100; i++ {
  session := GetSession()
  words := "{\"ID\":\""+strconv.Itoa(i)+"\",\"Session\":\""+session+"20170914165908\",\"Meta\":\"golang\",\"Content\":\"message\"}"
  conn.Write(protocol.Enpack([]byte(words)))
  fmt.Println(words)  //打印發(fā)送出去的信息
 }
 fmt.Println("send over")
 defer conn.Close()
}
//用當(dāng)前時間做識別。當(dāng)前時間的十進(jìn)制整數(shù)
func GetSession() string {
 gs1 := time.Now().Unix()
 gs2 := strconv.FormatInt(gs1, 10)
 return gs2
}
 
func main() {
 server := "localhost:7373"
 tcpAddr, err := net.ResolveTCPAddr("tcp4", server)
 if err != nil{
  fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())
  os.Exit(1)
 }
 
 conn, err := net.DialTCP("tcp", nil, tcpAddr)
 if err != nil{
  fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())
  os.Exit(1)
 }
 
 fmt.Println("connect success") 
 send(conn) 
}

補充:golang從0到1利用socket編程實現(xiàn)一個簡單的http服務(wù)器

開始編程

第一份代碼

package main
import (
	"fmt"
	"net"
)
func accept_request_thread(conn net.Conn) {
	defer conn.Close()
	for {
		// 創(chuàng)建一個新切片, 用作保存數(shù)據(jù)的緩沖區(qū)
		buf := make([]byte, 1024)
		n, err := conn.Read(buf) // 從conn中讀取客戶端發(fā)送的數(shù)據(jù)內(nèi)容
		if err != nil {
			fmt.Printf("客戶端退出 err=%v\n", err)
			return
		}
		fmt.Printf(" 接受消息 %s\n", string(buf[:n]))
	}
}
func main() {
	listen, err := net.Listen("tcp", ":8888") // 創(chuàng)建用于監(jiān)聽的 socket
	if err != nil {
		fmt.Println("listen err=", err)
		return
	}
	fmt.Println("監(jiān)聽套接字,創(chuàng)建成功, 服務(wù)器開始監(jiān)聽。。。")
	defer listen.Close() // 服務(wù)器結(jié)束前關(guān)閉 listener
	// 循環(huán)等待客戶端來鏈接
	for {
		fmt.Println("阻塞等待客戶端來鏈接...")
		conn, err := listen.Accept() // 創(chuàng)建用戶數(shù)據(jù)通信的socket
		if err != nil {
			fmt.Println("Accept() err=", err)
		} else {
			fmt.Println("通信套接字,創(chuàng)建成功。。。")
		}
		// 這里準(zhǔn)備起一個協(xié)程,為客戶端服務(wù)
		go accept_request_thread(conn)
	}
}

瀏覽器發(fā)送一個get請求:

http://192.168.0.20:8888/api/camera/get_ptz?camera_id=1324566666789876543

服務(wù)端接受到的消息如下:

http://192.168.0.20:8888/api/camera/get_ptz?camera_id=1324566666789876543

我們接下來的任務(wù)就是 解析這些字符串,從中獲取 當(dāng)前是什么方法,什么請求,參數(shù)是什么?

先定義一個小目標(biāo),獲取當(dāng)前是什么方法。

處理一個簡單的get請求

package main
import (
	"encoding/json"
	"fmt"
	"log"
	"net"
	"strings"
)
func unimplemented(conn net.Conn){
	var buf string
	buf = "HTTP/1.0 501 Method Not Implemented\r\n"
	_, _ = conn.Write([]byte(buf))
	buf = "Server: httpd/0.1.0\r\n"
	_, _ = conn.Write([]byte(buf))
	buf = "Content-Type: text/html\r\n"
	_, _ = conn.Write([]byte(buf))
	buf = "\r\n"
	_, _ = conn.Write([]byte(buf))
	buf = "HTML>HEAD>TITLE>Method Not Implemented\r\n"
	_, _ = conn.Write([]byte(buf))
	buf = "/TITLE>/HEAD>\r\n"
	_, _ = conn.Write([]byte(buf))
	buf = "BODY>P>HTTP request method not supported.\r\n"
	_, _ = conn.Write([]byte(buf))
	buf = "/BODY>/HTML>\r\n"
	_, _ = conn.Write([]byte(buf))
}
func accept_request_thread(conn net.Conn) {
	defer conn.Close()
	var i int
	buf := make([]byte, 1024)
	n, err := conn.Read(buf) // 從conn中讀取客戶端發(fā)送的數(shù)據(jù)內(nèi)容
	if err != nil {
		fmt.Printf("客戶端退出 err=%v\n", err)
		return
	}
	// 獲取方法
	i = 0
	var method_bt strings.Builder
	for(i  n  buf[i] != ' '){
		method_bt.WriteByte(buf[i])
		i++;
	}
	method := method_bt.String()
	if(method != "GET"){
		unimplemented(conn)
		return
	}
	for(i  n  buf[i] == ' '){
		i++
	}
	//api/camera/get_ptz?camera_id=1324566666789876543
	var url_bt strings.Builder
	for(i  n  buf[i] != ' '){
		url_bt.WriteByte(buf[i])
		i++;
	}
	url := url_bt.String()
	if(method == "GET"){
		//url ---> /api/camera/get_ptz?camera_id=1324566666789876543
		// 跳到第一個?
		var path, query_string string
		j := strings.IndexAny(url, "?")
		if(j != -1){
			path = url[:j]
			if(j + 1  len(url)){
				query_string = url[j+1:]
			}
		}else{
			path = url
		}
		fmt.Print(path + "請求已經(jīng)創(chuàng)建\t")
		resp := execute(path, query_string)// =1324566666789876543
		fmt.Println("返回", string(resp))
		header(conn, "application/json", len(resp));
		_ , err := conn.Write(resp)
		if(err != nil){
			fmt.Println(err)
		}
	}
}
//回應(yīng)客戶端必須先設(shè)置好head頭,瀏覽器才能解析
func header(conn net.Conn, content_type string , length int ) {
	var buf string
	buf = "HTTP/1.0 200 OK\r\n"
	_, _ = conn.Write([]byte(buf))
	buf = "Server: httpd/0.1.0\r\n"
	_, _ = conn.Write([]byte(buf))
	buf = "Content-Type: " + content_type + "\r\n"
	_, _ = conn.Write([]byte(buf))
	_, _ = fmt.Sscanf(buf, "Content-Length: %d\r\n", length)
	buf = "Content-Type: " + content_type + "\r\n"
	_, _ = conn.Write([]byte(buf))
	buf = "\r\n"
	_, _ = conn.Write([]byte(buf))
}
func execute(path string, query_string string) ([]byte) {
	query_params := make(map[string]string)
	parse_query_params(query_string, query_params)
	if("/api/camera/get_ptz" == path){
		/*
		 * do something
		 */
		camera_id := query_params["camera_id"]
		resp := make(map[string]interface{})
		resp["camera_id"] = camera_id
		resp["code"] = 200
		resp["msg"] = "ok"
		rs, err := json.Marshal(resp)
		if err != nil{
			log.Fatalln(err)
		}
		return rs
	}else if("get_abc" == path){
		/*
		 * do something
		 */
		return []byte("abcdcvfdswa")
	}
	return []byte("do't match")
}
/*map作為函數(shù)入?yún)⑹亲鳛橹羔樳M(jìn)行傳遞的
函數(shù)里面對map進(jìn)行修改時,會同時修改源map的值,但是將map修改為nil時,則達(dá)不到預(yù)期效果。*/
// camera_id=1324566666789876543tt=%E5%88%9B%E5%BB%BA%E6%88%90%E5%8A%9F
func parse_query_params(query_string string, query_params map[string]string) {
	kvs := strings.Split(query_string, "")
	if(len(kvs) == 0){
		return
	}
	for _, kv := range kvs {
		kv := strings.Split(kv, "=")
		if(len(kv) != 2){
			continue
		}
		query_params[kv[0]] = kv[1]
	}
}
func main() {
	listen, err := net.Listen("tcp", ":8888") // 創(chuàng)建用于監(jiān)聽的 socket
	if err != nil {
		fmt.Println("listen err=", err)
		return
	}
	fmt.Println("監(jiān)聽套接字,創(chuàng)建成功, 服務(wù)器開始監(jiān)聽。。。")
	defer listen.Close() // 服務(wù)器結(jié)束前關(guān)閉 listener
	// 循環(huán)等待客戶端鏈接
	for {
		fmt.Println("阻塞等待客戶端鏈接...")
		conn, err := listen.Accept() // 創(chuàng)建用戶數(shù)據(jù)通信的socket
		if err != nil {
			panic("Accept() err= " + err.Error())
		}
		// 這里準(zhǔn)備起一個協(xié)程,為客戶端服務(wù)
		go accept_request_thread(conn)
	}
}

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • golang 實現(xiàn)tcp server端和client端,并計算RTT時間操作
  • golang實現(xiàn)微信小程序商城后臺系統(tǒng)(moshopserver)
  • golang實現(xiàn)http server提供文件下載功能
  • 深入理解Golang之http server的實現(xiàn)
  • golang的httpserver優(yōu)雅重啟方法詳解

標(biāo)簽:松原 宜春 泰安 河池 武漢 鷹潭 保定 黔西

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Golang Socket Server自定義協(xié)議的簡單實現(xiàn)方案》,本文關(guān)鍵詞  Golang,Socket,Server,自定義,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Golang Socket Server自定義協(xié)議的簡單實現(xiàn)方案》相關(guān)的同類信息!
  • 本頁收集關(guān)于Golang Socket Server自定義協(xié)議的簡單實現(xiàn)方案的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    宅男深夜视频| 精品中文字幕一区| 噜噜噜久久亚洲精品国产品麻豆| 亚洲精品一区三区三区在线观看| 女生裸体视频网站免费观看| 亚洲精品小视频在线观看| 久久精品女人天堂av免费观看| 五月天婷婷激情网| 国产精品99久久久久久久久久久久| 影视先锋av在线| 久久久久久久亚洲| 高清不卡一区二区在线| 午夜在线播放视频欧美| 高清av免费看| 国产成人黄色| 欧美aaa大片| 亚洲欧美另类视频| 午夜两性免费视频| 高清av不卡| 国产日本欧美一区| 性色av一区| 91中文精品字幕在线视频| 成人激情久久| av资源吧首页| 日韩小视频在线| 精品国产精品国产偷麻豆| 国产伦一区二区| 成年人免费大片| 九九大香尹人视频免费| 国产精品av久久久久久无| 亚洲福利在线视频| 一本一道久久a久久综合蜜桃| 亚洲色图欧美制服丝袜另类第一页| 奇米影视第四狠狠777| 国产精品美女久久久久久久网站| 欧美午夜国产| 性欧美成人播放77777| 717成人午夜免费福利电影| 欧美交换配乱吟粗大25p| 日韩视频在线观看国产| 99久久国产免费看| 福利av痴女| 日韩精品电影一区二区三区| 久久久久久穴| 国精产品一区一区三区视频| 成人免费视频国产在线观看| 在线丨暗呦小u女国产精品| 在线观看欧美日韩| 日韩欧美视频一区二区三区| 欧美色中文字幕| 一级黄色片日本| 国产性猛交╳xxx乱大交| 日本高清免费电影一区| 国产伦精品一区二区三区四区视频| 精品中文视频| 中文字幕在线不卡视频| 最新欧美色图| 91精品中文字幕| 日韩一区二区欧美| 欧美日韩综合| 成人au免费视频影院| 欧美三级中文字| 一级片免费在线观看视频| 日本三级午夜理伦三级三| 男同在线观看| 一区二区三区四区五区| 东方欧美亚洲色图在线| 4438x全国最大成人| 四虎国产精品成人免费4hu| 视频一区二区三区免费观看| 丰满的少妇愉情hd高清果冻传媒| 欧美精品欧美精品| 717影院理论午夜伦不卡久久| 亚洲成人手机在线| 亚洲午夜视频| 亚洲人成电影院在线观看| 日本高清不卡三区| 美女mm1313爽爽久久久蜜臀| 亚洲影视九九影院在线观看| 色婷婷综合在线观看| 日韩av不卡在线观看| 亚洲男人天堂| 久久成人在线观看| 成年人黄视频在线观看| 天堂中文字幕——hd| 视频一区视频二区在线观看| 免费福利在线观看| 成人三级视频在线播放| 精品久久国产97色综合| 91社区在线| 久久久久久国产精品免费免费| 亚洲欧美日韩一区在线观看| 午夜大尺度福利视频| 在线视频尤物| 国产亚洲精品美女久久久| 亚洲巨乳在线| 无人区乱码一区二区三区| 黑人巨大精品欧美一区二区小视频| 成人午夜剧场视频网站| 日本老师69xxx| 在线精品一区二区三区| 久久精品亚洲成在人线av网址| 开心九九激情九九欧美日韩精美视频电影| 国产小视频在线高清播放| 黄色仓库视频网站| 91精品专区| 日韩欧美精品综合| 伊人伊成久久人综合网站| 精品一区二区国产| 成人中文字幕+乱码+中文字幕| 中文字幕不卡在线观看| 国产区视频在线观看| 中文字幕人妻一区二区三区视频| 免费人成福利播放| 激情综合视频| 麻豆视频在线| 91香蕉国产在线观看| 亚洲一区亚洲二区| 99热这里只有精品5| 免费在线观看av电影| 亚洲欧美手机在线| 欧美精品日韩三级| 在线看成人av电影| 国产精品成av人在线视午夜片| 亚洲天堂偷拍| 成人性爱视频在线观看| 日韩免费观看av| 国产精品你懂的在线观看| 91小视频在线免费看| jazzjazz国产精品麻豆| 久热精品在线观看视频| 一区二区不卡在线观看| av毛片免费看| 91精品国产亚洲| 96亚洲精品久久久蜜桃| 紧身裙女教师波多野结衣| 亚洲成人av免费看| 116美女写真午夜一级久久| 亚洲第一激情av| 伊人久久大香线蕉av一区二区| 一级黄在线观看| 亚洲第一综合网站| 亚洲精品视频免费| 国产精品高潮呻吟av| 国产精品久久久久久久久男| 久久久久久久久久久影视| 91国产一区在线| 51精品国自产在线| 国产欧美日本一区二区三区| 亚洲人午夜精品免费| 亚洲视频你懂的| 久草免费福利在线| 久久国产精品99久久久久久丝袜| 国产一区二区三区不卡在线观看| 国产精品免费观看久久| 老熟女高潮一区二区三区| 亚洲成av人电影| 欧美一级本道电影免费专区| 欧美阿v一级看视频| 久久国产精品免费一区| 日韩精品视频免费专区在线播放| 小毛片在线观看| 搡的我好爽在线观看免费视频| 欧美日韩一区二区三区高清| 精品国产欧美成人夜夜嗨| 精品视频网站| 国产一区二三区| 蜜桃精品在线观看| 亚洲va欧美va人人爽| 经典三级在线一区| 精品三区视频| 免费黄色av电影| 亚洲午夜在线播放| 在线天堂www在线国语对白| 国产欧美日韩另类视频免费观看| 91精品一区二区三区在线观看| 久久国产免费看| 久久激情一区| 涩涩视频在线观看免费| 99xxxx成人网| 国产精品二区一区二区aⅴ污介绍| 国产免费黄色小视频| 黄色成人在线视频| 欧美精品国产精品日韩精品| 石原莉奈在线亚洲三区| 大又大又粗又硬又爽少妇毛片| 亚洲一区二区国产| 国产无套在线观看| 欧美亚州韩日在线看免费版国语版| 鲁一鲁一鲁一鲁一澡| 性欧美videos另类喷潮| 日韩一区有码在线| 一区二区三区久久久| 麻豆精品在线观看| 国产一区二区视频免费观看| 亚洲av无码一区二区三区观看| 亚洲欧美影院| 一区二区三区视频在线播放| 一个色在线视频| 国产精品久久久久久久app| 精品人妻一区二区三区日产乱码| 天堂电影一区| 亚洲欧美经典视频| 久久精品二区三区| 男人午夜视频在线观看| 美腿丝袜亚洲色图| 亚洲精品国产福利| caopeng在线| 日韩五码在线| 亚洲成人av一区二区三区| 国产成人一区二区三区小说| 99精品国产一区二区三区不卡| 成人漫画网站免费| 欧美专区在线| 精品免费囯产一区二区三区| av电影在线免费观看| 一区二区三区四区在线视频| 91国语精品自产拍在线观看性色| 亚洲国产婷婷香蕉久久久久久99| 又黄又爽在线免费观看| 亚洲一区二区三区精品动漫| 国产精品91一区二区三区| 淫视频在线观看| 亚洲人成电影在在线观看网色| 久久久久久不卡| 91官网在线观看| www.爱色av.com| 国产无码精品在线播放| 99热国产在线| 欧美日韩在线一区| 久久久精品国产网站| 欧美日韩免费观看一区三区| 中文字幕日韩一区二区三区不卡| 日本欧美加勒比视频| 精品视频偷偷看在线观看| 久久av免费观看| 亚洲免费电影在线| 欧美日韩国产成人高清视频| 日韩视频一区在线观看| 黄色日本网站| 黄无遮挡免费网站| 伊人网伊人影院| 操欧美老女人| 91麻豆精品国产91久久久更新资源速度超快| 日韩欧美的一区| 精品欧美色视频网站在线观看| 忘忧草精品久久久久久久高清| 中国女人一级一次看片| 国产97人人超碰caoprom| 日本欧美在线视频| 中文有码在线播放| x88av在线| 国产精品视频免费一区二区三区| 污污软件在线观看| 亚洲精品福利在线| 日韩欧美在线综合| 全部孕妇毛片丰满孕妇孕| 欧美特级一级片| 91在线精品一区二区| 欧美在线免费一级片| 久久久久久91| 亚洲欧美一区二区精品久久久| 含羞草激情视频| va亚洲va日韩不卡在线观看| 丁香六月激情婷婷| 国产成人一区二区三区影院在线| 在线观看你懂的视频| 992kp快乐看片永久免费网址| 成人午夜激情影院| 一区二区三区韩国免费中文网站| www.成人在线观看| 亚洲成人中文在线| 日韩夫妻性生活xx| 欧美裸体在线版观看完整版| 成人日韩在线电影| 国产日韩精品在线观看| 嗯~啊~轻一点视频日本在线观看| 日韩区一区二| 激情五月宗合网| 怡红院av在线| 日本阿v视频在线观看| 精品免费国产| 电影一区二区在线观看| 欧美性xxxx69| 91亚洲国产高清| 中文字幕永久免费视频| 五月天婷婷激情网| 高h调教冰块play男男双性文| 国产日韩视频在线播放| 26uuu国产在线精品一区二区| 成人性视频免费看| 久久久天天操| 久国产精品视频| 欧美无毛视频| 日韩欧美精品免费| 搡的我好爽在线观看免费视频| 国产区高清在线| 久久亚区不卡日本| 日韩在线综合| av在线综合网| 国产精品国内免费一区二区三区| 欧美日韩中文在线视频| 老司机免费视频| 天堂在线一二区| 亚洲精品国产精品国产自| 殴美一级黄色片| 99精品国产一区二区青青牛奶| 国产精品久久福利| 欧美专区国产专区| 欧美日韩高清区| 国产精品91av| 国产精品午夜影院| 日韩欧美在线综合| 伊人影院在线播放| 蜜桃av免费在线观看| 久久久久久久久久久视频| 一级片在线观看视频| 狠狠鲁狠狠操| 亚洲综合成人在线| 亚洲综合国产精品| 99精品国产视频| 久久天天东北熟女毛茸茸| 亚洲小视频在线| 欧美在线精品免播放器视频| 91色在线播放| 免费在线观看的电影网站| 国产sm精品调教视频网站| 日韩精品有码在线观看|