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

親身體驗CORBA: 使用java和C++混合編程

開發 后端
本文作者通過一次使用SUN的 tnameserv命名服務程序,服務器用JAVA編寫,客戶機分別用JAVA和C++(VC6+omniORB)編寫的試驗,希望通過一次編程的具體操作實例來體驗或明了CORBA思想。

前  言

現在很多人在對CORBA進行學習,大家都已經了解到CORBA是一個完全中間性的語言,可以使用接口定義語言(IDL)定義開發時使用接口的 Client 和實現接口的 Server 所需要的信息。Client 和 Server 的具體實現代碼并不在IDL定義中編寫,而是使用某種目標語言的IDL 編譯器生成所需的代碼存根及helper類,Client 和 Server再使用真正的編程語言來進行具體實現。

為了保證在不同的 CORBA 產品基礎之上構建的分布式對象可以相互通信,Client和Server通過ORB(對象請求代理)進行通信。一般的運行流程是Client把請求發送給ORB,ORB再把請求發送給Server,Server把返回結果發送ORB,ORB再把返回結果發送給Client。ORB可以說Client和Server之間的翻譯者。即使Client和Server使用不同的編程語言編寫,只要是符合相同的IDL定義,ORB也可以完成相互的通信。

所有的文檔在強調服務器及客戶機可以是Java也可以是C++或其他語言(如:Delphi)進行編寫,但在網站或書本是沒有詳細說如何應對多語言客戶機的例子。《JAVA2核心技術》上面有些說明,但也只是介紹性的文章,故自己下載了omniORB304,進行了一次使用SUN的 tnameserv命名服務程序,服務器用JAVA編寫,客戶機分別用JAVA和C++(VC6+omniORB)編寫的試驗,希望通過一次編程的具體操作實例來體驗或明了CORBA思想。

總體的編寫過程如下:

  • 用IDL定義一個接口文件,描繪要實現的功能,也可以說是定義一個要實現功能的一個模版(SysProp.idl)
  • 使用"IDL to Java"編譯器(這里是IDLJ)將IDL文件轉化為Java編程語言中編寫的接口定義,生成所需的代碼存根及helper類
  • 使用Java語言編寫客戶機和服務器的實現程序。
  • 使用"IDL to C++"編譯器(這里是omniidl)將IDL文件轉化為C++編程語言中編寫的接口定義,生成所需的代碼存根及helper類
  • 使用C++語言編寫客戶機實現程序(當然也可編寫服務器程序,但本次試驗沒有進行)
  • 起動命名服務tnameserv
  • 起動Java編寫的服務程序
  • 用Java和C++編寫的客戶機分別調用相應的服務

運行環境的設定:

總體環境由jdk1.3+omniORB3.0(www.uk.research.att.com\omniORB\doc\3.0) +vc6 組成,下面說明具體的安裝。

2.1. 安裝JDK1.3

從SUN公司DOWN JDK1.3或者通過其他方式得到jdk1.3進行安裝,再設定相應的環境變量,在本文測試用的電腦上是如下所示:

  1. CLASSPATH=.;  
  2.             JAVA_HOME=D:\jdk130 

修改原來的PATH變量,添加"%JAVA_HOME%\bin;",如下

  1. PTAH=%JAVA_HOME%\bin;原變量 

注意:我在第一次使用jbuilder的jdk1.3時,服務器不能正常工作,我只是發覺這么一回事,具體原因與本文無關而沒有進行了解,請諒。

2.2. 安裝VC6

VC6按常規方式安裝,注意的是:在本文測試用的電腦上安裝在如下位置

C:\Program Files\Microsoft Visual Studio

2.3. 安裝omniORB

從 www.uk.research.att.com\omniORB\doc\3.0 下載omniORB3.0 ( 本文測試所下載的文件是 omniORB_304_x86_win32.zip )。

用WINZIP進行解壓omniORB_304_x86_win32.zip到omniORB_304_x86_win32目錄,目錄內存在omni目錄,復制omni目錄內的文件到你把想存放的位置。

測試電腦安裝在 C:\omni

根據C:\omni\README.win32 文檔進行設定,由于運行程序及命令行在控制臺進行,所以本次測試并不根據文檔要求去設定環境變量,而是編寫了一個omni.bat,在使用控制臺時,首先運行。

本測試電腦omni.bat內容如下

  1. set TOP=c:\omni  
  2.             set path=%TOP%\bin\x86_win32;%path%  
  3.             set LIB=%TOP%\bin\x86_win32;%LIB%  
  4.             set INCLUDE=%TOP%\include;%INCLUDE%  
  5.             set VcOsDir=  
  6.             set VSCommonDir

