精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

淺析C#中的套接字編程

開發 后端
本文向大家初步介紹了套接字的基本概念和實現套接字編程的基本原理,還通過一個很好的實例向大家展示了在C#下進行套接字編程的實現方法和一些編程技巧。

C#是微軟隨著VS.net新推出的一門語言。它作為一門新興的語言,有著C++的強健,又有著VB等的RAD特性。而且,微軟推出C#主要的目的是為了對抗Sun公司的Java。大家都知道Java語言的強大功能,尤其在網絡編程方面。于是,C#在網絡編程方面也自然不甘落后于人。本文就向大家介紹一下C#下實現套接字(Sockets)編程的一些基本知識,以期能使大家對此有個大致了解。首先,我向大家介紹一下套接字的概念。

套接字基本概念:

套接字是通信的基石,是支持TCP/IP協議的網絡通信的基本操作單元。可以將套接字看作不同主機間的進程進行雙向通信的端點,它構成了單個主機內及整個網絡間的編程界面。套接字存在于通信域中,通信域是為了處理一般的線程通過套接字通信而引進的一種抽象概念。套接字通常和同一個域中的套接字交換數據(數據交換也可能穿越域的界限,但這時一定要執行某種解釋程序)。各種進程使用這個相同的域互相之間用Internet協議簇來進行通信。

套接字可以根據通信性質分類,這種性質對于用戶是可見的。應用程序一般僅在同一類的套接字間進行通信。不過只要底層的通信協議允許,不同類型的套接字間也照樣可以通信。套接字有兩種不同的類型:流套接字和數據報套接字。

套接字工作原理:

要通過互聯網進行通信,你至少需要一對套接字,其中一個運行于客戶機端,我們稱之為ClientSocket,另一個運行于服務器端,我們稱之為ServerSocket。

根據連接啟動的方式以及本地套接字要連接的目標,套接字之間的連接過程可以分為三個步驟:服務器監聽,客戶端請求,連接確認。

所謂服務器監聽,是服務器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態,實時監控網絡狀態。

所謂客戶端請求,是指由客戶端的套接字提出連接請求,要連接的目標是服務器端的套接字。為此,客戶端的套接字必須首先描述它要連接的服務器的套接字,指出服務器端套接字的地址和端口號,然后就向服務器端套接字提出連接請求。

所謂連接確認,是指當服務器端套接字監聽到或者說接收到客戶端套接字的連接請求,它就響應客戶端套接字的請求,建立一個新的線程,把服務器端套接字的描述發給客戶端,一旦客戶端確認了此描述,連接就建立好了。而服務器端套接字繼續處于監聽狀態,繼續接收其他客戶端套接字的連接請求。
C#中的套接字編程實例:

通過向大家簡單的介紹套接字的基本概念和實現套接字編程的基本原理,我想大家對套接字編程已有了初步的了解。不過,上面介紹的僅僅是基本概念和原理,要真正運用還是需要一定的工作的。對基本概念和原理的真正理解的最好方法莫過于自己動手做一個實例,下面我就向大家介紹一個很好的用C#實現套接字編程的實例――聊天室程序。

本程序是基于C/S(服務器/客戶端)構架的,程序包含一個服務器端的應用程序和一個客戶端的應用程序。首先,在服務器上運行服務器端的應用程序,該程序一運行就開始服務器監聽。然后,在客戶機上就可以打開客戶端的應用程序。程序打開后可以與服務器端應用程序進行連接,即進行客戶端請求。在連接確認后,客戶端用戶可以和其他的客戶端用戶進行聊天。客戶端人數沒有限制,同時還支持“悄悄話”聊天模式,支持聊天記錄。所以這是一個學習套接字編程的相當不錯的例子。而且,程序中為了處理每個客戶端的信息還用到了多線程機制。在每個客戶端與服務器端連接成功后,它們之間就建立一個線程。這樣運用了多線程之后,客戶端之間就不會相互影響,即使其中一個出了錯誤也不會影響到另一個。

下面,我就向大家具體介紹該實例:

服務器端程序:

打開VS.net,新建一個C#的模板為“Windows 應用程序”的項目,不妨命名為“ChatServer”。

