JavaforHighPerformanceComputingjava.
nio:HighPerformanceI/OforJavahttp://www.
hpjava.
org/courses/arlInstructor:BryanCarpenterPervasiveTechnologyLabsIndianaUniversityNIO:NewI/OPriortotheJ2SE1.
4releaseofJava,I/Ohadbecomeabottleneck.
JITperformancewasreachingthepointwhereonecouldstarttothinkofJavaasaplatformforHighPerformancecomputation,buttheoldjava.
iostreamclasseshadtoomanysoftwarelayerstobefast—thespecificationimpliedmuchcopyingofsmallchunksofdata;therewasnowaytomultiplexdatafrommultiplesourceswithoutincurringthreadcontextswitches;alsotherewasnowaytoexploitmodernOStricksforhighperformanceI/O,likememorymappedfiles.
NewI/Ochangesthatbyproviding:AhierarchyofdedicatedbufferclassesthatallowdatatobemovedfromtheJVMtotheOSwithminimalmemory-to-memorycopying,andwithoutexpensiveoverheadslikeswitchingbyteorder;effectivelybufferclassesgiveJavaa"window"onsystemmemory.
Aunifiedfamilyofchannelclassesthatallowdatatobefeddirectlyfrombufferstofilesandsockets,withoutgoingthroughtheintermediariesoftheoldstreamclasses.
Afamilyofclassestodirectlyimplementselection(AKAreadinesstesting,AKAmultiplexing)overasetofchannels.
NIOalsoprovidesfilelockingforthefirsttimeinJava.
ReferencesTheJavaNIOsoftwareispartofJ2SE1.
4andlater,fromhttp://java.
sun.
com/j2se/1.
4Onlinedocumentationisat:http://java.
sun.
com/j2se/1.
4/nioThereisanauthoritativebookfromO'Reilly:"JavaNIO",RonHitchens,2002BuffersBuffersABufferobjectisacontainerforafixedamountofdata.
Itbehavessomethinglikeabyte[]array,butisencapsulatedinsuchawaythattheinternalstoragecanbeablockofsystemmemory.
Thusaddingdatato,orextractingitfrom,abuffercanbeaverydirectwayofgettinginformationbetweenaJavaprogramandtheunderlyingoperatingsystem.
AllmodernOS'sprovidevirtualmemorysystemsthatallowmemoryspacetobemappedtofiles,sothisalsoenablesaverydirectandhigh-performanceroutetothefilesystem.
Thedatainabuffercanalsobeefficientlyreadfrom,orwrittento,asocketorpipe,enablinghighperformancecommunication.
ThebufferAPIsallowyoutoreadorwritefromaspecificlocationinthebufferdirectly;theyalsoallowrelativereadsandwrites,similartosequentialfileaccess.
Thejava.
nio.
BufferHierarchyTheByteBufferClassThemostimportantbufferclassinpracticeisprobablytheByteBufferclass.
Thisrepresentsafixed-sizevectorofprimitivebytes.
Importantmethodsonthisclassinclude:byteget()byteget(intindex)ByteBufferget(byte[]dst)ByteBufferget(byte[]dst,intoffset,intlength)ByteBufferput(byteb)ByteBufferput(intindex,byteb)ByteBufferput(byte[]src)ByteBufferput(byte[]src,intoffset,intlength)ByteBufferput(ByteBuffersrc)FilePositionandLimitApartfromformswithanindexparameter,theseareallrelativeoperations:theygetdatafrom,orinsertdatainto,thebufferstartingatthecurrentpositioninthebuffer;theyalsoupdatethepositiontopointtothepositionafterthereadorwrittendata.
Thepositionpropertyislikethefilepointerinsequentialfileaccess.
ThesuperclassBufferhasmethodsforexplicitlymanipulatingthepositionandrelatedpropertiesofbuffers,e.
g:intposition()Bufferposition(intnewPosition)intlimit()Bufferlimit(intnewLimit)TheByteBufferorBufferreferencesreturnedbythesevariousmethodsaresimplyreferencestothisbufferobject,notnewbuffers.
Theyareprovidedtosupportcrypticinvocationchaining.
Feelfreetoignorethem.
Thelimitpropertydefineseitherthelastspaceavailableforwriting,orhowmuchdatahasbeenwrittentothefile.
Afterfinishingwritingaflip()methodcanbecalledtosetlimittothecurrentvalueofposition,andresetpositiontozero,readyforreading.
Variousoperationsimplicitlyworkonthedatabetweenpositionandlimit.
CreatingBuffersFourinterestingfactorymethodscanbeusedtocreateanewByteBuffer:ByteBufferallocate(intcapacity)ByteBufferallocateDirect(intcapacity)ByteBufferwrap(byte[]array)ByteBufferwrap(byte[]array,intoffset,length)TheseareallstaticmethodsoftheByteBufferclass.
allocate()createsaByteBufferwithanordinaryJavabackingarrayofsizecapacity.
allocateDirect()—perhapsthemostinterestingcase—createsadirectByteBuffer,backedbycapacitybytesofsystemmemory.
Thewrap()methodscreateByteBuffer'sbackedbyallorpartofanarrayallocatedbytheuser.
Theothertypedbufferclasses(CharBuffer,etc)havesimilarfactorymethods,excepttheydon'tsupporttheimportantallocateDirect()method.
OtherPrimitiveTypesinByteBuffer'sItispossibletowriteotherprimitivetypes(char,int,double,etc)toaByteBufferbymethodslike:ByteBufferputChar(charvalue)ByteBufferputChar(intindex,charvalue)ByteBufferputInt(intvalue)ByteBufferputInt(intindex,intvalue)…TheputChar()methodsdoabsoluteorrelativewritesofthetwobytesinaJavachar,theputInt()methodswrite4bytes,andsoon.
OfcoursetherearecorrespondinggetChar(),getInt(),…methods.
Thesegiveyoufun,unsafewaysofcoercingbytesofoneprimitivetypetoanothertype,bywritingdataasonetypeandreadingthemasanother.
Butactuallythisisn'ttheinterestingbit—thiswasalwayspossiblewiththeoldjava.
ioDataStream's.
TheinterestingbitisthatthenewByteBufferclasshasamethodthatallowsyoutosetthebyteorder…Endian-nessWhenidentifyinganumerictypelikeintordoublewithasequenceofbytesinmemory,onecaneitherputthemostsignificantbytefirst(big-endian),ortheleastsignificantbytefirst(little-endian).
BigEndian:SunSparc,PowerPCCPU,numericfieldsinIPheaders,…LittleEndian:IntelprocessorsInjava.
io,numerictypeswerealwaysrenderedtostreaminbig-endianorder.
Createsaseriousbottleneckwhenwritingorreadingnumerictypes.
Implementationstypicallymustapplybytemanipulationcodetoeachitem,toensurebytesarewritteninthecorrectorder.
Injava.
nio,theprogrammerspecifiesthebyteorderasapropertyofaByteBuffer,bycallingoneof:myBuffer.
order(ByteOrder.
BIG_ENDIAN)myBuffer.
order(ByteOrder.
LITTLE_ENDIAN)myBuffer.
order(ByteOrder.
nativeOrder())Providedtheprogrammerensuresthebyteordersetforthebufferagreeswiththenativerepresentationforthelocalprocessor,numericdatacanbecopiedbetweenJVM(whichwillusethenativeorder)andbufferbyastraightblockmemorycopy,whichcanbeextremelyfast—abigwinforNIO.
ViewBuffersByteBufferhasnomethodsforbulktransferofarraysotherthantypebyte[].
Instead,createaviewof(aportionof)aByteBufferasanyotherkindoftypedbuffer,thenusethebulktransfermethodsonthatview.
FollowingmethodsofByteBuffercreateviews:CharBufferasCharBuffer()IntBufferasIntBuffer()…TocreateaviewofjustaportionofaByteBuffer,setpositionandlimitappropriatelybeforehand—thecreatedviewonlycoverstheregionbetweenthese.
YoucannotcreateviewsoftypedbuffersotherthanByteBuffer.
Youcancreateanotherbufferthatrepresentsasubsectionofanybuffer(withoutchangingelementtype)byusingtheslice()method.
Forexample,writinganarrayoffloatstoabytebuffer,startingatthecurrentposition:float[]array;…FloatBufferfloatBuf=byteBuf.
asFloatBuffer();floatBuf.
put(array);ChannelsChannelsAchannelisanewabstractioninjava.
nio.
Inthepackagejava.
nio.
channels.
Channelsareahigh-levelversionofthefile-descriptorsfamiliarfromPOSIX-compliantoperatingsystems.
SoachannelisahandleforperformingI/Ooperationsandvariouscontroloperationsonanopenfileorsocket.
ForthosefamiliarwithconventionalJavaI/O,java.
nioassociatesachannelwithanyRandomAccessFile,FileInputStream,FileOutputStream,Socket,ServerSocketorDatagramSocketobject.
ThechannelbecomesapeertotheconventionalJavahandleobjects;theconventionalobjectsstillexist,andingeneralretaintheirrole—thechanneljustprovidesextraNIO-specificfunctionality.
NIObufferobjectscanwrittentoorreadfromchannelsdirectly.
Channelsalsoplayanessentialroleinreadinessselection,discussedinthenextsection.
SimplifiedChannelHierarchySomeofthe"inheritance"arcshereareindirect:wemissedoutsomeinterestinginterveningclassesandinterfaces.
OpeningChannelsSocketchannelclasseshavestaticfactorymethodscalledopen(),e.
g.
:SocketChannelsc=SocketChannel.
open();Sc.
connect(newInetSocketAddress(hostname,portnumber));Filechannelscannotbecreateddirectly;firstuseconventionalJavaI/OmechanismstocreateaFileInputStream,FileOutputStream,orRandomAccessFile,thenapplythenewgetChannel()methodtogetanassociatedNIOchannel,e.
g.
:RandomAccessFileraf=newRandomAccessFile(filename,"r");FileChannelfc=raf.
getChannel();UsingChannelsAnychannelthatimplementstheByteChannelinterface—i.
e.
allchannelsexceptServerSocketChannel—providearead()andawrite()instancemethod:intread(ByteBufferdst)intwrite(ByteBuffersrc)Thesemaylookreminiscentoftheread()andwrite()systemcallsinUNIX:intread(intfd,void*buf,intcount)intwrite(intfd,void*buf,intcount)TheJavaread()attemptstoreadfromthechannelasmanybytesasthereareremainingtobewritteninthedstbuffer.
Returnsnumberofbytesactuallyread,or-1ifend-of-stream.
Alsoupdatesdstbufferposition.
Similarlywrite()attemptstowritetothechannelasmanybytesasthereareremaininginthesrcbuffer.
Returnsnumberofbytesactuallyread,andupdatessrcbufferposition.
Example:CopyingoneChanneltoAnotherThisexampleassumesasourcechannelsrcandadestinationchanneldest:ByteBufferbuffer=ByteBuffer.
allocateDirect(BUF_SIZE);while(src.
read(buffer)!
=-1)buffer.
flip(Preparereadbufferfor"draining"while(buffer.
hasRemaining(dest.
write(buffer)buffer.
clear(Emptybuffer,readytoreadnextchunk.
}Noteawrite()call(oraread()call)mayormaynotsucceedintransferringwholebufferinasinglecall.
Henceneedforinnerwhileloop.
ExampleintroducestwonewmethodsonBuffer:hasRemaining()returnstrueifpositionJava.
FileChannelhasamethod:MappedByteBuffermap(MapModemode,longposition,longsize)modeshouldbeoneofMapMode.
READ_ONLY,MapMode.
READ_WRITE,MapMode.
PRIVATE.
ThereturnedMappedByteBuffercanbeusedwhereveranordinaryByteBuffercan.
Scatter/GatherOftencalledvectoredI/O,thisjustmeansyoucanpassanarrayofbufferstoareadorwriteoperation;theoverloadedchannelinstancemethodshavesignatures:longread(ByteBuffer[]dsts)longread(ByteBuffer[]dsts,intoffset,intlength)longwrite(ByteBuffer[]srcs)longwrite(ByteBuffer[]srcs,intoffset,intlength)Thefirstformofread()attemptstoreadenoughdatatofillallbuffersinthearray,anddividesitbetweenthem,inorder.
Thefirstformofwrite()attemptstoconcatenatetheremainingdatainallbuffersandwriteit.
Theargumentsoffsetandlengthselectasubsetofbuffersfromthearrays(not,say,anintervalwithinbuffers).
SocketChannelsAsmentionedatthebeginningofthissection,socketchannelsarecreateddirectlywiththeirownfactorymethodsIfyouwanttomanageasockedconnectionasaNIOchannelthisistheonlyoption.
CreatingNIOsocketchannelimplicitlycreatesapeerjava.
netsocketobject,but(contrarytothesituationwithfilehandles)theconverseisnottrue.
Aswithfilechannels,socketchannelscanbemorecomplicatedtoworkwiththanthetraditionaljava.
netsocketclasses,butprovidemuchofthehard-boiledflexibilityyougetprogrammingsocketsinC.
Themostnotablenewfacilitiesarethatnowsocketcommunicationscanbenon-blocking,theycanbeinterrupted,andthereisaselectionmechanismthatallowsasinglethreadtodomultiplexservicingofanynumberofchannels.
BasicSocketChannelOperationsTypicaluseofaserversocketchannelfollowsapatternlike:ServerSocketChannelssc=ServerSocketChannel.
open();ssc.
socket().
bind(newInetSocketAddress(port));while(true)SocketChannelsc=ssc.
accept(processatransactionwithclientthroughsc…}Theclientdoessomethinglike:SocketChannelsc=SocketChannel.
open();sc.
connect(newInetSocketAddr(serverName,port));…initiateatransactionwithserverthroughsc…Theelidedcodeabovewilltypicallybeusingread()andwrite()callsontheSocketChanneltoexchangedatabetweenclientandserver.
Sotherearefourimportantoperations:accept(),connect(),write(),read().
NonblockingOperationsBycallingthemethodsocket.
configureBlocking(false);youputasocketintononblockingmode(callingagainwithargumenttruerestorestoblockingmode,andsoon).
Innon-blockingmode:Aread()operationonlytransfersdatathatisimmediatelyavailable.
Ifnodataisimmediatelyavailableitreturns0.
Similarly,ifdatacannotbeimmediatelywrittentoasocket,awrite()operationwillimmediatelyreturn0.
Foraserversocket,ifnoclientiscurrentlytryingtoconnect,theaccept()methodimmediatelyreturnsnull.
Theconnect()methodismorecomplicated—generallyconnectionswouldalwaysblockforsomeintervalwaitingfortheservertorespond.
Innon-blockingmodeconnect()generallyreturnsfalse.
Butthenegotiationwiththeserverisneverthelessstarted.
ThefinishConnect()methodonthesamesocketshouldbecalledlater.
Italsoreturnsimmediately.
Repeatuntilitreturntrue.
InterruptibleOperationsThestandardchannelsinNIOareallinterruptible.
Ifathreadisblockedwaitingonachannel,andthethread'sinterrupt()methodiscalled,thechannelwillbeclosed,andthethreadwillbewokenandsentaClosedByInterruptException.
Toavoidraceconditions,thesamewillhappenifanoperationonachannelisattemptedbyathreadwhoseinterruptstatusisalreadytrue.
Seethelectureonthreadsforadiscussionofinterrupts.
ThisrepresentsprogressovertraditionalJavaI/O,whereinterruptionofblockingoperationswasnotguaranteed.
OtherFeaturesofChannelsFilechannelsprovideaquitegeneralfilelockingfacility.
Thisispresumablyimportanttomanyapplications(databaseapplications),butlessobviouslysotoHPCoperations,sowedon'tdiscussithere.
ThereisaDatagramChannelforsendingUDP–stylemessages.
Thismaywellbeimportantforhighperformancecommunications,butwedon'thavetimetodiscussit.
Thereisaspecialchannelimplementationrepresentingakindofpipe,whichcanbeusedforinter-threadcommunication.
SelectorsReadinessSelectionPriortoNewI/O,Javaprovidednostandardwayofselecting—fromasetofpossiblesocketoperations—justtheonesthatarecurrentlyreadytoproceed,sothereadyoperationscanbeimmediatelyserviced.
OneapplicationwouldbeinimplementinganMPI-likemessagepassingsystem:ingeneralincomingmessagesfrommultiplepeersmustbeconsumedastheyarriveandfedintoamessagequeue,untiltheuserprogramisreadytohandlethem.
PreviouslyonecouldachieveequivalenteffectsinJavabydoingblockingI/Ooperationsinseparatethreads,thenmergingtheresultsthroughJavathreadsynchronization.
Butthiscanbeinefficientbecausethreadcontextswitchingandsynchronizationisquiteslow.
OnewayofachievingthedesiredeffectinNewI/Owouldbesetallthechannelsinvolvedtonon-blockingmode,anduseapollinglooptowaituntilsomearereadytoproceed.
Amorestructured—andpotentiallymoreefficient—approachistouseSelectors.
InmanyflavorsofUNIXthisisachievedbyusingtheselect()systemcall.
ClassesInvolvedinSelectionSelectioncanbedoneonanychannelextendingSelectableChannel—amongstthestandardchannelsthismeansthethreekindsofsocketchannel.
Theclassthatsupportstheselect()operationitselfisSelector.
Thisisasortofcontainerclassforthesetofchannelsinwhichweareinterested.
ThelastclassinvolvedisSelectionKey,whichissaidtorepresentthebindingbetweenachannelandaselector.
InsomesenseitispartoftheinternalrepresentationoftheSelector,buttheNIOdesignersdecidedtomakeitanexplicitpartoftheAPI.
SettingUpSelectorsAselectoriscreatedbytheopen()factorymethod.
ThisisnaturallyastaticmethodoftheSelectorclass.
Achannelisaddedtoaselectorbycallingthemethod:SelectionKeyregister(Selectorsel,intops)This,slightlyoddly,isaninstancemethodoftheSelectableChannelclass—youmighthaveexpectedtheregister()methodtobeamemberofSelector.
Hereopsisabit-setrepresentingtheinterestsetforthischannel:composedbyoringtogetheroneormoreof:SelectionKey.
OP_READSelectionKey.
OP_WRITESelectionKey.
OP_CONNECTSelectionKey.
OP_ACCEPTAchanneladdedtoaselectormustbeinnonblockingmode!
Theregister()methodreturnstheSelectionKeycreatedSincethisautomaticallygetsstoredintheSelector,soinmostcasesyouprobablydon'tneedtosavetheresultyourself.
ExampleHerewecreateaselector,andregisterthreepre-existingchannelstotheselector:Selectorselector=Selector.
open();channel1.
register(selector,SelectionKey.
OP_READ);channel2.
register(selector,SelectionKey.
OP_WRITE);channel3.
register(selector,SelectionKey.
OP_READSelectionKey.
OP_WRITE);Forchannel1theinterestsetisreadsonly,forchannel2itiswritesonly,forchannel3itisreadsandwrites.
Notechannel1,channel2,channel3mustallbeinnon-blockingmodeatthistime,andmustremaininthatmodeaslongastheyareregisteredinanyselector.
Youremoveachannelfromaselectorbycallingthecancel()methodoftheassociatedSelectionKey.
select()andtheSelectedKeySetToinspectthesetofchannels,toseewhatoperationsarenewlyreadytoproceed,youcalltheselect()methodontheselector.
Thereturnvalueisaninteger,whichwillbezeroifnostatuschangesoccurred.
Moreinterestingthanthereturnvalueisthesideeffectthismethodhasonthesetofselectedkeysembeddedintheselector.
Touseselectors,youmustunderstandthataselectormaintainsaSetobjectrepresentingthisselectedkeysset.
Becauseeachkeyisassociatedwithachannel,thisisequivalenttoasetofselectedchannels.
Thesetofselectedkeysisdifferentfrom(presumablyasubsetof)theregisteredkeyset.
Eachtimetheselect()methodiscalleditmayaddnewkeystotheselectedkeyset,asoperationsbecomereadytoproceed.
You,astheprogrammer,areresponsibleforexplicitlyremovingkeysfromtheselectedkeysetbelongingtotheselector,asyoudealwithoperationsthathavebecomeready.
ReadySetsThisisquitecomplicatedalready,butthereisonemorecomplication.
Wesawthateachkeyintheregisteredkeysethasanassociatedinterestset,whichisasubsetofthe4possibleoperationsonsockets.
Similarlyeachkeyintheselectedkeysethasanassociatedreadyset,whichisasubsetoftheinterestset—representingtheactualoperationsthathavebeenfoundreadytoproceed.
Besidesaddingnewkeystotheselectedkeyset,aselect()operationmayaddnewoperationstothereadysetofakeyalreadyintheselectedkeyset.
Assumingtheselectedkeysetwasnotclearedafteraprecedingselect().
YoucanextractthereadysetfromaSelectionKeyasabit-set,byusingthemethodreadyOps().
Oryoucanusetheconveniencemethods:isReadable()isWriteable()isConnectable()isAcceptable()whicheffectivelyreturnthebitsofthereadysetindividually.
APatternforUsingselect()…registersomechannelswithselector…while(true)selector.
select(Iteratorit=selector.
selectedKeys().
iterator(while(it.
hasNext(SelectionKeykey=it.
next(if(key.
isReadable(performread()operationonkey.
channel(if(key.
isWriteable(performwrite()operationonkey.
channel(if(key.
isConnectable(performconnect()operationonkey.
channel(if(key.
isAcceptable(performaccept()operationonkey.
channel(it.
remove(RemarksThisgeneralpatternwillprobablyserveformostusesofselect():Performselect()andextractthenewselectedkeysetForeachselectedkey,handletheactionsinitsreadysetRemovetheprocessedkeyfromtheselectedkeysetNotetheremove()operationonanIteratorremovesthecurrentitemfromtheunderlyingcontainer.
Moregenerally,thecodethathandlesareadyoperationmayalsoalterthesetofchannelsregisteredwiththeselectore.
gafterdoinganaccept()youmaywanttoregisterthereturnedSocketChannelwiththeselector,towaitforread()orwrite()operations.
Inmanycasesonlyasubsetofthepossibleoperationsread,write,accept,connectareeverininterestsetsofkeysregisteredwiththeselector,soyouwon'tneedall4tests.
KeyAttachmentsOneproblemwiththepatternaboveisthatwhenit.
next()returnsakey,thereisnoconvenientwayofgettinginformationaboutthecontextinwhichtheassociatedchannelwasregisteredwiththeselector.
Forexamplechannel1andchannel3arebothregisteredforOP_READ.
Buttheactionthatshouldbetakenwhenthereadbecomesreadymaybequitedifferentforthetwochannels.
Youneedaconvenientwaytodeterminewhichchannelthereturnedkeyisboundto.
Youcanspecifyanarbitraryobjectasanattachmenttothekeywhenyoucreateit;laterwhenyougetthekeyfromtheselectedset,youcanextracttheattachment,anduseitscontentintodecidewhattodo.
Atitsmostbasictheattachmentmightjustbeanindexidentifyingthechannel.
SimplisticUseofKeyAttachmentschannel1.
register(selector,SelectionKey.
OP_READ,newInteger(1)attachment…channel3.
register(selector,SelectionKey.
OP_READSelectionKey.
OP_WRITE,newInteger(3)attachment…while(true)Iteratorit=selector.
selectedKeys().
iterator(SelectionKeykey=it.
next(if(key.
isReadable(switch(((Integer)key.
channel().
attachment()).
value(case1actionappropriatetochannel1case3actionappropriatetochannel3ConclusionWebrieflyvisitedseveraltopicsinNewI/OthatarelikelytobeinterestingforHPCwithJava.
Sometopicsthatarelessobviouslyrelevantweskipped,likefilelocking,andregularexpressions.
Alsowedidn'tcoverdatagramchannels,whichmaywellberelevant.
NewI/OhasbeenwidelyhailedasanimportantstepforwardingettingseriousperformanceoutoftheJavaplatform.
Seethepaper:"MPJava:High-PerformanceMessagePassinginJavausingjava.
nio"WilliamPughandJaimeSpaccoForagoodexampleofhowNewI/Omayaffectthe"JavaforHPC"landscape.
RAKsmart 商家从原本只有专注于独立服务器后看到产品线比较单薄,后来陆续有增加站群服务器、高防服务器、VPS主机,以及现在也有在新增云服务器、裸机云服务器等等。机房也有增加到拥有洛杉矶、圣何塞、日本、韩国、中国香港等多个机房。在年前也有介绍到RAKsmart商家有提供年付129元的云服务器套餐,年后我们看到居然再次刷新年付云服务器低价格。我们看到云服务器低至年79元,如果有需要便宜云服务器的...
月付/年付优惠码:zji 下物理服务器/VDS/虚拟主机空间订单八折终身优惠(长期有效)一、ZJI官网点击直达ZJI官方网站二、特惠香港日本服务器香港大埔:http://hkdb.speedtest.zji.net/香港葵湾:http://hkkw.speedtest.zji.net/日本大阪:http://jpsk.speedtest.zji.net/日本大阪一型 ...
趣米云怎么样?趣米云是创建于2021年的国人IDC商家,虽然刚刚成立,但站长早期为3家IDC提供技术服务,已从业2年之久,目前主要从事出售香港vps、香港独立服务器、香港站群服务器等,目前在售VPS线路有三网CN2、CN2 GIA,该公司旗下产品均采用KVM虚拟化架构。由于内存资源大部分已售,而IP大量闲置,因此我们本月新增1c1g优惠套餐。点击进入:趣米云官方网站地址香港三网CN2云服务器机型活...
java抽奖程序为你推荐
大连市驾管处科目二考试弱电及场地改造工程2021年中国城镇污泥处理处置技术与应用高级研讨会excursionsios5includingandroid三星iphone支持ipad张女士苹果5重庆宽带测速重庆联通宽带测速的网址是好多呢?css下拉菜单如何用css3做导航栏下拉菜单win7telnetwindows7旗舰版中telnet在哪
jsp虚拟主机 lunarpages mobaxterm 发包服务器 华为网络硬盘 dux 刀片服务器是什么 免费吧 东莞数据中心 免费智能解析 天翼云盘 能外链的相册 跟踪路由命令 云营销系统 密钥索引 hosting24 建站技术 阿里云宕机故障 低价 let 更多