如果你的電腦VC的環境變量已經設定在你的環境變量中,那么C:\Program Files\Microsoft Visual Studio\VC98\Bin\VCVARS32.BAT 就可以不運行。否則運行omni.bat前要首先運行VCVARS32.BAT。

實踐過程

約定所有編寫的文件保存在D:\mywork\t1中,omni.bat也在這個目錄內

3.1. 編寫SysProp.idl,功能是返回系統屬性

  1. interface SysProp  
  2.             {  string getProperty(in string name);  
  3.             }; 

3.2. 編寫JAVA的服務器

3.2.1. 把IDL文件轉化為JAVA編程語言代碼存根類及helper類。

執行如下命令

  1. idlj -fall SysProp.idl 

在正常的情況下D:\mywork\t1 目錄內將生成以下文件,否則請檢查你的執行程序及文件

SysProp.java 
SysPropHelper.java 
SysPropHolder.java 
SysPropOperations.java 
_SysPropImplBase.java 
_SysPropStub.java

3.2.2. 編寫 SysPropServer.java

  1. import org.omg.CosNaming.*;  
  2.             import org.omg.CORBA.*; 

//編寫相對應的服務,一定要從 _類名ImplBase繼承,并實現相應的方法 class SysPropS extends _SysPropImplBase //具體的服務實現

  1. {  public String getProperty(String key)  
  2.             {  
  3.             System.out.println("調用"+key);  
  4.             String S;  
  5.             S=System.getProperty(key);  
  6.             if (S==null)   { S="null"; }  
  7.             System.out.println(key+"="+S);  
  8.             return S;  
  9.             }  
  10.             }  
  11.             public class SysPropServer          //起動服務的程序  
  12.             {  public static void main(String args[])  
  13.             {  try 
  14.             {  System.out.println("創建和初始化 ORB ");  
  15.             ORB orb = ORB.init(args, null);  
  16.             System.out.println("創建服務對象并將其向 ORB 注冊 ");  
  17.             SysPropS impl = new SysPropS();  
  18.             orb.connect(impl);  
  19.             //打印IOR字符串  
  20.             System.out.println(orb.object_to_string(impl));  
  21.             org.omg.CORBA.Object namingContextObj =orb.resolve_initial_references("NameService");  
  22.                      NamingContext namingContext= NamingContextHelper.narrow(namingContextObj);  
  23.             NameComponent[] path = {new NameComponent("SysProp""")};  
  24.             System.out.println("綁定服務...SysPropS");  
  25.             namingContext.rebind(path, impl);  
  26.             System.out.println("等待調用...SysPropS");  
  27.             java.lang.Object sync = new java.lang.Object();  
  28.             synchronized (sync)  
  29.             {  sync.wait();  
  30.             }  
  31.             }  
  32.             catch (Exception e)  
  33.             {   System.err.println("Error: " + e);  
  34.             e.printStackTrace(System.out);  
  35.             }  
  36.             }  
  37.             } 

3.3. 編寫JAVA的客戶機

3.3.1. 編寫 SysPropClient.java 使用IOR字符串的方式

注意在代碼內有一段注解掉的代碼,用"//使用ORB的方法的開始"開始,用"//使用ORB的方法的結束"結束。這段代碼是使用ORB方法的代碼,如果在代碼中"//使用IOR的方法開始"前一行添加"/*",在"//使用IOR的方法結束"后一行添加"*/",而把"//使用ORB的方法的開始"前面的"/*"去掉,把"//使用ORB的方法的結束"后面的"*/"去掉,就是使用ORB方法的代碼,程序運行時就是" SysPropClient [環境變量] "的方式。以下是具體代碼:

  1. import org.omg.CosNaming.*;  
  2.             import org.omg.CORBA.*;  
  3.             public class SysPropClient  
  4.             {  
  5.             public static void main(String args[])  
  6.             {  
  7.             try{  
  8.             String SetInfo,ReturnInfo,ref;  
  9.             org.omg.CORBA.Object objRef;  
  10.             SysProp syspropRef;  
  11.             ORB orb = ORB.init(args, null);  
  12.             //使用IOR的方法開始  
  13.             if (args.length>=1)  
  14.             {  
  15.             ref=args[0];  
  16.             }  
  17.             else 
  18.             {  
  19.             System.out.println("SysPropClient <IOR字符串>  [環境變量]");  
  20.             return;  
  21.             }  
  22.             objRef = orb.string_to_object(ref);  
  23.             syspropRef = SysPropHelper.narrow(objRef);  
  24.             //使用IOR的方法結束  
  25.             /*  
  26.             //使用ORB的方法的開始  
  27.             objRef = orb.resolve_initial_references("NameService");  
  28.             NamingContext ncRef = NamingContextHelper.narrow(objRef);  
  29.             // 進行服務定位  
  30.             NameComponent nc = new NameComponent("SysProp", "");  
  31.             NameComponent path[] = {nc};  
  32.             syspropRef = SysPropHelper.narrow(ncRef.resolve(path));  
  33.             //使用ORB的方法的開始結束  
  34.             */ 
  35.             if (args.length>1)  
  36.             {  
  37.             SetInfo=args[1];  
  38.             }  
  39.             else 
  40.             {  
  41.             SetInfo="java.home";  
  42.             }  
  43.             System.out.println("開始調用");  
  44.             ReturnInfo = syspropRef.getProperty(SetInfo);  
  45.             System.out.println(SetInfo+"="+ReturnInfo);  
  46.             } catch (Exception e) {  
  47.             System.out.println("ERROR : " + e) ;  
  48.             }  
  49.             }  
  50.             } 