布置界面。只需在界面上添加一個ListBox控件即可,該控件主要用于顯示客戶端的用戶的一些信息的。圖象如下:

 

服務器端程序的代碼編寫。

對于服務器端,主要的作用是監聽客戶端的連接請求并確認其請求。程序一開始便打開一個StartListening()線程。

 

private void StartListening() 
{
  listener = new TcpListener(listenport);
  listener.Start();
  while (true)
  {
   try
   {
    Socket s = listener.AcceptSocket();
    clientsocket = s;
    clientservice = new Thread(new ThreadStart(ServiceClient));
    clientservice.Start();
   }
   catch(Exception e)
   {
    Console.WriteLine(e.ToString() );
   }
  }
}
該線程是一直處于運行狀態的。當服務器端接收到一個來自客戶端的連接請求后,它就打開一個ServiceClient()線程來服務客戶端。當一個連接被建立后,每個客戶端就被賦予一個屬于它自己的套接字。同時,一個Client類的對象被建立。該對象包含了客戶端的一些相關信息,該信息被保存在一個數組列表中。
 Client類如下:
using System; 
using System.Threading;
namespace ChatServer 
{
using System.Net.Sockets;
using System.Net;
/// 
/// Client 的摘要說明。
///
public class Client
{
private Thread clthread;
private EndPoint endpoint;
private string name;
private Socket sock;
public Client(string _name, EndPoint _endpoint, Thread _thread, Socket _sock) 
{
// TODO: 在此處添加構造函數邏輯
clthread = _thread;
endpoint = _endpoint;
name = _name;
sock = _sock;
}
public override string ToString() 
{
return endpoint.ToString()+ " : " + name;
}
public Thread CLThread 
{
get{return clthread;}
set{clthread = value;}
}
public EndPoint Host 
{
get{return endpoint;}
set{endpoint = value;}
}
public string Name 
{
get{return name;}
set{name = value;}
}
public Socket Sock 
{
get{return sock;}
set{sock = value;}
}
}
}

程序的主體部分應是ServiceClient()函數。該函數是一個獨立的線程,其主要部分是一個while循環。在循環體內,程序處理各種客戶端命令。服務器端接收來自客戶端的以ASCII碼給出的字符串,其中包含了一個“|”形式的分隔符。字符串中“|”以前的部分就是具體的命令,包括CONN、CHAT、PRIV、GONE四種類型。CONN命令建立一個新的客戶端連接,將現有的用戶列表發送給新用戶并告知其他用戶有一個新用戶加入。CHAT命令將新的信息發送給所有用戶。PRIV命令將悄悄話發送給某個用戶。GONE命令從用戶列表中除去一個已離開的用戶并告知其他的用戶某某已經離開了。同時,GONE命令可以設置布爾型的變量keepalive為false從而結束與客戶端連接的線程。

ServiceClient()函數如下:

private void ServiceClient() 
{
Socket client = clientsocket;
bool keepalive = true;

 


while (keepalive)
{
Byte[] buffer = new Byte[1024];
client.Receive(buffer);
string clientcommand = System.Text.Encoding.ASCII.GetString(buffer);

 


string[] tokens = clientcommand.Split(new Char[]{'|'});
Console.WriteLine(clientcommand);

 


if (tokens[0] == "CONN")
{
for(int n=0; n
{
Client cl = (Client)clients[n];
SendToClient(cl, "JOIN|" + tokens[1]);
}
EndPoint ep = client.RemoteEndPoint;
Client c = new Client(tokens[1], ep, clientservice, client);
clients.Add(c);
string message = "LIST|" + GetChatterList() +"\r\n";
SendToClient(c, message);

 


lbClients.Items.Add(c);

 


}
if (tokens[0] == "CHAT")
{
for(int n=0; n
{
Client cl = (Client)clients[n];
SendToClient(cl, clientcommand);
}
}
if (tokens[0] == "PRIV")
{
string destclient = tokens[3];
for(int n=0; n
{
Client cl = (Client)clients[n];
if(cl.Name.CompareTo(tokens[3]) == 0)
SendToClient(cl, clientcommand);
if(cl.Name.CompareTo(tokens[1]) == 0)
SendToClient(cl, clientcommand);
}
}
if (tokens[0] == "GONE")
{
int remove = 0;
bool found = false;
int c = clients.Count;
for(int n=0; n
{
Client cl = (Client)clients[n];
SendToClient(cl, clientcommand);
if(cl.Name.CompareTo(tokens[1]) == 0)
{
remove = n;
found = true;
lbClients.Items.Remove(cl);
}
}
if(found)
clients.RemoveAt(remove);
client.Close();
keepalive = false;
}
}
}

這樣,服務器端程序就基本完成了。(其他略次要的代碼可以參見源代碼中的Form1.cs文件)程序運行圖示如下:

 

#p#

客戶端程序:

打開VS.net,新建一個C#的模板為“Windows 應用程序”的項目,不妨命名為“ChatClient”。

布置界面。

往界面上添加一個ListBox控件(用于顯示用戶列表),一個RichTextBox控件(用于顯示聊天消息以及系統消息),一個TextBox控件(用于發送消息),一個CheckBox控件(確定是否為悄悄話),一個StatusBar控件以及四個Button控件(分別為“連接”、“斷開連接”、“開始記錄”、“發送”)。各個控件的屬性設置可以參見源代碼中的具體設置,這里從略。界面設計好后的圖象如下:

 

客戶端程序的代碼編寫。

當客戶端試圖和服務器端進行連接時,一個連接必須建立而且得向服務器端進行注冊。 EstablishConnection()函數運用一個TcpClient來和服務器端取得連接,同時創建一個NetworkStream來發送消息。還有,端口號和服務器端的是保持一致的,均為5555。

EstablishConnection()函數如下:

 

private void EstablishConnection() 
{
statusBar1.Text = "正在連接到服務器";
try
{
clientsocket = new TcpClient(serveraddress,serverport);
ns = clientsocket.GetStream();
sr = new StreamReader(ns);
connected = true;
}
catch (Exception)
{
MessageBox.Show("不能連接到服務器!","錯誤",
MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
statusBar1.Text = "已斷開連接";
}
}

在和服務器端連接成功后,程序就用RegisterWithServer()函數向服務器端發送一個CONN命令。該命令先是發送該用戶的名稱,然后從服務器端獲得其他所有用戶的列表,所有用戶列表是在ListBox控件中顯示的。

該函數如下:

 

private void RegisterWithServer() 
{
try
{
string command = "CONN|" + ChatOut.Text;
Byte[] outbytes = System.Text.Encoding.ASCII.GetBytes(command.ToCharArray());
ns.Write(outbytes,0,outbytes.Length);
string serverresponse = sr.ReadLine();
serverresponse.Trim();
string[] tokens = serverresponse.Split(new Char[]{'|'});
if(tokens[0] == "LIST")
{
statusBar1.Text = "已連接";
btnDisconnect.Enabled = true;
}
for(int n=1; n
lbChatters.Items.Add(tokens[n].Trim(new char[]{'\r','\n'}));
this.Text = clientname + ":已連接到服務器";
}
catch (Exception)
{
MessageBox.Show("注冊時發生錯誤!","錯誤",
MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}

在此之后,當然就是用戶之間的聊天了,由ReceiveChat()函數來完成。該函數是一個獨立的線程,它處理所有用戶獲得的消息和用戶發送的消息。它主要處理了CHAT、PRIV、JOIN、GONE、QUIT等命令,處理的方法和服務器端的類似。

具體函數實現如下:

private void ReceiveChat() 
{
bool keepalive = true;
while (keepalive)
{
try
{
Byte[] buffer = new Byte[2048];
ns.Read(buffer,0,buffer.Length);
string chatter = System.Text.Encoding.ASCII.GetString(buffer);
string[] tokens = chatter.Split(new Char[]{'|'});
if (tokens[0] == "CHAT") 
{
rtbChatIn.AppendText(tokens[1]);
if(logging)
logwriter.WriteLine(tokens[1]);
}
if (tokens[0] == "PRIV")
{
rtbChatIn.AppendText("Private from ");
rtbChatIn.AppendText(tokens[1].Trim() );
rtbChatIn.AppendText(tokens[2] + "\r\n");
if(logging)
{
logwriter.Write("Private from ");
logwriter.Write(tokens[1].Trim() );
logwriter.WriteLine(tokens[2] + "\r\n");
}
}
if (tokens[0] == "JOIN")
{
rtbChatIn.AppendText(tokens[1].Trim() );
rtbChatIn.AppendText(" has joined the Chat\r\n");
if(logging)
{
logwriter.WriteLine(tokens[1]+" has joined the Chat");
}
string newguy = tokens[1].Trim(new char[]{'\r','\n'});
lbChatters.Items.Add(newguy);
}
if (tokens[0] == "GONE")
{
rtbChatIn.AppendText(tokens[1].Trim() );
rtbChatIn.AppendText(" has left the Chat\r\n");
if(logging)
{
logwriter.WriteLine(tokens[1]+" has left the Chat");
}
lbChatters.Items.Remove(tokens[1].Trim(new char[]{'\r','\n'}));
}
if (tokens[0] == "QUIT")
{
ns.Close();
clientsocket.Close();
keepalive = false;
statusBar1.Text = "服務器端已停止";
connected= false;
btnSend.Enabled = false;
btnDisconnect.Enabled = false;
}
}
catch(Exception){}
}
}

通過以上的一些函數,客戶端程序之間就可以進行自由地聊天了,各個用戶之間還可以互相發送悄悄話。所以程序已經實現了聊天室的基本功能了,不過最后各個用戶還要正常地退出,那就要用到QuitChat()函數了。

該函數的具體實現如下:

private void QuitChat() 
{
if(connected)
{
try
{
string command = "GONE|" + clientname;
Byte[] outbytes = System.Text.Encoding.ASCII.GetBytes(command.ToCharArray());
ns.Write(outbytes,0,outbytes.Length);
clientsocket.Close();
}
catch(Exception)
{
}
}
if(logging)
logwriter.Close();
if(receive != null && receive.IsAlive)
receive.Abort();
this.Text = "客戶端";
}

到此為止,客戶端程序的主要部分都已經介紹完畢。還有一些按鈕控件的消息處理函數可以參見源代碼。同時,程序中還有一個聊天記錄功能,該功能和現在流行的聊天軟件的記錄功能類似。不過限于篇幅,在這里就不一一介紹了,有興趣的讀者可以研究一下本文后面的源代碼。

這樣,客戶端程序就完成了。程序運行圖示如下

 

總結:

本文向大家初步介紹了套接字的基本概念和實現套接字編程的基本原理,還通過一個很好的實例向大家展示了在C#下進行套接字編程的實現方法和一些編程技巧。從中,我們不難發現運用C#進行套接字編程乃至網絡編程有許多優越之處。實例程序實現的思路清晰明了而且通俗易懂,是一個相當不錯的例子,希望各位能好好研讀。同時還希望大家能進一步完善該程序,使之功能更強大、界面更友好。

【編輯推薦】

  1. 詳解C#4.0中的OptionalAndNamedParams特性
  2. 深入解析C#編程中的方法重載
  3. 淺談C#中的接口問題
  4. C#實用基礎教程
責任編輯:book05 來源: cnblog
相關推薦

2009-08-21 09:20:44

C#異步套接字

2009-08-26 09:48:48

C#異步套接字

2020-10-15 19:10:05

LinuxAPI函數

2009-01-16 09:58:07

C#編程C#內存管理垃圾收集

2009-08-27 14:12:02

C# interfac

2009-08-13 17:44:34

C# using關鍵字

2009-09-17 16:41:12

C#組件編程

2009-08-20 17:30:56

C#異步編程模式

2009-08-20 17:47:54

C#異步編程模式

2009-08-25 15:52:27

C#工具欄

2014-12-11 09:20:30

TCP

2009-08-21 14:03:04

C#網絡編程

2009-08-31 17:02:28

C#接口編程

2010-01-26 14:35:11

C++關鍵字

2009-04-29 09:06:18

C#設計模式Adapter

2009-07-31 18:39:31

C#中foreach引

2009-08-17 18:34:50

C# ChangeCo

2009-08-14 17:45:52

C# ArrayLis

2014-12-15 09:28:54

UDP

2009-08-21 17:19:36

C#網絡編程入門
點贊
收藏

51CTO技術棧公眾號

日韩精品久久久| 亚洲少妇中文在线| 国产小视频免费| 国产强被迫伦姧在线观看无码| 天美av一区二区三区久久| 午夜视频一区二区| 欧美国产视频在线观看| 国产美女www| 日本一区二区在线看| 久久国产欧美| 欧美性猛交xxxx偷拍洗澡| 麻豆成人av| 综合久久中文字幕| 97偷自拍亚洲综合二区| 日韩亚洲电影在线| 国产免费一区二区三区| 国语对白永久免费| 精品黄色一级片| 欧美高清视频一二三区| 黄色成人在线免费观看| 青青青免费视频在线2| 日韩av一级电影| 日韩午夜小视频| 日韩小视频网站| 可以免费看污视频的网站在线| 日产欧产美韩系列久久99| 欧美成人黑人xx视频免费观看| 在线黄色免费网站| 老司机深夜福利在线观看| 国产日韩欧美精品一区| www高清在线视频日韩欧美| 视频二区一区| 精品人妻少妇嫩草av无码专区| 色天天色综合| 色综合网色综合| 久久观看最新视频| 青春草在线观看| 国产麻豆精品在线观看| 欧美最猛性xxxxx免费| 亚洲精品视频网址| heyzo高清国产精品| 久久精品夜色噜噜亚洲aⅴ| 91美女福利视频高清| 国产精品视频久久久久久久| 日韩毛片视频| 亚洲精品美女在线观看播放| 91视频这里只有精品| 蜜桃视频动漫在线播放| 国产精品蜜臀在线观看| 久久99久久99精品蜜柚传媒| 免费在线观看黄色av| 日韩免费福利视频| 99久久er热在这里只有精品66| 久久视频国产精品免费视频在线| 精品人妻一区二区三区日产乱码卜| 四虎国产精品免费久久5151| 一本久久综合亚洲鲁鲁五月天| 一区在线电影| 久热av在线| 成人久久18免费网站麻豆| 日韩视频免费中文字幕| 少妇真人直播免费视频| 男人久久天堂| 一区二区三区四区在线播放| 一区二区三区精品国产| 国产九色91回来了| 新狼窝色av性久久久久久| 亚洲1区2区3区视频| 亚洲视频精品一区| 国产在线观看网站| 国产一区二区三区成人欧美日韩在线观看| 中文字幕精品在线视频| 国产黄片一区二区三区| 亚洲电影男人天堂| 亚洲精品在线看| 91看片就是不一样| 国产啊啊啊视频在线观看| 亚洲免费av在线| 欧美日韩系列| 精品av中文字幕在线毛片| 久久影院视频免费| 久久免费看av| 欧美日韩激情视频一区二区三区| 91亚洲男人天堂| 久久伦理网站| 国产在线观看黄| 国产婷婷色一区二区三区| 蜜桃麻豆www久久国产精品| 手机看片一区二区| 顶级嫩模精品视频在线看| 99re在线| www.国产成人| 在线一区视频| 欧洲精品毛片网站| 五月天综合激情| 久久三级视频| 国产精品你懂得| 国产精品人人妻人人爽| 国产成人在线视频网站| 国产成人av一区二区三区| 天天干天天干天天干| 久久免费美女视频| 色综合电影网| 黄色成人在线| 亚洲成年人影院| 国产婷婷一区二区三区| 国产在线免费观看| 中文字幕一区二区视频| av一区观看| 香蕉久久国产av一区二区| 99re免费视频精品全部| 欧美一卡2卡3卡4卡无卡免费观看水多多| 在线免费观看一级片| 国产精品草草| 在线播放国产一区中文字幕剧情欧美| 成年人看的免费视频| 欧美精品日韩| 久久99亚洲精品| 午夜精品久久久久久久久久久久久蜜桃 | 日韩精品网站| 久久夜精品va视频免费观看| 日本中文字幕免费| 五月激情六月婷婷| 精品久久在线| 久久综合九色综合97_久久久| 精品国产一区二区三区日日嗨| 国产精品欧美久久久久天天影视| 国产成人精品aa毛片| 精品国产乱码久久久久久88av| 天堂视频中文在线| 丁香婷婷综合色啪| 日韩av不卡在线播放| 永久免费网站在线| 欧美日韩激情网| 日本高清一区二区视频| 牛牛精品成人免费视频| 久久夜色精品国产亚洲aⅴ| 久久国产视频播放| 国产精品一二一区| 亚洲v国产v在线观看| a在线视频v视频| 这里只有精品视频在线观看| 久久无码人妻精品一区二区三区| 亚洲久久久久| 色午夜这里只有精品| 国产精品成人免费观看| 久久亚洲欧美| 国产日韩欧美二区| 在线视频自拍| 国产偷国产偷亚洲高清人白洁| 99中文字幕在线观看| 巨胸喷奶水www久久久免费动漫| 欧美成人免费网站| 极品色av影院| 美女任你摸久久| 国产精品欧美一区二区三区奶水| 99国产揄拍国产精品| 亚洲国产精华液网站w| 无码人妻丰满熟妇区96| www.久久东京| 久久资源免费视频| 亚洲影院一区二区三区| 99久久免费精品| 国产精品三级一区二区| 先锋影音网一区二区| 亚洲丝袜在线视频| 国产精品一区二区三区四| 成人毛片视频在线观看| 日本福利视频在线观看| 亚洲一区二区三区免费| 美乳少妇欧美精品| 国产男男gay体育生网站| 中文在线资源观看网站视频免费不卡 | 黄色羞羞视频在线观看| 9191成人精品久久| 久久久精品视频免费观看| 国产精品资源网站| 日韩精品一区二区免费| baoyu135国产精品免费| 欧美性受xxxx黑人猛交| 可以免费看污视频的网站在线| 欧美三级在线视频| 在线看的片片片免费| 丁香六月久久综合狠狠色| 18禁免费观看网站| 成人中文视频| 波多野结衣久草一区| 僵尸再翻生在线观看| 国产亚洲欧美日韩精品| a级片在线播放| 精品人伦一区二区三区蜜桃网站| 国产精品密蕾丝袜| 精品一二线国产| 久久久久久久中文| 国产精品99视频| 国产专区一区二区三区| 精品亚洲a∨| 欧美激情精品久久久久久久变态| 国产无套在线观看| 久久蜜桃av一区二区天堂| 一级片视频免费观看| 欧美色一级片| 日韩精品伦理第一区| 亚洲国产视频二区| 国产精品99久久久久久人| 顶级网黄在线播放| 亚洲深夜福利在线| 后进极品白嫩翘臀在线视频| 欧美综合欧美视频| 日本少妇在线观看| 成人欧美一区二区三区| 国产麻豆xxxvideo实拍| 国产真实乱偷精品视频免| www.浪潮av.com| 一区二区中文字| 日韩av高清在线播放| 久久久国产精品入口麻豆| 国产高清在线不卡| www.综合网.com| 久久精品国产视频| 九九在线视频| 精品sm在线观看| 国产一区二区在线播放视频| 亚洲国产精品久久久久秋霞影院 | 黄色成人美女网站| 欧美激情中文字幕在线| 在线观看麻豆蜜桃| 亚洲乱码国产乱码精品精天堂| 国产免费一区二区三区最新不卡 | 99久久久无码国产精品6| 欧美激情性爽国产精品17p| 色播五月综合| 亚洲精品国产动漫| 国产专区一区二区三区| 成人三级av在线| 亚洲一区中文字幕| 国产精品视频一区二区三区综合| 国产成人精品一区二区在线| 午夜裸体女人视频网站在线观看| 久久99国产精品久久久久久久久| 日本中文字幕在线播放| 在线播放精品一区二区三区| 女人天堂在线| 国产午夜精品久久久| 天堂资源最新在线| 亚洲国产欧美自拍| 亚洲aaaaaaa| 日韩成人xxxx| 网站黄在线观看| 亚洲国产三级网| 人妻无码中文字幕免费视频蜜桃| 日韩视频国产视频| 99久久亚洲精品日本无码| 欧美欧美午夜aⅴ在线观看| 日韩黄色片网站| 欧美丝袜丝交足nylons| 中文字幕 人妻熟女| 91成人在线免费观看| 欧美日韩 一区二区三区| 欧美亚洲国产bt| 伊人网av在线| 欧美性色黄大片| 天天爽夜夜爽人人爽| 色偷偷88欧美精品久久久| 秋霞精品一区二区三区| 欧美在线观看视频一区二区 | 久久久成人网| 日韩在线第三页| 久久er99精品| 成人免费播放视频| 成人深夜视频在线观看| 香港三级日本三级| 国产欧美视频一区二区三区| 色婷婷激情视频| 国内精品自线一区二区三区视频| 一级做a爱视频| 成人福利视频网站| 法国伦理少妇愉情| 国产精品日产欧美久久久久| 日韩三级在线观看视频| 亚洲国产成人av网| 中文字幕国产在线观看| 欧美日韩黄视频| а√天堂资源在线| 精品一区二区三区四区| 一区二区三区视频网站| 欧美丰满少妇xxxxx| 日本а中文在线天堂| 国产精品日韩欧美大师| 一区二区在线免费播放| 欧美不卡在线一区二区三区| 91偷拍一区二区三区精品| 91视频 - 88av| 久久精品三级| 亚洲第一天堂久久| 91在线精品秘密一区二区| 91动漫免费网站| 亚洲一区二区三区四区在线观看| 亚洲天堂一区在线| 91麻豆精品国产无毒不卡在线观看| 黄频在线免费观看| 最近2019中文字幕在线高清| 后进极品白嫩翘臀在线播放| 日韩美女免费观看| 麻豆精品在线| 日本中文不卡| 亚洲日产国产精品| 亚洲三级在线观看视频| 91免费版在线| 欧美激情精品久久| 欧美在线色视频| 国模私拍视频在线| 精品国产一区二区三区在线观看| 青青青草视频在线| 国产精品视频久| 日韩有码一区| www.男人天堂网| 免费成人美女在线观看| 99re久久精品国产| 一区二区三区丝袜| 亚洲怡红院av| 亚洲欧洲国产伦综合| www.8ⅹ8ⅹ羞羞漫画在线看| 国产在线999| 欧美色图在线播放| 浮妇高潮喷白浆视频| 高清不卡在线观看| 91视频青青草| 欧美日韩视频不卡| 黄色视屏网站在线免费观看| 97超级碰碰碰久久久| 欧美v亚洲v| 国产在线视频2019最新视频| 蜜桃精品wwwmitaows| 任我爽在线视频精品一| 在线国产日韩| 性一交一黄一片| 亚洲色大成网站www久久九九| 免费av中文字幕| 亚洲精品视频网上网址在线观看| av免费在线视| 91青青草免费在线看| 亚洲啊v在线观看| 伊人成人222| 国产精品福利av| 在线视频免费观看一区| 一区二区三区 在线观看视| 一区二区三区四区日本视频| 国产精品亚洲一区二区三区| 亚洲小说图片| 欧美激情国产精品日韩| 91最新地址在线播放| 亚洲欧美在线观看视频| 亚洲国产成人精品电影| 国精产品一区一区三区mba下载| 99re视频在线观看| 韩国一区二区三区在线观看| 国产精品91av| 亚洲成av人片一区二区三区| 韩国av在线免费观看| 97热精品视频官网| 狼人精品一区二区三区在线| 国产xxxx振车| 不卡的av电影| 欧美一区二区三区不卡视频| 亚洲人成电影在线观看天堂色| 亚洲第一会所001| 四虎影视永久免费在线观看一区二区三区| 日韩av一级电影| www.97视频| 精品国产一区二区亚洲人成毛片 | 一区二区三区在线视频免费| www.国产免费| 97人人模人人爽人人喊中文字 | 久久久精品视频在线| 欧美精品一区视频| 女人高潮被爽到呻吟在线观看| 欧美一区二区高清在线观看| 蜜桃免费网站一区二区三区| 日韩激情小视频| 亚洲第一免费播放区| 美女100%一区| 最新欧美日韩亚洲| 成人的网站免费观看| 69视频免费看| 免费91在线视频| 日韩三区视频| 亚洲精品20p| 亚洲成人你懂的| 川上优的av在线一区二区| 91亚洲精品在线观看| 一本色道久久| 青青草华人在线视频| 日韩美女在线视频| 97久久香蕉国产线看观看| 妞干网这里只有精品| 97se亚洲国产综合自在线不卡| 影音先锋国产在线| 久久青草精品视频免费观看| 欧美亚洲激情|