日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[二]RabbitMQ-客户端源码之AMQConnection

發布時間:2024/9/21 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [二]RabbitMQ-客户端源码之AMQConnection 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

上一篇文章([一]RabbitMQ-客戶端源碼之ConnectionFactory)中闡述了conn.start()方法完成之后客戶端就已經和broker建立了正常的連接,而這個Connection的關鍵就在于這個start()方法之內,下面我們來慢慢分析。

首先來看看start()方法的源碼,這個方法有點長,這里拆開來一一分析,首先是注釋:

/*** Start up the connection, including the MainLoop thread.* Sends the protocol* version negotiation header, and runs through* Connection.Start/.StartOk, Connection.Tune/.TuneOk, and then* calls Connection.Open and waits for the OpenOk. Sets heart-beat* and frame max values after tuning has taken place.* @throws IOException if an error is encountered* either before, or during, protocol negotiation;* sub-classes {@link ProtocolVersionMismatchException} and* {@link PossibleAuthenticationFailureException} will be thrown in the* corresponding circumstances. {@link AuthenticationFailureException}* will be thrown if the broker closes the connection with ACCESS_REFUSED.* If an exception is thrown, connection resources allocated can all be* garbage collected when the connection object is no longer referenced.*/

首先來看看方法上的注釋說了什么:

  • 方法的作用是啟動連接(start up the connection), 包括啟動MainLoop線程,這個MainLoop線程主要是和broker進行通信交互處理通信幀(Frame)的一個線程(非常的重要!!!)。
  • 這個方法會在建立連接的初始化階段(negotiation)會進行Connection.Start/.StartOk, Connection.Tune/.TuneOk, 調用Connection.Open之后再等待Conenction.OpenOk(這里的都是指AMQP協議層面的),這個可以參考本文中第一張使用wireshark抓包的網絡截圖,一一對應的關系。
  • 通過broker回復的Connection.Tune幀(幀中包含Channel-Max, Frame-Max, Heartbeat三個參數)設置channelMax, frameMax以及Heartbeat的參數值。
  • 一些異常情況。