3.3.2. 編譯程序,在文件目錄內執行如下命令

jAVAC *.JAVA

3.4. 進行測試

第1控制臺,執行

tnameserv

測試時如下所示

  1. D:\mywork\t1>java tnameserv  
  2.             Initial Naming Context:  
  3.             IOR:000000000000002849444c3a6f6d672e6f72672f436f734e616d696e672f4e616d696e67436f  
  4.             6e746578743a312e3000000000010000000000000054000101000000000c3139322e3136382e302e  
  5.             31000ca6000000000018afabcafe00000002a999c474000000080000000000000000000000010000  
  6.             0001000000140000000000010020000000000001010000000000  
  7.             TransientNameServer: setting port for initial object references to: 900  
  8.             Ready. 

第2控制臺,執行

java SysPropServer

測試時如下所示

  1. D:\mywork\t1>java SysPropServer  
  2.             創建和初始化 ORB  
  3.             創建服務對象并將其向 ORB 注冊  
  4.             IOR:000000000000001049444c3a53797350726f703a312e30000000000100000000000000540001  
  5.             01000000000c3139322e3136382e302e31000ca7000000000018afabcafe00000002a999dbeb0000  
  6.             00080000000000000000000000010000000100000014000000000001002000000000000101000000  
  7.             0000  
  8.             綁定服務...SysPropS  
  9.             等待調用...SysPropS 

第3控制臺,執行

java SysPropClient IOR:XXX JAVA.HOME

測試時如下所示

  1. D:\mywork\t1>java SysPropClient IOR:000000000000001049444c3a53797350726f703a312e  
  2.             3000000000010000000000000054000101000000000c3139322e3136382e302e31000ca700000000  
  3.             0018afabcafe00000002a999dbeb0000000800000000000000000000000100000001000000140000  
  4.             000000010020000000000001010000000000 java.home  
  5.             開始調用  
  6.             java.home=D:\bea\jdk130\jre  
  7.              

3.5. 編寫C++的IOR客戶機

從實踐來講編寫C++的客戶機程序同JAVA沒有多大的區別,只不過JAVA是用idlj生成代碼存根類及helper類,而omni是用omniidl來生成代碼存根類及helper類,而編程思想及編碼過程非常相似。

由于C++的程序要調用omni及VC6的相關文件,所以進入控制臺后,如果VC沒有進行環境變量設定,那么要先運行 C:\Program Files\Microsoft Visual Studio\VC98\Bin\VCVARS32.BAT,再運行omni.bat,否則直接運行omni.bat后再編譯程序及運行程序。

3.5.1. 把IDL文件轉化為C++編程語言代碼存根類及helper類。

執行如下命令

omniidl -bcxx SysProp.idl

在正常的情況下D:\mywork\t1 目錄內將生成C++編程語言的代碼存根類及helper類SysProp.hh和SysPropSK.cc。否則請檢查你的執行程序及文件。

3.5.2. 編寫SysPropC.cc

  1. #include <iostream.h>  
  2.             #include <SysProp.hh>  
  3.             int main(int argc, char** argv)  
  4.             {  
  5.             try {  
  6.             CORBA::ORB_var orb = CORBA::ORB_init(argc, argv, "omniORB3");  
  7.             if( argc < 2 || argc > 3 ) {  
  8.             cout << "usage:  SysPropC <IOR字符串> [環境變量名]" << endl;  
  9.             return 1;  
  10.             }  
  11.             CORBA::Object_var obj = orb->string_to_object(argv[1]);  
  12.             SysProp_ptr echoref = SysProp::_narrow(obj);  
  13.             if( CORBA::is_nil(echoref) ) {  
  14.             cerr << "沒有對象" << endl;  
  15.             return 1;  
  16.             }  
  17.             const char* message;  
  18.             if (argc==3)  
  19.             {  
  20.             message=argv[2];  
  21.             }  
  22.             else 
  23.             {  
  24.             message="java.home";  
  25.             }  
  26.             CORBA::String_var dest = echoref->getProperty(message);  
  27.             cout <<  (char*)message << "=" <<(char*)dest << endl;  
  28.             orb->destroy();  
  29.             }  
  30.             catch(...) {  
  31.             cerr << "Caught unknown exception." << endl;  
  32.             }  
  33.             return 0;  
  34.             }  
  35.              

3.5.3. 編寫dirc.mak,如下所示

  1. TOP = C:\omni  
  2.             OMNI_DYNAMIC_LIB = msvcstub.lib -NODEFAULTLIB:libcmt.lib -NODEFAULTLIB:libcmtd.lib  
  3.             CORBA_CPPFLAGS = -D__WIN32__ -D__x86__ -D__NT__ -D__OSVERSION__=4 
  4.             CORBA_LIB      = omniORB304_rt.lib omnithread2_rt.lib \  
  5.             $(OMNI_DYNAMIC_LIB) \  
  6.             wsock32.lib advapi32.lib \  
  7.             -libpath:$(TOP)\lib\x86_win32  
  8.             CXXFLAGS       = -O2 -MD -GX $(CORBA_CPPFLAGS) $(DIR_CPPFLAGS)  
  9.             CXXLINKOPTIONS =  
  10.             .SUFFIXES: .cc  
  11.             .cc.obj:  
  12.             cl /nologo /c $(CXXFLAGS) /Tp$<  
  13.             all:: SysPropC.exe  
  14.             SysPropC.exe: SysPropSK.obj SysPropC.obj  
  15.             link -nologo $(CXXLINKOPTIONS) -out:$@ $** $(CORBA_LIB)  
  16.             clean::  
  17.             -del *.obj  
  18.             -del *.exe  
  19.             veryclean::  
  20.             -del *.obj  
  21.             -del echoSK.* echo.hh  
  22.             -del *.exe  
  23.             SysProp.hh SysPropSK.cc: SysProp.idl  
  24.             $(TOP)\bin\x86_win32\omniidl -T -bcxx -Wbh=.hh -Wbs=SK.cc -Wbtp SysProp.idl 

3.5.4. 編譯程序,執行如下命令

nmake -f dirc.mak

3.5.5. 測試 

在第4控制臺

SysPropC IOR:XXX JAVA.HOME

本測試如下所示

  1. D:\mywork\t1>syspropc IOR:000000000000001049444c3a53797350726f703a312e3000000000  
  2.             010000000000000054000101000000000c3139322e3136382e302e31000ca7000000000018afabca  
  3.             fe00000002a999dbeb00000008000000000000000000000001000000010000001400000000000100  
  4.             20000000000001010000000000 os.name  
  5.             os.name=Windows 2000 

3.6. 編寫C++的NAME方式客戶機

為了使用NANE方式,必須為OMNI軟件設置注冊表信息,要在注冊表中建立如下數據項(regedit)HKEY_LOCAL_MACHINE\SOFTWARE\ORL\omniORB\2.0\NAMESERVICE(字符串)。

NAMESERVICE的值為tnameserv(jdk1.3\bin內的程序)啟動的IOR值(第一次設置時自行添加)。

注意為了使用這種方式每次起動tnameserv后要用新IOR值換去舊的IOR值,我測試過用omini的omniNames.exe程序做服務器,IOR值是不變的,但服務器用JVAV編寫就會出錯。如果起動tnameserv,用 c編寫的服務器及客戶機就可以在上面運行。本例子如下所示

  1. Initial Naming Context:  
  2.             IOR:000000000000002849444c3a6f6d672e6f72672f436f734e616d696e672f4e616d696e67436f  
  3.             6e746578743a312e3000000000010000000000000054000101000000000c3139322e3136382e302e  
  4.             31000ca6000000000018afabcafe00000002a999c474000000080000000000000000000000010000  
  5.             0001000000140000000000010020000000000001010000000000  
  6.             TransientNameServer: setting port for initial object references to: 900  
  7.             Ready. 

那么就要把從 IOR:開始(含IOR:)后面的字符串放進注冊表。