public void start()throws IOException, TimeoutException {initializeConsumerWorkService();initializeHeartbeatSender();this._running = true;// Make sure that the first thing we do is to send the header,// which should cause any socket errors to show up for us, rather// than risking them pop out in the MainLoopAMQChannel.SimpleBlockingRpcContinuation connStartBlocker =new AMQChannel.SimpleBlockingRpcContinuation();// We enqueue an RPC continuation here without sending an RPC// request, since the protocol specifies that after sending// the version negotiation header, the client (connection// initiator) is to wait for a connection.start method to// arrive._channel0.enqueueRpc(connStartBlocker);

首先是初始化工作線程池(initializeConsumerWorkService)和初始化心跳線程(initializeHeartbeatSender)并設置運行狀態為true(this._isrunning=true,這個值會在MainLoop線程中有用,控制MainLoop線程是否繼續運行)。

“AMQChannel.SimpleBlockingRpcContinuation connStartBlocker = new AMQChannel.SimpleBlockingRpcContinuation();”這句代碼,從命名上來說像是rpc, 其實這么理解也沒錯。RabbitMQ-Client這個版本(3.5.3)的客戶端與broker端的通信是采用java原生socket.當然后面也改成了NIO,這個自然是后話。RabbitMQ-Client程序中會對各種幀進行處理,處理的方式也不是單一化的,這里舉Connection.Start這個類型的報文做分析。當broker發送Connection.Start至client端,client收到之后進行處理(MainLoop線程中),然后將此報文存入SimpleBlockingRpcContinuation中,照著SimpleBlockingRpcContinuation深究下去,其就是一個容量為1的BlockingQueue,也就是當MainLoop主導的線程將收到的Connection.Start存入其中,然后AMQConnction類的start()線程在等待(start()方法下面的代碼):

connStart = (AMQP.Connection.Start) connStartBlocker.getReply(HANDSHAKE_TIMEOUT/2).getMethod();

然后繼續處理。這看上去也算是個rpc,等待別的線程(這個線程同樣在等待broker的返回)處理完畢。

AMQCommand(這個之后會講到), 下面的“_channel0.enqueueRpc(connStartBlocker)”將這個rpc任務放入Channel中,如果深入代碼看的話,channel中當前至多只能enqueue一個rpc,如果當前的rpc沒有處理完再enqueue的話會被阻塞(wait())直到處理完當前的rpc才能enqueue下一個rpc。


try {// The following two lines are akin to AMQChannel's// transmit() method for this pseudo-RPC._frameHandler.setTimeout(HANDSHAKE_TIMEOUT);_frameHandler.sendHeader();} catch (IOException ioe) {_frameHandler.close();throw ioe;}

接下來“_frameHandler.sendHeader()”主要是發送Protocol-Header 0-9-1幀(可參考下圖),這個客戶端與broker建立連接的AMQP協議的第一幀,幀中的內容包括AMQP的版本號。這里發_frameHandler就是前面Connection提到的SocketFrameHandler對象,我們來看看sendHeader()做了什么:

//本段代碼在SocketFrameHandler類中 public void sendHeader(int major, int minor, int revision) throws IOException {synchronized (_outputStream) {_outputStream.write("AMQP".getBytes("US-ASCII"));_outputStream.write(0);_outputStream.write(major);_outputStream.write(minor);_outputStream.write(revision);_outputStream.flush();}}public void sendHeader() throws IOException {sendHeader(AMQP.PROTOCOL.MAJOR, AMQP.PROTOCOL.MINOR, AMQP.PROTOCOL.REVISION);}

上面這段對照著下圖一目了然:


// start the main loop goingMainLoop loop = new MainLoop();final String name = "AMQP Connection " + getHostAddress() + ":" + getPort();mainLoopThread = Environment.newThread(threadFactory, loop, name);mainLoopThread.start();// after this point clear-up of MainLoop is triggered by closing the frameHandler.

下面就是最重要的MainLoop線程了。這里先跳過,接下去看看start()方法,之后就是Connection.Start/.StartOk, Connection.Tune/.TuneOk, Connection.Open/.OpenOk的來回negotiation,以及設置channelMax, frameMax和heartbeat的參數值。當然在設置frameMax之前還初始化了ChannelManager,至于ChannelManager可以簡單的理解為管理Channel的一個類,具體實現細節可以參考([三]RabbitMQ-客戶端源碼之ChannelManager)

AMQP.Connection.Start connStart = null;AMQP.Connection.Tune connTune = null;try {connStart =(AMQP.Connection.Start) connStartBlocker.getReply(HANDSHAKE_TIMEOUT/2).getMethod();_serverProperties = Collections.unmodifiableMap(connStart.getServerProperties());Version serverVersion =new Version(connStart.getVersionMajor(),connStart.getVersionMinor());if (!Version.checkVersion(clientVersion, serverVersion)) {throw new ProtocolVersionMismatchException(clientVersion,serverVersion);}String[] mechanisms = connStart.getMechanisms().toString().split(" ");SaslMechanism sm = this.saslConfig.getSaslMechanism(mechanisms);if (sm == null) {throw new IOException("No compatible authentication mechanism found - " +"server offered [" + connStart.getMechanisms() + "]");}LongString challenge = null;LongString response = sm.handleChallenge(null, this.username, this.password);do {Method method = (challenge == null)? new AMQP.Connection.StartOk.Builder().clientProperties(_clientProperties).mechanism(sm.getName()).response(response).build(): new AMQP.Connection.SecureOk.Builder().response(response).build();try {Method serverResponse = _channel0.rpc(method, HANDSHAKE_TIMEOUT/2).getMethod();if (serverResponse instanceof AMQP.Connection.Tune) {connTune = (AMQP.Connection.Tune) serverResponse;} else {challenge = ((AMQP.Connection.Secure) serverResponse).getChallenge();response = sm.handleChallenge(challenge, this.username, this.password);}} catch (ShutdownSignalException e) {Method shutdownMethod = e.getReason();if (shutdownMethod instanceof AMQP.Connection.Close) {AMQP.Connection.Close shutdownClose = (AMQP.Connection.Close) shutdownMethod;if (shutdownClose.getReplyCode() == AMQP.ACCESS_REFUSED) {throw new AuthenticationFailureException(shutdownClose.getReplyText());}}throw new PossibleAuthenticationFailureException(e);}} while (connTune == null);} catch (TimeoutException te) {_frameHandler.close();throw te;} catch (ShutdownSignalException sse) {_frameHandler.close();throw AMQChannel.wrap(sse);} catch(IOException ioe) {_frameHandler.close();throw ioe;}try {int channelMax =negotiateChannelMax(this.requestedChannelMax,connTune.getChannelMax());_channelManager = instantiateChannelManager(channelMax, threadFactory);int frameMax =negotiatedMaxValue(this.requestedFrameMax,connTune.getFrameMax());this._frameMax = frameMax;int heartbeat =negotiatedMaxValue(this.requestedHeartbeat,connTune.getHeartbeat());setHeartbeat(heartbeat);_channel0.transmit(new AMQP.Connection.TuneOk.Builder().channelMax(channelMax).frameMax(frameMax).heartbeat(heartbeat).build());_channel0.exnWrappingRpc(new AMQP.Connection.Open.Builder().virtualHost(_virtualHost).build());} catch (IOException ioe) {_heartbeatSender.shutdown();_frameHandler.close();throw ioe;} catch (ShutdownSignalException sse) {_heartbeatSender.shutdown();_frameHandler.close();throw AMQChannel.wrap(sse);}// We can now respond to errors having finished tailoring the connectionthis._inConnectionNegotiation = false;return; }

接著回顧MainLoop, 在start()方法中關于MainLoop的代碼主要有:

// start the main loop goingMainLoop loop = new MainLoop();final String name = "AMQP Connection " + getHostAddress() + ":" + getPort();mainLoopThread = Environment.newThread(threadFactory, loop, name);mainLoopThread.start();// after this point clear-up of MainLoop is triggered by closing the frameHandler.

這段代碼主要是初始化MainLoop線程對象,然后讓其運行。沒有什么特別之處,而特別之處在于MainLoop本身。

MainLoop類是AMQConnection類的私有內部類:

private class MainLoop implements Runnable {/*** Channel reader thread main loop. Reads a frame, and if it is* not a heartbeat frame, dispatches it to the channel it refers to.* Continues running until the "running" flag is set false by* shutdown().*/public void run() {try {while (_running) {Frame frame = _frameHandler.readFrame();if (frame != null) {_missedHeartbeats = 0;if (frame.type == AMQP.FRAME_HEARTBEAT) {// Ignore it: we've already just reset the heartbeat counter.} else {if (frame.channel == 0) { // the special channel_channel0.handleFrame(frame);} else {if (isOpen()) {// If we're still _running, but not isOpen(), then we// must be quiescing, which means any inbound frames// for non-zero channels (and any inbound commands on// channel zero that aren't Connection.CloseOk) must// be discarded.ChannelManager cm = _channelManager;if (cm != null) {cm.getChannel(frame.channel).handleFrame(frame);}}}}} else {// Socket timeout waiting for a frame.// Maybe missed heartbeat.handleSocketTimeout();}}} catch (EOFException ex) {if (!_brokerInitiatedShutdown)shutdown(null, false, ex, true);} catch (Throwable ex) {_exceptionHandler.handleUnexpectedConnectionDriverException(AMQConnection.this,ex);shutdown(null, false, ex, true);} finally {// Finally, shut down our underlying data connection._frameHandler.close();_appContinuation.set(null);notifyListeners();}} }

MainLoop線程主要用來處理通信幀(Frame,有關Frame的細節將會在([四]RabbitMQ-客戶端源碼之Frame)中陳述)的,可以看到當AMQConnection調用start()方法后,_isrunning就設置為true,那么線程一直在運行(while(true))。

MainLoop線程當讀取到通信幀之后,判斷是否是心跳幀,如果是則忽略繼續監聽。如果是其他幀,則判斷其frame.channel值是否為0,frame.channel值為0代表的是特殊幀,這些特殊幀是和Connection有關的,而不是和Channel有關的(上面代碼里的frame.channel就是Channel里的channel number, 一般Connection類型的幀的channel number為0,而其余Channel類別幀的channel number大于0。)

這里就分channel_number=0和channel_number !=0分別進行處理。
當channel_number=0即frame.channel=0則直接調用_channel0的handleFrame方法。
這個_channel0是在AMQConnection類中創建的私有變量:

private final AMQChannel _channel0 = new AMQChannel(this, 0) {@Override public boolean processAsync(Command c) throws IOException {return getConnection().processControlCommand(c);} };

調用AMQChannel的handleFrame方法(有關AMQChannel的更多實現細節可以參考:([五]RabbitMQ-客戶端源碼之AMQChannel)):

public void handleFrame(Frame frame) throws IOException {AMQCommand command = _command;if (command.handleFrame(frame)) { // a complete command has rolled off the assembly line_command = new AMQCommand(); // prepare for the next onehandleCompleteInboundCommand(command);} }

對于channel number為0的幀,AMQCommand的handleFrame方法都是返回true.(有關AMQCommand的實現細節可以參考:([六]RabbitMQ-客戶端源碼之AMQCommand))
進而調用AMQChannel的handleCompleteInboundCommand(command)方法:

public void handleCompleteInboundCommand(AMQCommand command) throws IOException {// First, offer the command to the asynchronous-command// handling mechanism, which gets to act as a filter on the// incoming command stream. If processAsync() returns true,// the command has been dealt with by the filter and so should// not be processed further. It will return true for// asynchronous commands (deliveries/returns/other events),// and false for commands that should be passed on to some// waiting RPC continuation.if (!processAsync(command)) {// The filter decided not to handle/consume the command,// so it must be some reply to an earlier RPC.nextOutstandingRpc().handleCommand(command);markRpcFinished();} }

進而調用AMQChannel的processAsync方法。這個方法在AMQChannel類中是一個抽象方法,而觀察AMQConnection中的AMQChannel _channel0私有變量其正好實現了這個方法:

/** The special channel 0 (not managed by the_channelManager) */ private final AMQChannel _channel0 = new AMQChannel(this, 0) {@Override public boolean processAsync(Command c) throws IOException {return getConnection().processControlCommand(c);} };

ChannelN中也實現了processAsync方法。(有關ChannelN的實現細節可以參考:([八]RabbitMQ-客戶端源碼之ChannelN))

進而調用了AMQConnection的processControlCommand方法:

/*** Handles incoming control commands on channel zero.* @see ChannelN#processAsync*/ @SuppressWarnings("unused") public boolean processControlCommand(Command c) throws IOException {// Similar trick to ChannelN.processAsync used here, except// we're interested in whole-connection quiescing.// See the detailed comments in ChannelN.processAsync.Method method = c.getMethod();if (isOpen()) {if (method instanceof AMQP.Connection.Close) {handleConnectionClose(c);return true;} else if (method instanceof AMQP.Connection.Blocked) {AMQP.Connection.Blocked blocked = (AMQP.Connection.Blocked) method;try {for (BlockedListener l : this.blockedListeners) {l.handleBlocked(blocked.getReason());}} catch (Throwable ex) {getExceptionHandler().handleBlockedListenerException(this, ex);}return true;} else if (method instanceof AMQP.Connection.Unblocked) {try {for (BlockedListener l : this.blockedListeners) {l.handleUnblocked();}} catch (Throwable ex) {getExceptionHandler().handleBlockedListenerException(this, ex);}return true;} else {return false;}} else {if (method instanceof AMQP.Connection.Close) {// Already shutting down, so just send back a CloseOk.try {_channel0.quiescingTransmit(new AMQP.Connection.CloseOk.Builder().build());} catch (IOException _e) { } // ignorereturn true;} else if (method instanceof AMQP.Connection.CloseOk) {// It's our final "RPC". Time to shut down._running = false;// If Close was sent from within the MainLoop we// will not have a continuation to return to, so// we treat this as processed in that case.return !_channel0.isOutstandingRpc();} else { // Ignore all others.return true;}} }

這個方法是用來處理AMQP控制命令的:Connection.Close/CloseOk, Connection.Blocked/.Unblocked。正常情況下(比如Connection.Start/.StartOk)直接返回false。

這樣就會運行到 nextOutstandingRpc().handleCommand(command);這句代碼,意思就是將從broker接受到的AMQCommand對象存入RpcContinuation對象,確切的來說是SimpleBlockingRpcContinuation這個對象中,更確切的來說是存放到容量為1的BlockingQueue中,等待其余的線程來“take()”。有關RpcContinuation或者SimpleBlockingRpcContinuation細節可以參考:[五]RabbitMQ-客戶端源碼之AMQChannel。

我們假設有一個可靠的面向流的網絡傳輸層(TCP/IP或相當)。在單個套接字連接中,可以存在多個獨立控制線程,這些稱之為通道。每個幀都使用通道編號來編號。通過交織他們的幀,不同的通道共享連接。對于給定的通道,幀運行在一個嚴格的序列,這樣可以用來驅動一個協議解析器(通常是一個狀態機)。

當channel_number!=0則需要從ChannelManager中根據channel number找出相應的AMQChannel再調用handleFrame方法處理。
這里的ChannelManager從何而來?
這里就還是要到AMQChannel的start()方法來看,有這么一句:_channelManager = instantiateChannelManager(channelMax, threadFactory);

//AMQConnection類中 protected ChannelManager instantiateChannelManager(int channelMax, ThreadFactory threadFactory) {return new ChannelManager(this._workService, channelMax, threadFactory); }//ChannelManager的構造方法 public ChannelManager(ConsumerWorkService workService, int channelMax, ThreadFactory threadFactory) {if (channelMax == 0) {// The framing encoding only allows for unsigned 16-bit integers// for the channel numberchannelMax = (1 << 16) - 1;}_channelMax = channelMax;channelNumberAllocator = new IntAllocator(1, channelMax);this.workService = workService;this.threadFactory = threadFactory; }

ChannelManager構造方法中的ConsumerWorkService參數就是AMQConnection中start()方法第一行代碼初始化的ConsumerWorkService對象。

有關ChannelManager的實現細節可以參考:([三]RabbitMQ-客戶端源碼之ChannelManager)

當channel number等于0的時候是調用AMQChannel,也可以說是AQMConnection的內部成員變量AMQChannel _channel0來處理。

當channel number不等于0時,這個接下去的處理就要涉及到整個RabbitMQ-Client代碼最核心的類——ChannelN??梢灶悇e上上面channel number為0的情況,具體可以參考:[八]RabbitMQ-客戶端源碼之ChannelN。


附:本系列全集

  • [Conclusion]RabbitMQ-客戶端源碼之總結
  • [一]RabbitMQ-客戶端源碼之ConnectionFactory
  • [二]RabbitMQ-客戶端源碼之AMQConnection
  • [三]RabbitMQ-客戶端源碼之ChannelManager
  • [四]RabbitMQ-客戶端源碼之Frame
  • [五]RabbitMQ-客戶端源碼之AMQChannel
  • [六]RabbitMQ-客戶端源碼之AMQCommand
  • [七]RabbitMQ-客戶端源碼之AMQPImpl+Method
  • [八]RabbitMQ-客戶端源碼之ChannelN
  • [九]RabbitMQ-客戶端源碼之Consumer
  • 總結

    以上是生活随笔為你收集整理的[二]RabbitMQ-客户端源码之AMQConnection的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    a黄在线观看 | 91精品视频一区二区三区 | 午夜av在线免费 | 成年人电影免费在线观看 | 草久中文字幕 | 一区二区视频在线免费观看 | 日韩欧美一区二区三区视频 | 在线婷婷| 四虎国产精品成人免费4hu | 久久经典视频 | 国产精品成人免费 | 久久综合五月婷婷 | 亚洲影院天堂 | 国内精品一区二区 | 免费一级特黄毛大片 | 九九99 | 66av99精品福利视频在线 | 亚洲精品在线二区 | 99热高清 | 深爱婷婷网 | 91爱在线| 激情婷婷丁香 | 亚洲精品视频在线观看免费视频 | 少妇精品久久久一区二区免费 | 国产又黄又猛又粗 | 激情五月婷婷网 | 国产精品久久久久久久免费 | 涩涩成人在线 | 99一区二区三区 | 久久伊人热 | 五月婷香蕉久色在线看 | av在线播放网址 | 日韩欧美精品免费 | 久久九九国产精品 | 激情综合色综合久久 | 中文字幕在线观看免费观看 | 日韩在线一区二区免费 | 人人爱爱人人 | 国产精品乱看 | 日韩有码中文字幕在线 | 日韩一级电影在线观看 | 美女黄视频免费看 | 日韩av电影手机在线观看 | 亚洲高清不卡av | 你操综合 | 国产精品不卡在线 | 91精彩视频在线观看 | 99在线视频播放 | 三级av小说 | 天天干天天拍天天操 | 97在线视频观看 | 日韩在线观看你懂的 | 99免费看片 | 亚洲欧美视频在线 | 97超级碰碰碰视频在线观看 | www视频在线免费观看 | 超碰免费97 | 国产成人精品一区二 | 99这里有精品 | 日韩av有码在线 | 看国产黄色片 | 96国产在线| 美女国产精品 | 国产成人精品一区二区三区免费 | 国产午夜免费视频 | 国产精品久久久久久久久久久免费 | 91色视频| 91在线操 | 911国产精品 | 99久久精品国产一区二区三区 | 精品视频久久久 | 特级黄色片免费看 | 精品国内自产拍在线观看视频 | 欧美中文字幕第一页 | 97福利视频 | 最新日韩在线观看 | 99综合电影在线视频 | 久久精彩免费视频 | 国产精品美女在线观看 | 亚洲一区二区黄色 | 国产精品成人久久 | 欧美日韩在线精品 | 欧美亚洲国产日韩 | 国产精品麻豆一区二区三区 | 成人小视频在线观看免费 | 99在线国产 | 日韩中文字幕视频在线观看 | 亚洲91精品在线观看 | 91精品一区二区三区蜜臀 | 美女国产 | www.久热| 91视视频在线直接观看在线看网页在线看 | 中文字幕中文字幕中文字幕 | 亚洲视频2| 黄色片网站大全 | 手机看片国产日韩 | 欧美日韩色婷婷 | 亚洲综合干| 亚洲精品永久免费视频 | 色综合久久久久久久 | 亚洲一区二区精品在线 | 成人在线免费视频 | 国产一级片免费播放 | 99视频在线免费 | 欧美 日韩 国产 中文字幕 | 欧洲亚洲国产视频 | 欧美在线观看视频一区二区三区 | 国产精品久久久久久超碰 | 在线观看免费一级片 | 香蕉视频久久久 | 日韩精品最新在线观看 | 91片黄在线观 | 久久乐九色婷婷综合色狠狠182 | 国产三级在线播放 | 成人av影院在线观看 | 亚洲精品一区二区三区四区高清 | 欧美人体xx| 最近中文字幕在线中文高清版 | 精品国产免费人成在线观看 | 国产69精品久久久久久久久久 | 精品麻豆 | 国产精品爽爽久久久久久蜜臀 | 亚洲国产中文字幕在线 | 伊人久久影视 | 人人爽爽人人 | 免费久久99精品国产 | 日韩特黄av| 国产精品99久久久久久宅男 | 韩国av在线播放 | 亚洲精品国产精品国自产在线 | 日本黄色一级电影 | 黄色一级大片在线免费看国产一 | 久久久久久久久久网站 | 久久久免费 | 日韩,中文字幕 | 黄污视频网站大全 | 国产999在线| 9在线观看免费高清完整版在线观看明 | 六月丁香激情综合色啪小说 | 国产成人精品在线播放 | 天天干,夜夜操 | 国产日本三级 | 香蕉日日| 很黄很色很污的网站 | 久久成人人人人精品欧 | 黄色软件网站在线观看 | 日韩毛片在线一区二区毛片 | 狠狠干美女 | 国内视频一区二区 | 不卡av电影在线 | 久久草在线视频国产 | 国产98色在线 | 日韩 | 激情欧美丁香 | 久久精品精品电影网 | 免费看片在线观看 | 精品免费久久久久久 | 久久成熟 | 免费人成在线观看 | 亚洲精品男女 | 18av在线视频 | 97精品国自产拍在线观看 | av黄色在线播放 | 看国产黄色大片 | 一二三区av | 久久96国产精品久久99软件 | 99re6热在线精品视频 | 激情偷乱人伦小说视频在线观看 | 国产福利91精品一区二区三区 | 日韩丝袜在线观看 | 久久精品屋 | 国产成人三级一区二区在线观看一 | 美女精品在线 | 九精品 | 久草免费在线观看视频 | av成人在线网站 | 久久精品视频4 | 日韩网| 九九热视频在线播放 | 天天添夜夜操 | 久久久久在线视频 | 久久国产精品二国产精品中国洋人 | 在线视频手机国产 | 久久免费公开视频 | 免费观看成人 | 在线免费观看亚洲视频 | 日本中文字幕一二区观 | 日韩av电影免费在线观看 | 日本三级香港三级人妇99 | 中文字幕精品久久 | 国产 一区二区三区 在线 | 四虎成人免费影院 | 欧美人人爱 | 中文字幕欧美日韩va免费视频 | 日韩精品一区二区三区免费观看 | 久久精品99视频 | 国产美女主播精品一区二区三区 | 蜜臀av夜夜澡人人爽人人桃色 | 99精品在这里 | 波多野结衣视频网址 | 欧美日韩亚洲一 | 成人一区二区三区在线观看 | 九九视频热| 日韩综合色 | 亚洲精品视频免费在线观看 | 日韩欧美在线观看一区二区 | 国产精美视频 | 九九亚洲视频 | 啪啪精品 | 成年人在线播放视频 | 久久久久久久毛片 | 天天综合婷婷 | 在线有码中文字幕 | 在线观看a视频 | 综合久久网站 | 久久精品一区二区三区中文字幕 | 免费看黄在线网站 | 久久久久久久久久伊人 | 亚洲欧美成人网 | 日本xxxxav | 久久精品电影网 | 日韩中文免费视频 | 天天操网| 999视频精品 | 超碰97国产在线 | 国产福利精品在线观看 | 成年人黄色免费视频 | 日韩一区正在播放 | 天堂av免费 | 狠狠躁天天躁综合网 | 亚洲高清久久久 | 久久免费视频观看 | 国产中文字幕在线播放 | 国产精品国产三级国产不产一地 | 国产在线视频导航 | 在线免费av电影 | 亚洲伊人天堂 | 久久久这里有精品 | 中文字幕国产亚洲 | 国产中文字幕大全 | 六月丁香社区 | 黄网站色视频免费观看 | 国产伦精品一区二区三区无广告 | 国产成人333kkk | 日韩精品电影在线播放 | 啪嗒啪嗒免费观看完整版 | 欧美一区二区免费在线观看 | 日本女人逼| 99精品免费在线观看 | 国产一级电影在线 | 中文字幕免费不卡视频 | 国产欧美日韩视频 | 久久99久久精品 | 九九九热精品免费视频观看 | 久草视频国产 | 国产精品中文字幕在线播放 | 日本巨乳在线 | 亚洲精品乱码久久久久久蜜桃91 | 特及黄色片 | 中文字幕视频观看 | 国产精品成人久久久 | 亚洲成人免费在线 | 国产精品一区二区三区视频免费 | 粉嫩av一区二区三区四区五区 | 四虎永久精品在线 | 午夜婷婷综合 | 中文字幕日韩av | 久久视频在线免费观看 | 精品视频资源站 | 天天色天天操天天爽 | 色综合久久综合 | 天天操夜操视频 | 在线观看色网 | 亚洲精品乱码久久久久久蜜桃不爽 | 免费人成在线观看网站 | 99国产精品视频免费观看一公开 | 在线a亚洲视频播放在线观看 | 日韩伦理一区二区三区av在线 | 日韩一区二区三免费高清在线观看 | 国产99久久 | 成人黄色片在线播放 | 国产精品久久一卡二卡 | 亚洲麻豆精品 | 免费在线观看一区二区三区 | 91尤物国产尤物福利在线播放 | 国产一区福利在线 | 99久久精品久久亚洲精品 | 在线国产专区 | 国产中文字幕视频在线观看 | 这里只有精彩视频 | 美女网站在线看 | 激情深爱 | 99精品黄色片免费大全 | 色a资源在线 | 久久精品国产一区二区三区 | 在线观看视频日韩 | 99九九99九九九视频精品 | 久久精久久精 | 一级片视频在线 | 91福利区一区二区三区 | 久久五月天婷婷 | 亚洲乱码国产乱码精品天美传媒 | 在线 国产 亚洲 欧美 | 中文字幕中文 | av片中文 | 免费在线观看日韩视频 | 亚洲激情精品 | 亚洲精品国产精品乱码不99热 | 97理论电影 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 一区二区三区免费网站 | 国产高清久久久久 | 中文在线8新资源库 | 韩国av一区二区三区在线观看 | 国内久久精品 | 三级在线播放视频 | 久久久午夜精品理论片中文字幕 | 精品一区av| 亚洲精品乱码久久久久久高潮 | 四虎国产永久在线精品 | 黄色毛片视频免费 | 51久久成人国产精品麻豆 | 中文字幕色在线视频 | 日韩v在线91成人自拍 | 少妇精品久久久一区二区免费 | 精品视频999 | 1024手机在线看 | 免费在线国产视频 | 国产精品18久久久 | 91在线麻豆 | 在线观看黄 | 一级黄色片在线 | 99久久久久久久久 | 久久精品视频日本 | 日日操网站 | 精品黄色在线 | av免费观看在线 | 久久精品9 | 黄色特一级| 天天插天天操天天干 | 97国产精品一区二区 | 日本黄色大片免费看 | 久久视频在线观看中文字幕 | 在线观看免费日韩 | 成人一区二区在线 | 色综合久久综合网 | 99久久精品免费视频 | 日韩综合一区二区三区 | 91黄色在线视频 | 久久人人做 | 51精品国自产在线 | 天天插天天操天天干 | 中文字幕91视频 | 99精品视频在线观看播放 | 成人免费视频网站在线观看 | 天堂av免费在线 | 人人插人人插 | 在线观看不卡的av | 丁香婷婷综合五月 | 久久优 | 日本精品视频在线观看 | av在线免费在线 | 国产精品久久久久久久免费 | 爱爱av网| 日免费视频 | 久久99久久99精品免视看婷婷 | 日韩精品一区二区三区免费观看视频 | 99在线免费观看 | 中文字幕你懂的 | 欧美激情h | 99色人 | 国产精品成人一区二区 | www亚洲精品 | av在线进入 | 999日韩 | 日日干夜夜草 | 国产一级片一区二区三区 | 日韩综合精品 | www夜夜操com | 黄色资源在线观看 | 久久观看最新视频 | 国产成人精品久久亚洲高清不卡 | 久久久久国产精品免费网站 | 99久久99热这里只有精品 | 色噜噜狠狠狠狠色综合 | 色综合 久久精品 | 精品福利片 | 99精品免费 | 在线天堂v | 人人爱在线视频 | 欧美福利久久 | 国产精品激情在线观看 | 日韩视频免费观看高清完整版在线 | 亚洲午夜精品在线观看 | japanesefreesex中国少妇 | 91完整视频| 国产精品亚洲视频 | 久久私人影院 | 黄色一级在线观看 | 久久国产精品一区二区三区 | 97精品伊人 | 激情久久一区二区三区 | 久久99久久久久 | 国产精品中文 | 免费在线黄色av | 中文字幕视频观看 | 午夜国产一区二区 | 在线小视频 | 久草视频2 | 91 在线视频播放 | 中文字幕美女免费在线 | 毛片在线播放网址 | 激情 一区二区 | 91爱在线| 摸阴视频| 国产高清免费 | 欧美黄色软件 | 欧美日韩高清一区二区三区 | 欧美性黑人| 天天干天天做 | 97免费在线观看 | 免费看国产黄色 | 日韩黄色影院 | 99热免费在线 | 伊人久久五月天 | 中文字幕 在线看 | 国产专区日韩专区 | 中文字幕中文字幕 | 成年人免费在线观看 | 五月婷婷.com | 色姑娘综合网 | 国产精品 日本 | 丰满少妇在线观看 | 午夜精品视频一区二区三区在线看 | 免费男女羞羞的视频网站中文字幕 | 国产91精品一区二区麻豆网站 | 天天操夜夜做 | 99色国产| 亚洲一级特黄 | 国产日韩精品一区二区三区 | 东方av免费在线观看 | 美女网站色在线观看 | 可以免费观看的av片 | 奇米影视8888 | 蜜臀av一区二区 | 欧美二区三区91 | av高清免费在线 | 91大神电影| 色噜噜噜噜 | 欧美爽爽爽| 9免费视频| 黄色毛片视频免费观看中文 | 亚洲精品黄 | 精品福利网 | 在线免费视频 你懂得 | 99c视频在线| 日韩精品极品视频 | 麻豆视频在线免费 | 天天精品视频 | 欧美成人999 | 在线免费观看视频你懂的 | 精品久操 | 福利视频第一页 | 成人免费视频网站 | 欧美激情奇米色 | 2019精品手机国产品在线 | 久久午夜精品影院一区 | av官网| 在线电影a| 日韩免费视频 | av在线免费播放网站 | 成年人黄色免费网站 | 又黄又爽又色无遮挡免费 | 成人在线黄色电影 | 中文字幕国产精品 | 精品国产一区二区三区在线观看 | 国产 精品 资源 | 国产成人一级电影 | 国产成人免费在线观看 | 男女激情免费网站 | a久久久久 | 日韩在线观看影院 | 国产精品久久综合 | 国产女教师精品久久av | 亚洲综合色婷婷 | 一区二区不卡在线观看 | 91精品系列 | 亚洲高清视频在线 | 国产成人福利在线观看 | 色狠狠一区二区 | 在线观看黄色小视频 | h视频在线看 | 国产亚洲无| 91精品国产福利在线观看 | 日本三级不卡视频 | 国产精品99蜜臀久久不卡二区 | 精品极品在线 | 超碰av在线播放 | 毛片一级免费一级 | 97操操| 狠狠狠狠干 | 国产一级免费片 | 久久草在线精品 | 国产精品一区二区免费视频 | 国产黄网站在线观看 | 精品国产日本 | 久久精品国产亚洲a | 99热在线观看免费 | 亚洲欧美精品一区二区 | 亚洲视频,欧洲视频 | 亚洲一区免费在线 | 91av观看 | 奇米网在线观看 | 午夜在线免费视频 | 天天操天天色天天射 | 99精品久久精品一区二区 | 国产一区免费在线观看 | 97狠狠干| 欧美激情精品久久 | japanesefreesexvideo高潮 | 日韩一区精品 | 国产免费专区 | 国内精品久久天天躁人人爽 | 免费在线观看av网站 | 一级片视频在线 | 97超碰人人爱 | 日本一区二区高清不卡 | 国产中文a | 97在线影院| 亚洲黄色小说网址 | 久久国内精品99久久6app | 欧美中文字幕久久 | 天天射射天天 | 国产在线不卡 | 久久久麻豆精品一区二区 | 国产一级片免费视频 | 人人爽人人射 | 91精品国产综合久久福利不卡 | 日本狠狠干 | 久草在线免费在线观看 | 丁香花在线观看视频在线 | 日韩激情小视频 | 久久中文字幕导航 | 欧美aa一级 | 久久久国产精品一区二区三区 | 午夜精品久久久久久中宇69 | 亚洲aⅴ免费在线观看 | 免费亚洲电影 | 午夜av免费在线观看 | 免费日韩 精品中文字幕视频在线 | 日产乱码一二三区别在线 | 欧美日韩国产网站 | 中文字幕一区二区三区乱码不卡 | 国产一级精品在线观看 | 国产很黄很色的视频 | 精品国产乱码一区二区三区在线 | 99视频偷窥在线精品国自产拍 | 久久亚洲免费视频 | 色爱区综合激月婷婷 | a黄色片在线观看 | 91日本在线播放 | 欧美另类人妖 | 韩日电影在线免费看 | 9在线观看免费高清完整版在线观看明 | 在线观看网站黄 | 亚洲人成人在线 | 精产嫩模国品一二三区 | 超碰人人草 | 久久国产精品免费一区 | 国产精品永久免费观看 | 免费黄a | 91免费观看视频网站 | 狠狠综合网 | 中文字幕一区二区三区在线观看 | 狠狠干夜夜操天天爽 | 99色在线观看视频 | 九九视频免费观看视频精品 | 综合天天网 | 美女福利视频 | 亚洲精品国产精品乱码在线观看 | 97视频资源 | 最近中文字幕高清字幕免费mv | 色综合天天综合 | h动漫中文字幕 | 国产精品手机在线播放 | 精品日韩av| av不卡中文字幕 | 一区精品久久 | 亚洲精品久久久久久久不卡四虎 | 国产日韩欧美在线一区 | 精品亚洲免a | 91精品视频在线 | 久久99久久99精品中文字幕 | 久久久不卡影院 | 久久www免费人成看片高清 | 五月天色网站 | 天天综合中文 | 91在线免费公开视频 | 九九三级毛片 | 中文字幕在线日亚洲9 | 一区二区电影网 | 国产一区电影在线观看 | 婷婷免费视频 | 午夜影视剧场 | 日本久久久久久久久 | 丝袜精品视频 | 国产69精品久久久久久 | 国产高清视频免费观看 | www.亚洲精品 | 天天综合成人 | 婷婷婷国产在线视频 | 最新av电影网址 | 国产精品一区免费看8c0m | www.伊人网| 人人看人人做人人澡 | 日本公妇在线观看 | 午夜色场 | 国产原创av片 | 中文字幕电影高清在线观看 | 欧美少妇xxx| 色婷婷a | 国产精品视频大全 | 97人人艹 | 国内精品福利视频 | 九色视频网址 | 在线观看片 | 97人人人| 日韩无在线 | 久久久精品久久 | 中文在线最新版天堂 | 涩涩网站在线播放 | 五月婷网站 | 日韩女同av | 久久午夜国产精品 | 成人一级片免费看 | 日韩欧美大片免费观看 | 91人人澡人人爽 | www.com操| 波多在线视频 | 日一日操一操 | 亚洲人久久久 | 国产精品久久久久三级 | 亚洲色五月 | 久草在线视频精品 | 二区在线播放 | 国产三级视频在线 | 国产成人福利片 | 国产91对白在线播 | 操操操日日日 | 久久免费片| 国产免费亚洲高清 | 91日韩国产| 在线播放你懂 | 五月婷婷综 | 色婷久久 | avove黑丝 | 久久天天躁狠狠躁亚洲综合公司 | 最新精品视频在线 | 成片视频免费观看 | 麻豆va一区二区三区久久浪 | 成人av av在线 | 激情综合亚洲精品 | 美女国内精品自产拍在线播放 | 最新色站| 国产流白浆高潮在线观看 | 中文字幕在线视频网站 | 91影视成人 | 国产精品理论片 | 日韩xxxxxxxxx | 91精品国产综合久久婷婷香蕉 | 日日草天天草 | 日韩有码专区 | 爱爱一区| www.狠狠| 免费网站色 | 国产精品免费看 | 欧美激情精品久久久久久免费 | 69绿帽绿奴3pvideos | 国产视频 久久久 | 美女网站色 | 国产精品 中文字幕 亚洲 欧美 | 五月婷婷av在线 | 久久久久久久久网站 | 丁香婷婷激情国产高清秒播 | 免费在线观看日韩欧美 | 欧美激情第一区 | 天天综合五月天 | 国产视频资源 | 韩日精品在线 | 视频在线91| 在线视频一区二区 | 91桃色免费观看 | 久久视频热| 欧美一区二区三区激情视频 | 成人午夜精品 | 成人资源在线 | 91在线看网站| 91精品少妇偷拍99 | 国产精品久久久久久久久久东京 | 天天躁天天狠天天透 | 特级西西人体444是什么意思 | 久久亚洲精品国产亚洲老地址 | 亚洲精品欧美专区 | 国产电影黄色av | 少妇自拍av | 亚洲精品高清一区二区三区四区 | 精选久久 | 欧美日韩精品在线免费观看 | 中文字幕网站 | 精品国偷自产在线 | 黄p在线播放 | 综合久久久 | 伊人亚洲精品 | 国产一级二级三级在线观看 | 97成人免费视频 | 成人av一区二区在线观看 | 国产流白浆高潮在线观看 | 1024手机基地在线观看 | 国模精品一区二区三区 | 96精品高清视频在线观看软件特色 | 国产青草视频在线观看 | 成年人在线观看网站 | 免费观看丰满少妇做爰 | 国产精品video爽爽爽爽 | 免费网站在线观看人 | 日韩午夜电影网 | 在线免费观看av网站 | 超碰在线观看av.com | 国产一区二区视频在线播放 | 在线一级片 | 日本99精品 | 黄色一级动作片 | 中国一级片在线播放 | 国产精品乱码一区二区视频 | 精品国产伦一区二区三区观看说明 | 少妇bbb搡bbbb搡bbbb | 国产精品久久久久久久久婷婷 | h视频在线看 | 在线有码中文 | 国产在线播放一区二区三区 | 97中文字幕 | 久久视频在线免费观看 | 视频1区2区| 精品久久久久久久久中文字幕 | 婷婷综合网 | 久久国产精品99精国产 | 91av小视频| 国产亚洲成av片在线观看 | 超碰在线色 | 国产女人18毛片水真多18精品 | 国产视频二区三区 | 特级毛片在线免费观看 | 欧美激情亚洲综合 | 国产丝袜一区二区三区 | 久久久久久久99精品免费观看 | 精品成人免费 | 亚洲欧美日韩精品一区二区 | 亚洲免费在线看 | 日本三级大片 | 国产精品一区二区免费视频 | 日韩在线视 | 久久99精品国产99久久6尤 | 中文字幕免费在线 | www.av免费| 日韩一区二区三区免费视频 | www黄色com| 色av男人的天堂免费在线 | 久久久视频在线 | 亚洲综合成人婷婷小说 | 国产一级做a爱片久久毛片a | 亚洲日b视频 | 深夜男人影院 | 日韩a级黄色| 精品免费一区 | a视频免费在线观看 | 成人99免费视频 | 国产精品久久一区二区三区不卡 | 五月婷婷中文网 | 人人澡澡人人 | 在线91精品 | 黄色av电影一级片 | 午夜视频亚洲 | 天天综合久久综合 | 久久久久久蜜桃一区二区 | 天天操天天舔天天干 | 日韩三区在线 | 麻豆一区二区三区视频 | 中文永久免费观看 | 中文字幕欧美激情 | av在线之家电影网站 | 韩国av三级| 欧美在线资源 | 狠狠的干狠狠的操 | 99精品免费久久久久久久久日本 | 91九色网站 | 中文字幕亚洲欧美日韩2019 | 久久九九视频 | 蜜臀久久99精品久久久无需会员 | 97精品国自产拍在线观看 | 久久久美女 | 亚洲va在线va天堂va偷拍 | 激情丁香婷婷 | 蜜臀av性久久久久蜜臀aⅴ四虎 | 国产精品专区一 | 美女精品久久久 | 久久婷婷一区二区三区 | 97精品国产aⅴ | 又黄又爽又无遮挡免费的网站 | 91高清免费在线观看 | 日韩网站中文字幕 | 手机av看片 | 精品电影一区 | 欧美-第1页-屁屁影院 | 狠狠色丁香久久婷婷综 | 97超碰在线资源 | 亚洲国产色一区 | 亚洲综合色播 | 91视频久久久久久 | 91av电影| 国产精品久久久久久久久久久免费看 | 91色国产在线 | 精品视频久久久 | 91精品中文字幕 | 在线观看a视频 | 日韩在线视频网站 | 亚洲免费观看视频 | 欧美精品在线观看一区 | 在线视频观看你懂的 | 操操操操网 | 日本在线中文在线 | 在线免费观看麻豆视频 | 男女免费视频观看 | 久久九九国产视频 | 亚洲精品一区二区三区新线路 | 在线观看午夜av | 亚洲午夜精品久久久久久久久 | 夜夜夜草 | 免费看一级一片 | 97在线观看视频免费 | 国产99久久久国产精品成人免费 | 综合激情网... | 黄污视频网站大全 | 亚洲综合涩 | 99久久夜色精品国产亚洲96 | 亚洲精品激情 | 久久精品99视频 | 欧洲黄色片 | 日韩精品久久久久久久电影竹菊 | 日本精品一区二区 | 91久久久国产精品 | 五月天天在线 | 婷婷综合亚洲 | 中文字幕在线观看免费高清完整版 | 久青草视频在线观看 | 9幺看片| 在线免费观看的av网站 | 中文字幕免费观看视频 | 中文字幕视频一区 | 久草国产在线观看 | 日韩二区在线 | 五月婷婷黄色 | 亚洲精品中文字幕视频 | 亚洲成人黄 | 狠狠色狠狠色综合系列 | av一区二区三区在线播放 | 国产a级精品 | 999热线在线观看 | 精品视频免费久久久看 | 五月婷婷天堂 | 成av在线 | 国产偷v国产偷∨精品视频 在线草 | 色天天中文 | 国产中文在线字幕 | 日日干综合| 国产精品中文字幕在线播放 | 久草在线资源视频 | 日日干美女 | 激情五月婷婷网 | 亚洲精品视频免费看 | 国产一级在线免费观看 | 人人躁| 青草视频在线免费 | 国产美女在线精品免费观看 | 国产成人三级一区二区在线观看一 | 日韩黄色免费看 | 免费网站色 | 欧美精品日韩 | 综合久久久久久 | 亚洲精品国产自产拍在线观看 | 五月激情婷婷丁香 | 伊人永久 | 一区二区三区四区影院 | 在线观看视频黄色 | 超碰在线成人 | 欧美aaa级片| 午夜视频在线网站 | 欧美色婷| av成人在线电影 | 免费看的国产视频网站 | 久久精品欧美视频 | 精品人妖videos欧美人妖 | 国产三级精品三级在线观看 | 日韩精品一区二区三区免费观看 | 射射射av | 久久精品久久精品久久 | 亚洲精品资源 | 国产日韩欧美中文 | 久久午夜电影 | 欧美性爽爽 | 婷婷六月色 | 天天干夜夜干 | 黄色一及电影 | 在线观看视频精品 | 97精品国产97久久久久久 | 亚洲精品视频在线观看免费视频 | 国产成人一区二区三区 | 中文国产成人精品久久一 | 欧美成年人在线视频 | 国产精品福利无圣光在线一区 | 日本高清中文字幕有码在线 | 国产成人一区在线 | 欧美一进一出抽搐大尺度视频 | 国内精品久久久久久久97牛牛 | 波多野结衣视频一区 | 日韩av偷拍 | 在线播放日韩av | 欧美成人黄 | 免费三级av | 草久在线 | 欧美一区二区三区在线播放 | 超碰精品在线 | 午夜av在线 | 久久亚洲免费视频 | 日韩高清在线一区二区三区 | 超碰国产在线 | av色网站| 免费看高清毛片 | 久久伊人八月婷婷综合激情 | 免费观看91视频 | 国产三级午夜理伦三级 | 国产一卡二卡四卡国 | 亚洲欧美视频在线 | 天天干天天操天天爱 | 国产美女视频 | 国产一级一片免费播放放 | 99精品在线| 日本三级国产 | 国产高清视频免费观看 | 99久久精品国产一区 | 日韩精品久久久久久久电影竹菊 | 日韩视频一 | 久久电影国产免费久久电影 | 91色综合 | av高清在线观看 | 又黄又爽的视频在线观看网站 | 三级av在线| 日本中文一区二区 | 日韩理论电影在线观看 | 黄色一级大片免费看 | 久久天天躁夜夜躁狠狠躁2022 | caobi视频| 国产精品igao视频网网址 | 欧美天天射 | 99久久精品免费看国产四区 | 日韩av免费在线电影 | 国产伦精品一区二区三区在线 | 13日本xxxxxⅹxxx20| a级一a一级在线观看 | 中文字幕日韩一区二区三区不卡 | 亚洲国产一区在线观看 | 色婷婷a| 精品国产乱码久久久久 | 在线国产一区二区三区 | 久久99这里只有精品 | 国产片网站 | 免费看三级网站 | 亚洲在线日韩 | 一级片视频在线 | 亚洲成av人片在线观看www | 这里只有精彩视频 | 亚洲成人国产精品 | 亚洲涩涩涩涩涩涩 | 国产不卡网站 | 丁香六月婷 | 最近日韩中文字幕中文 | 亚洲精欧美一区二区精品 | www.亚洲黄 | 欧美美女视频在线观看 | 色人久久| 国内精品久久久久久久久久久 | 尤物九九久久国产精品的分类 | 欧美精品中文字幕亚洲专区 | 色网站在线观看 | 国产精品mm | 在线一二三四区 | 国产一区二区综合 | 久久久综合香蕉尹人综合网 | 玖玖视频精品 | 国产精品美女久久久久久久久 |