3.6.1. 編寫SysPropCC.cc

  1. //使用NAME方式的客戶機  
  2.             #include <iostream.h> 
  3.             #include "SysProp.hh"  
  4.             static CORBA::Object_ptr getObjectReference(CORBA::ORB_ptr orb);  
  5.             int main (int argc, char **argv)  
  6.             {  
  7.             if(  argc != 2 ) {  
  8.             cout << "使用方法: SysPropCC  <環境變量名><< endl;  
  9.             return 1;  
  10.             }  
  11.             try {  
  12.             CORBA::ORB_var orb = CORBA::ORB_init(argc, argv, "omniORB3");  
  13.             CORBA::Object_var obj = getObjectReference(orb);  
  14.             SysProp_ptr echoref = SysProp::_narrow(obj);  
  15.             const char* message;  
  16.             if (argc==2){message=argv[1];}  
  17.             else {message="java.home"; }  
  18.             CORBA::String_var dest = echoref->getProperty(message);  
  19.             cout <<  (char*)message << "=" <<(char*)dest << endl;  
  20.             orb->destroy();  
  21.             }  
  22.             catch(...) { cerr << "Caught unknown exception." << endl; }  
  23.             return 0;  
  24.             }  
  25.             //////////////////////////////////////////////////////////////////////  
  26.             static CORBA::Object_ptr getObjectReference(CORBA::ORB_ptr orb)  
  27.             {  
  28.             CosNaming::NamingContext_var rootContext;  
  29.             try {  
  30.             // 定位服務器:  
  31.             CORBA::Object_var obj;  
  32.             obj = orb->resolve_initial_references("NameService");  
  33.             // Narrow the reference returned.  
  34.             rootContext = CosNaming::NamingContext::_narrow(obj);  
  35.             if( CORBA::is_nil(rootContext) ) {  
  36.             cerr << " 初始化不成功." << endl;  
  37.             return CORBA::Object::_nil();  
  38.             }  
  39.             }  
  40.             catch(CORBA::ORB::InvalidName& ex) {  
  41.             cerr << " 沒有找到服務" << endl;  
  42.             return CORBA::Object::_nil();  
  43.             }  
  44.             CosNaming::Name name;  
  45.             name.length(1);  
  46.             name[0].id   = (const char*) "SysProp";  
  47.             name[0].kind = (const char*) "";  
  48.             try {  
  49.             // Resolve the name to an object reference.  
  50.             return rootContext->resolve(name);  
  51.             }  
  52.             catch(...) {  cerr << "定位不成功." << endl;}  
  53.             return CORBA::Object::_nil();  
  54.             } 

3.6.2. 編寫dircc.mak

  1. TOP = C:\omni  
  2.             DIR_CPPFLAGS   = -I. -I$(TOP)\include  
  3.             OMNI_DYNAMIC_LIB = msvcstub.lib -NODEFAULTLIB:libcmt.lib -NODEFAULTLIB:libcmtd.lib  
  4.             CORBA_CPPFLAGS = -D__WIN32__ -D__x86__ -D__NT__ -D__OSVERSION__=4 
  5.             CORBA_LIB      = omniORB304_rt.lib omnithread2_rt.lib \  
  6.             $(OMNI_DYNAMIC_LIB) \  
  7.             wsock32.lib advapi32.lib \  
  8.             -libpath:$(TOP)\lib\x86_win32  
  9.             CXXFLAGS       = -O2 -MD -GX $(CORBA_CPPFLAGS) $(DIR_CPPFLAGS)  
  10.             CXXLINKOPTIONS =  
  11.             .SUFFIXES: .cc  
  12.             .cc.obj:  
  13.             cl /nologo /c $(CXXFLAGS) /Tp$<  
  14.             all:: SysPropCc.exe  
  15.             SysPropCc.exe: SysPropSK.obj SysPropCc.obj  
  16.             link -nologo $(CXXLINKOPTIONS) -out:$@ $** $(CORBA_LIB)  
  17.             clean::  
  18.             -del *.obj  
  19.             -del *.exe  
  20.             veryclean::  
  21.             -del *.obj  
  22.             -del echoSK.* echo.hh  
  23.             -del *.exe  
  24.             SysProp.hh SysPropSK.cc: SysProp.idl  
  25.             $(TOP)\bin\x86_win32\omniidl -T -bcxx -Wbh=.hh -Wbs=SK.cc -Wbtp SysProp.idl 

3.6.3. 編譯文件

nmake -f dircc.mak

3.6.4. 測試

在第5控制臺

SysPropCC JAVA.HOME,

測試結果如下所示

  1. D:\mywork\t1>syspropcc java.home  
  2.             java.home=D:\bea\jdk130\jre 

小  結

另還使用了j2sdkee1.2.1進行測試,由于j2sdkee1.2.1起動時的nameserver的PORT是1050 所以啟動服務要加參數,對于本文中的程序運行時要如下所示:
java SysPropServer -ORBInitialPort 1050

如果用IOR的方式,也可以用omni的omniNames.exe程序做命名服務器,用C++編寫服務器,客戶機使用Java和C++編寫,c++編寫服務器的例子可見omni的文檔。

本次只是簡單進行了測試,可以使大家了解一下,CORBA的這種特性,多種不同程序語言進行協作編程的具體運作過程,希望可以拋磚引玉。

參考資料

《JAVA2核心技術 卷II:高級特性》(對于omniORB是2.0的例子)

《The omniORB version 3.0 User's Guid》(omniORB軟件內自帶)

原文鏈接:http://www.cnblogs.com/adylee/archive/2008/11/21/1338629.html

【編輯推薦】

  1. Java線程:線程安全與不安全
  2. Java NIO原理圖文分析及代碼實現
  3. Java RMI遠程調用
  4. 淺談Java的方法覆蓋與變量覆蓋
  5. Java類變量和成員變量初始化過程
責任編輯:林師授 來源: 王輝的博客
相關推薦

2009-07-20 09:53:43

Java混合編程

2011-07-01 14:55:28

Qt QML C++

2015-06-29 10:05:10

C#異步編程解析

2012-04-28 15:28:21

JNI混合編程Java

2011-02-15 13:12:02

JavaC++

2012-03-20 11:37:24

JavaJNI

2013-01-22 14:05:25

Fedora 18

2010-09-16 14:36:20

2011-12-29 10:13:48

FirefoxAndroid版

2010-09-17 13:47:35

2013-01-22 11:29:01

3D打印

2011-05-06 17:57:34

思維R800掃描儀

2010-05-06 10:17:58

混合編程Java程序員

2021-07-11 18:04:04

C語言

2010-01-11 09:40:02

C++語言

2011-10-27 18:06:24

思科網真

2011-05-30 15:29:32

C++

2022-05-12 11:41:16

開發框架程序

2010-01-18 17:14:50

C++語言

2011-05-18 17:56:38

C#C++
點贊
收藏

51CTO技術棧公眾號

青青草成人av| bl动漫在线观看| 久久精品www| 精品午夜电影| 欧洲一区在线观看| 400部精品国偷自产在线观看| 成人午夜福利视频| 日韩黄色片在线观看| 欧美成人黑人xx视频免费观看| 男人的天堂影院| 国产一区精品福利| 午夜一区二区三区视频| 一本一生久久a久久精品综合蜜| 亚洲欧美激情国产综合久久久| 肉肉av福利一精品导航| 欧美精品成人91久久久久久久| 久久成人激情视频| 国产毛片精品| 欧美视频一区二区三区四区| 国产玉足脚交久久欧美| 中文字幕 视频一区| 欧美精品播放| 久久精品国产清自在天天线 | 台湾天天综合人成在线| 亚洲成人你懂的| japanese在线视频| 国产高清视频在线| 99国产精品一区| 99国产超薄丝袜足j在线观看 | 欧美videos中文字幕| 国产一区二区在线免费播放| 日本午夜在线| 成人深夜视频在线观看| 91色在线视频| 136福利视频导航| 石原莉奈在线亚洲二区| 26uuu亚洲国产精品| 免费中文字幕在线观看| 亚洲精品国产首次亮相| 日韩一区二区三区国产| 亚洲日本精品视频| 久操精品在线| 精品中文字幕久久久久久| 性活交片大全免费看| 日韩中文字幕视频网| 欧美一区二区三区视频在线| 国产美女18xxxx免费视频| 成人看片网页| 欧美色精品在线视频| 美女一区二区三区视频| 免费**毛片在线| 国产精品电影一区二区| 性欧美精品一区二区三区在线播放| 色哟哟在线观看| 久久久一区二区三区捆绑**| 久久综合给合久久狠狠色| 污视频软件在线观看| 97久久久精品综合88久久| 精品日韩电影| 精品乱码一区二区三四区视频 | 日本人添下边视频免费| 999久久久精品一区二区| 精品久久免费看| www.四虎在线| 综合色就爱涩涩涩综合婷婷| 亚洲性av网站| 国精品人伦一区二区三区蜜桃| 99久久亚洲精品蜜臀| 超碰精品一区二区三区乱码| 久久中文字幕在线观看| aa国产精品| 国产精品高清在线| 97超碰人人草| 国产激情一区二区三区四区 | 欧美性感美女一区二区| www.国产精品一二区| 性欧美疯狂猛交69hd| 伊人久久大香线蕉av超碰| 精品免费国产一区二区三区四区| 久久久久久婷婷| 神马影视一区二区| www亚洲精品| 精品一区免费观看| 99欧美视频| 欧美黄色免费网站| 97在线观看免费高| 国产精品黄色| 日本亚洲欧洲色α| 国产三级按摩推拿按摩| 99久久久国产精品| 99国产高清| 蜜桃视频在线入口www| 国产精品福利电影一区二区三区四区| www.亚洲成人网| 黄a在线观看| 欧美国产激情一区二区三区蜜月| 免费国产成人看片在线| 超碰在线资源| 欧美日韩亚洲不卡| 性囗交免费视频观看| 色呦哟—国产精品| 欧美性做爰毛片| 99在线精品视频免费观看20| 久久午夜羞羞影院免费观看| 国产精品视频免费观看| www久久久com| 国产高清成人在线| 色大师av一区二区三区| 888av在线视频| 欧美美女直播网站| 欧美熟妇精品黑人巨大一二三区| 国产高清久久| 国产97在线观看| 天堂网2014av| 一区二区三区精品在线观看| 超碰在线97免费| 欧美日韩夜夜| 欧美精品国产精品日韩精品| 一级黄色大毛片| 久久免费偷拍视频| 超碰成人免费在线| 精品久久久久久久久久岛国gif| 91精品国产综合久久精品麻豆| 国产精品300页| 亚洲一本视频| 99在线影院| av色综合久久天堂av色综合在| 欧美色偷偷大香| 免费黄色在线视频| 亚洲男女自偷自拍| 精品中文字幕人| 福利在线导航136| 日韩一级高清毛片| 亚洲综合网在线| 欧美黄污视频| 国产一区二区香蕉| 9191在线观看| 欧美在线看片a免费观看| 91精品人妻一区二区| 国产精品日本| 欧美连裤袜在线视频| 国产高清在线| 91激情五月电影| 日本成人免费视频| 日本亚洲视频在线| 日本在线播放不卡| 韩国精品主播一区二区在线观看| 亚洲老司机av| 亚洲欧美一二三区| 国产日产亚洲精品系列| 在线视频日韩一区| 色综合天天综合网中文字幕| 国产精品一区二区久久| 18免费在线视频| 精品视频123区在线观看| 殴美一级黄色片| 国产美女精品人人做人人爽| 亚洲五码在线观看视频| 日韩视频在线直播| 国内外成人免费激情在线视频网站 | 91免费精品| 91麻豆国产语对白在线观看| 性欧美猛交videos| 亚洲成年网站在线观看| 国产高清一区二区三区四区| 丝袜脚交一区二区| 亚洲欧洲一区二区在线观看| 国产精品日本一区二区不卡视频| 亚洲经典中文字幕| 国产69精品久久久久久久久久| 久久一二三国产| 欧美大尺度做爰床戏| 911精品美国片911久久久| αv一区二区三区| 欧美日韩在线观看首页| 伊人久久久久久久久久| 久久精品国产av一区二区三区| 成人av网在线| 亚洲综合在线网站| 一区二区三区在线电影| 成人av免费看| 日韩电影网站| 欧美成人午夜激情在线| 青青草超碰在线| 777奇米成人网| 日本三级片在线观看| 国产欧美一区二区三区鸳鸯浴 | 国产最新免费视频| 欧美日韩精品在线一区| 不卡视频一区| 欧洲成人一区| 孩xxxx性bbbb欧美| 日本网站在线免费观看视频| 日韩成人在线电影网| 亚洲精品久久久久久国| 大白屁股一区二区视频| 男女男精品视频站| 伊人久久久大香线蕉综合直播| 日韩福利二区| 久久资源综合| 成人午夜黄色影院| 欧洲一级精品| 午夜精品理论片| 久久国产精品一区| 亚洲欧洲在线播放| 高清一区二区三区四区| 欧美日韩1区2区| 中文字幕精品无码一区二区| 一级特黄大欧美久久久| 国产精品suv一区二区88| 99久久er热在这里只有精品15| www.久久久久久久久久久| 免费亚洲婷婷| 精品少妇在线视频| 欧美成人tv| 午夜啪啪免费视频| 成人看的视频| 日韩videos| 婷婷成人综合| 国产日韩欧美一区二区| 免费看日产一区二区三区 | 日本一区二区三区电影免费观看| 国产高清在线不卡| 国产伦子伦对白在线播放观看| 亚洲成人久久一区| 99精品免费观看| 欧美群妇大交群的观看方式| 毛片在线免费播放| 日本高清不卡在线观看| 国产精品免费精品一区| 午夜一区二区三区视频| 国产在线免费视频| 亚洲一级在线观看| 青青操国产视频| 亚洲精品你懂的| 天堂av免费在线| 国产精品成人一区二区三区夜夜夜| 男人的天堂av网| 国产精品久久久一本精品| 91狠狠综合久久久久久| 欧美韩日一区二区三区四区| 日韩av片在线| 国产精品护士白丝一区av| 精品丰满少妇一区二区三区| 欧美国产禁国产网站cc| 日本在线观看网址| 自拍偷自拍亚洲精品播放| 欧美午夜精品一区二区| 国产黄色成人av| 9.1在线观看免费| av一二三不卡影片| 国产精品无码网站| 久久久久亚洲综合| 老头老太做爰xxx视频| 国产精品无遮挡| 日韩欧美综合视频| 亚洲综合清纯丝袜自拍| 日本系列第一页| 婷婷综合另类小说色区| 毛片视频免费播放| 国产精品久久久久精k8| 久久国产精品国语对白| 有码一区二区三区| 日韩黄色精品视频| 色av一区二区| 一级做a爱片久久毛片| 91精品国产一区二区人妖| 黄色av网址在线| 亚洲乱码av中文一区二区| www.在线播放| 免费av一区二区| 僵尸再翻生在线观看| 国产精品99久久久久久人| 亚洲伊人精品酒店| 国产精品一区二区欧美| 蜜桃精品噜噜噜成人av| 色中文字幕在线观看| 亚洲无吗在线| 国产xxxxx视频| 国产伦精品一区二区三区视频青涩 | 中文字幕精品一区二区精| 91精品婷婷国产综合久久竹菊| 欧美 中文字幕| 中国china体内裑精亚洲片| 香蕉久久aⅴ一区二区三区| 欧美一区二区三区图| 日本免费成人| 久久av一区二区三区亚洲| 日本不卡电影| 福利视频一二区| 久久成人免费网| 欧美肉大捧一进一出免费视频| 日本一区二区三区国色天香| 久久综合加勒比| 欧美日韩精品一区二区三区| 欧美熟妇乱码在线一区| 中文字幕在线看视频国产欧美在线看完整 | 91精品天堂福利在线观看| 黄色www网站| 精品一区二区三区免费观看| 国产福利在线观看视频| 1区2区3区精品视频| 一二三区免费视频| 欧美videos中文字幕| 欧美精品电影| 日本欧美在线视频| 老司机在线精品视频| 三年中国中文在线观看免费播放| 亚洲一区二区三区高清| 丰满人妻一区二区三区大胸 | 欧美xxxx黑人xyx性爽| 91九色02白丝porn| 亚洲av激情无码专区在线播放| 久久精品夜夜夜夜夜久久| 日本成人片在线| 久久久久一区二区| 最新日韩av| 香蕉网在线视频| 中文字幕一区二区三区四区不卡 | 中文在线аv在线| 国产精品视频500部| 综合激情视频| 欧美视频亚洲图片| 日韩毛片在线免费观看| 中国a一片一级一片| 亚洲欧美日韩精品| 中文不卡1区2区3区| 久久精品人人做人人爽电影| 欧美日韩天堂| 韩国三级在线看| 亚洲综合无码一区二区| 国产aⅴ爽av久久久久成人| 日韩视频在线免费| 欧美一区=区三区| 色涩成人影视在线播放| 日本亚洲三级在线| 美女100%露胸无遮挡| 欧美性受极品xxxx喷水| 国产一级在线| 国产精品久久久久久久久久免费 | 久久69精品久久久久久久电影好 | 日韩av在线播| 亚洲激情在线观看视频免费| 多野结衣av一区| 精品视频一区二区| 性高湖久久久久久久久| 中文字幕xxx| 在线观看91精品国产入口| 一区二区三区视频在线观看视频| 国产精品日韩一区| 国产精品久久久久无码av| 亚洲在线观看网站| 亚洲曰韩产成在线| 三级网站在线看| 欧美亚洲视频在线观看| 国产免费播放一区二区| 亚洲天堂网一区| 亚洲欧美国产77777| 国产黄色一区二区| 性欧美亚洲xxxx乳在线观看| 网友自拍一区| 视频二区在线播放| 一区二区三区四区不卡在线| 成人小说亚洲一区二区三区| 欧美制服第一页| 久久人人88| jjzz黄色片| 日本久久一区二区三区| 欧美成人xxx| 国产一区二区三区高清| 天堂va蜜桃一区二区三区漫画版 | 亚洲国产日韩a在线播放性色| 五月激情六月婷婷| 国产精品热视频| 欧美色图首页| 99久久人妻无码精品系列| 欧美日本精品一区二区三区| 色呦呦久久久| 欧美高清性xxxxhd| 激情综合色综合久久综合| 日韩女优在线观看| 中文字幕亚洲一区| jizz性欧美2| 国产精品视频分类| 香蕉av福利精品导航| bbbbbbbbbbb在线视频| 成人在线视频网址| 日韩影院精彩在线| 国产一级做a爱免费视频| 国产一区二区精品丝袜| 亚洲精品v亚洲精品v日韩精品| 农村妇女精品一二区| 高清成人在线观看| 懂色av蜜臀av粉嫩av分享吧最新章节| 久久精品视频亚洲| 国产一区二区观看| 国产51自产区| 欧美男男青年gay1069videost| 蜜桃麻豆影像在线观看| 中文字幕一区二区三区四区五区六区|