一種測(cè)速系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)_第1頁
一種測(cè)速系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)_第2頁
一種測(cè)速系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)_第3頁
一種測(cè)速系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)_第4頁
一種測(cè)速系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩68頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

一種測(cè)速系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)摘要當(dāng)代信息技術(shù)發(fā)展突飛猛進(jìn),尤其是互聯(lián)網(wǎng)的普及和智能手機(jī)的大眾化,現(xiàn)在人們已經(jīng)無法完全脫離手機(jī),因?yàn)槲覀冸S時(shí)需要通過網(wǎng)絡(luò)進(jìn)行工作交流、聊天互動(dòng)等。因此,互聯(lián)網(wǎng)的使用需求越來越大,資源也越來越緊張。相比以前,計(jì)算機(jī)與網(wǎng)絡(luò)給人們生活與工作帶來更加便利的同時(shí),用戶對(duì)網(wǎng)絡(luò)質(zhì)量的要求越來越苛刻:人們需要更快更穩(wěn)定的網(wǎng)速來支持一些實(shí)時(shí)性比較強(qiáng)的應(yīng)用運(yùn)行,比如視頻聊天、網(wǎng)絡(luò)游戲;需要在用網(wǎng)高峰期時(shí)更流暢地訪問網(wǎng)絡(luò),比如節(jié)假日、重大活動(dòng)時(shí)造成的網(wǎng)絡(luò)擁堵。所以這就需要網(wǎng)絡(luò)運(yùn)營(yíng)商以及各大平臺(tái)的服務(wù)器對(duì)各個(gè)地區(qū)的網(wǎng)絡(luò)情況進(jìn)行一個(gè)實(shí)時(shí)的監(jiān)控,并且根據(jù)網(wǎng)絡(luò)異常的地區(qū)進(jìn)行調(diào)度,包括對(duì)網(wǎng)絡(luò)阻塞的處理、資源的釋放等來提高用戶聯(lián)網(wǎng)質(zhì)量。一個(gè)平臺(tái)需要能夠?qū)Ξ?dāng)前網(wǎng)絡(luò)情況進(jìn)行判斷并且使用對(duì)應(yīng)的方法來調(diào)整資源的合理分配,即實(shí)現(xiàn)調(diào)度,才是科學(xué)的、合理的,才能被更多的用戶認(rèn)可。實(shí)現(xiàn)調(diào)度的前提是對(duì)網(wǎng)絡(luò)實(shí)現(xiàn)監(jiān)控,其中監(jiān)控網(wǎng)速最為普遍。而描述測(cè)速最直接的是通過手機(jī)或計(jì)算機(jī)上的客戶端(app)接入該平臺(tái)服務(wù)器的接入延遲時(shí)間來體現(xiàn)。本文主要通過GO語言,模擬構(gòu)建客戶端與服務(wù)器,將客戶端的IP、地域信息以及接入延遲記錄入數(shù)據(jù)庫,并通過Echarts在前端形象地將各地區(qū)延時(shí)情況描述出來,提供給網(wǎng)絡(luò)調(diào)度部分作為數(shù)據(jù)來源使用,共同保證網(wǎng)絡(luò)的高質(zhì)量。關(guān)鍵詞:GO語言,TCP交互,IP信息,接入延遲,Mysql數(shù)據(jù)庫,go-EchartsAbstractInformationtechnologyisdevelopingrapidly,especiallythepopularityoftheInternetandthepopularityofsmartphones.Nowpeoplecan'tgetofftheirphones,becausewealwaysneedtoworkthroughtheInternettocommunicate,chat,etc…Asaresult,thedemandforInternetaccessisincreasingandresourcesarebecomingincreasinglyscarce.Comparedwiththepast,computersandtheInternethavebroughtpeoplemoreconvenienceinlifeandwork,butusers'demandsonthequalityoftheInternethavebecomemoreandmorestringent.PeopleneedfasterandmorestableInternetspeedstosupportmorereal-timeapplications,likevideochat,andonlinegames.Andtheyneedtohavesmootheraccesstothenetworkduringpeakperiods,likethenetworkcongestioncausedbyholidaysandmajorevents.Soweneednetworkoperatorsandserversonallmajorplatformstomonitorthenetworkinallregionsinrealtime,andscheduleaccordingtotheareawherethenetworkisabnormal,includingtheprocessingofnetworkcongestion,thereleaseofresources,etc.toimprovethequalityofusernetworking.Aplatformneedstobeabletojudgethecurrentnetworksituationandusethecorrespondingmethodtoadjustthereasonabledistributionofresources,thatis,toimplementscheduling,itisscientificandreasonable,inordertoberecognizedbymoreusers.Thepremiseofrealizingschedulingistomonitornetworkimplementation.Amongthem,monitoringspeedisthemostcommon.Describingthespeedofthenetworkismostdirectlyreflectedinthelatencyofaccesstotheplatformserverviatheclient(app)onthephoneorcomputer.ThisarticlemainlyusesGOlanguagetosimulatetheconstructionofclientsandservers,Logclients'IP,geographicinformation,andaccesslatencyintodatabase,AndvividlydescribethedelaysituationinvariousregionsthroughEchartsatthefront-end,andprovidedtothenetworkschedulingsectionasadatasource,workwithittoensurethehighqualityofthenetwork.Keywords:GOlanguage,TCPinteraction,IPinformation,Mysqldatabase,go-Echarts目錄一、 緒論 緒論研究背景根據(jù)“WeAreSocial”和“Hootsuite”披露的最新數(shù)據(jù),截止至2018年,全球互聯(lián)網(wǎng)用戶數(shù)已經(jīng)突破了40億大關(guān),全球76億人中,約2/3已經(jīng)擁有手機(jī)。可以看出來全球已經(jīng)有一半的人口使用互聯(lián)網(wǎng)。此外由于智能手機(jī)的普及,使用移動(dòng)端互聯(lián)網(wǎng)的人數(shù)也不斷地暴漲。其中我國(guó)網(wǎng)民人數(shù)為8億,互聯(lián)網(wǎng)普及率達(dá)57%。由此可見,在不斷壯大的互聯(lián)網(wǎng)規(guī)模中,資源利用率受到了嚴(yán)峻的挑戰(zhàn)。受人口分布以及地域的影響,互聯(lián)網(wǎng)中總會(huì)存在資源利用不均勻的情況,像北上廣一線城市人口密度大,要想給網(wǎng)民們提供足夠流暢的環(huán)境,就必須多分配資源,或者在設(shè)計(jì)服務(wù)器時(shí)需要考慮到這一方面的需求。但在日常生活中,除了人口分布問題,也存在一些非人為因素導(dǎo)致某些地區(qū)的網(wǎng)絡(luò)質(zhì)量差。在這種情況下就需要對(duì)各地區(qū)進(jìn)行監(jiān)控排查,由此獲得數(shù)據(jù)對(duì)網(wǎng)絡(luò)的設(shè)計(jì)、維護(hù)以及管理有著重要的作用。而且只有直觀、準(zhǔn)確的網(wǎng)絡(luò)情況,才能做出正確的網(wǎng)絡(luò)調(diào)度。但是由于互聯(lián)網(wǎng)規(guī)模的龐大以及傳統(tǒng)計(jì)算機(jī)語言實(shí)現(xiàn)測(cè)速系統(tǒng)代碼的復(fù)雜性復(fù)雜性,對(duì)網(wǎng)絡(luò)延遲的測(cè)量限制了一般平臺(tái)的智能化和可靠性。與國(guó)外相比,中國(guó)的互聯(lián)網(wǎng)起步相對(duì)較晚,在一些發(fā)達(dá)地區(qū)尤其是韓國(guó),網(wǎng)絡(luò)延遲基本都在15毫秒以下。國(guó)外最早的網(wǎng)絡(luò)測(cè)量始于20世紀(jì)70年代初(VintCref在ARPANET上展開的性能測(cè)量項(xiàng)目),逐漸成熟于80年代,90年代已逐漸形成體系。而我國(guó)90年代才引入Internet,國(guó)內(nèi)的研究主要集中于CER-NET、CSTNET和國(guó)內(nèi)各大高校、實(shí)驗(yàn)室(如清華大學(xué)、中科院、北航、國(guó)防科技大學(xué))等,進(jìn)行了網(wǎng)絡(luò)測(cè)量的技術(shù)攻關(guān),推動(dòng)了我國(guó)網(wǎng)絡(luò)測(cè)量的發(fā)展[1]。隨著我國(guó)互聯(lián)網(wǎng)的發(fā)展和網(wǎng)民的增加,政府對(duì)網(wǎng)絡(luò)經(jīng)濟(jì)的大力支持,不少企業(yè)尤其是電商行業(yè),網(wǎng)絡(luò)服務(wù)型企業(yè)出于自身競(jìng)爭(zhēng)力的需求,已經(jīng)開始在網(wǎng)絡(luò)監(jiān)控方面投入精力。研究現(xiàn)狀目前在計(jì)算機(jī)上和智能手機(jī)上都有不同的測(cè)試網(wǎng)絡(luò)延遲(或網(wǎng)速)的方法與軟件,例如計(jì)算機(jī)里自帶的ping命令,就可以直接測(cè)出延遲時(shí)間。在移動(dòng)端里有俄羅斯的QIP,國(guó)內(nèi)的藍(lán)汛測(cè)網(wǎng)速等應(yīng)用軟件,可以說實(shí)現(xiàn)起來沒有問題。但在企業(yè)里,需要將其應(yīng)用在開發(fā)的測(cè)試程序中,這些都不是首選。最好的方法是自己開發(fā)見到那程序,通過客戶端發(fā)包給服務(wù)器,再接收服務(wù)器返回來的包,計(jì)算這之間的時(shí)間,便是算出了網(wǎng)絡(luò)延遲。在網(wǎng)絡(luò)監(jiān)控開發(fā)層面,使用C語言等傳統(tǒng)的編程語言來開發(fā)服務(wù)器與客戶端十分復(fù)雜,代碼量大。但是GO語言在網(wǎng)絡(luò)編程開發(fā)方面有著天生的優(yōu)點(diǎn):以最直接、簡(jiǎn)單、高效、穩(wěn)定的方式來解決問題,實(shí)現(xiàn)起來代碼量少。本文內(nèi)容與結(jié)構(gòu)隨著2012年第一個(gè)穩(wěn)定版本GO的推出,開發(fā)人員似乎在各種計(jì)算機(jī)語言中多了一個(gè)可以折衷的選擇——GO語言。Go(又稱golang)是Google開發(fā)的一種靜態(tài)強(qiáng)類型、編譯型、并發(fā)型,并具有垃圾回收功能的編程語言。GO語言的特點(diǎn)是語法非常簡(jiǎn)單,并且跟C語言的運(yùn)行效率有得一拼,但又保留有Python的簡(jiǎn)潔的韻味,更重要的是有著優(yōu)秀的高并發(fā)能力,達(dá)到了開發(fā)效率的最大化。所以在客戶端和服務(wù)器的搭建上我選擇使用GO語言。MySQL是關(guān)系型數(shù)據(jù)庫,科學(xué)的結(jié)構(gòu)增加了速度并提高了靈活性,使用的SQL語言是用于訪問數(shù)據(jù)庫的最常用標(biāo)準(zhǔn)化語言,由于其體積小、速度快、總體擁有成本低,并且GO語言和MySQL都是開源的,適合大部分平臺(tái)用于開發(fā)。北京大學(xué)百人計(jì)劃研究員,可視化專家袁曉如說:“在中國(guó)可視化生態(tài)系統(tǒng)中,ECharts通過提供方便豐富的可視化圖表,極大縮短了用戶與數(shù)據(jù)的距離?!彼且粋€(gè)純JavaScript的圖標(biāo)庫,兼容絕大部分的瀏覽器,底層依賴輕量級(jí)的canvas類庫ZRender,包含各種類型的可以根據(jù)自己需要而制定的數(shù)據(jù)可視化圖表,將數(shù)據(jù)形象化,生動(dòng)地在前端通過圖表顯示出來。Echarts用其形象的圖形化語言,在前端占據(jù)著重要的地位。站在開發(fā)者的角度來講,其占用內(nèi)存少、免費(fèi)、入門快、門檻低、代碼易懂,十分適合剛接觸前端的設(shè)計(jì)者。所以本次課題也將網(wǎng)絡(luò)延遲的模擬結(jié)果通過Echarts來呈現(xiàn)出來。本文內(nèi)容和結(jié)構(gòu)安排如下:緒論中通過現(xiàn)狀引入本課題,介紹網(wǎng)絡(luò)延遲的研究背景和現(xiàn)狀,以及本文的研究?jī)?nèi)容和所用到的環(huán)境,還有本文的結(jié)構(gòu)。說明GO語言開發(fā)環(huán)境的搭建以及開發(fā)工具的安裝。服務(wù)器與客戶端的TCP交互(基于GO語言),通過握手獲取接入延遲,在服務(wù)器獲取客戶端的IP及其地域信息。MySQL的安裝與配置;服務(wù)器對(duì)MySQL的操作,將IP、地域信息、接入延遲存進(jìn)數(shù)據(jù)庫。通過go-echarts描繪出我國(guó)各主要城市的地圖,并顯示出各個(gè)城市的平均接入延遲??偨Y(jié)本課題的模擬結(jié)果,對(duì)課題意義以及未來的發(fā)展發(fā)表個(gè)人的看法。GO語言開發(fā)環(huán)境和開發(fā)工具golang的搭建由于golang是開源的,所以在golang官網(wǎng)中,可以找到各個(gè)版本、不同環(huán)境下的golang安裝文件。我使用Windows864位進(jìn)行開發(fā),所以我選擇穩(wěn)定版本的go1.12.4.windows-amd64.zip,下載GO的解壓版本。下載完成后解壓到D盤的biye文件夾下,得到go文件夾,檢驗(yàn)golang是否安裝成功:使用命令提示符進(jìn)入到go文件夾里面的bin下,運(yùn)行:goversion圖2.1檢查golang是否成功安裝圖2.1檢查golang是否成功安裝界面返回golang的版本信息,說明已經(jīng)安裝成功。一般情況下,要想運(yùn)行.exe文件,就需要進(jìn)入到改安裝路徑下,若需要在其他路徑下直接運(yùn)行該.exe文件,則需要設(shè)置其環(huán)境變量,因?yàn)閣indows操作系統(tǒng)在運(yùn)行.exe文件時(shí),除了在當(dāng)前路徑下尋找之外,還會(huì)到環(huán)境變量path中去查找。設(shè)置好golang的環(huán)境變量后,就可以在任何路徑下執(zhí)行g(shù)o指令。1)設(shè)置GOROOT這里是指安裝的路徑,即D:\biye\go設(shè)置Path這里是要添加安裝路徑的bin目錄,在原有的基礎(chǔ)上加上“;%GOROOT%\bin”設(shè)置GOPATH這里是指golang將來存放項(xiàng)目的路徑,我的項(xiàng)目是存放在D:\biye\PROJECT(a)設(shè)置GOROOT(a)設(shè)置GOROOT(b)設(shè)置PATH(b)設(shè)置PATH(d)運(yùn)行結(jié)果(c)設(shè)置GOPATH(d)運(yùn)行結(jié)果(c)設(shè)置GOPATH圖2.圖2.SEQ圖\*ARABIC1設(shè)置環(huán)境變量設(shè)置好環(huán)境變量后在D盤路徑下運(yùn)行g(shù)oversion,檢驗(yàn)是否成功設(shè)置。界面返回了golang的版本信息,即成功設(shè)置好環(huán)境變量。安裝VSCode

VSCode全稱是VisualStudioCode,一款開源的輕量級(jí)代碼編輯器,支持幾乎所有主流的開發(fā)語言,并且有自動(dòng)高亮語法關(guān)鍵字、智能補(bǔ)全代碼等優(yōu)點(diǎn),是進(jìn)行簡(jiǎn)單開發(fā)中比較熱門的開發(fā)工具。訪問VSCode官網(wǎng),選擇下載VSCodeStup-x64-并安裝,在安裝過程中勾選“添加到PATH(重啟后生效)”圖2.3VSCode自動(dòng)添加到環(huán)境變量圖2.3VSCode自動(dòng)添加到環(huán)境變量hello,world下面是創(chuàng)建保存項(xiàng)目的文件夾,進(jìn)行“hello,world”的go語言實(shí)現(xiàn):在D盤biye里的PROJECT下創(chuàng)建文件夾src/go_code/demo,在VSCode打開文件夾PROJECT,并找到demo文件夾,在里面新建hello.go,開始實(shí)現(xiàn)打印hello,world的經(jīng)典入門案例。因?yàn)閐emo只需要打印出來“hello,world”字符串,所以只需要引入“fmt”包,打印字符串的代碼實(shí)現(xiàn)非常簡(jiǎn)單:fmt.Println(“hello,world”)//打印“hello,world”,在界面顯示出來圖2.4hello,world代碼完整代碼如下:圖2.4hello,world代碼方法1:打開命令提示符,cd到D:\biye\PROJECT\src\go_code\demo,執(zhí)行g(shù)obuildhello.go,文件夾中生成hello.exe可執(zhí)行文件。再執(zhí)行hello,結(jié)果如下:gobuild命令是對(duì)hello.go文件進(jìn)行編譯與測(cè)試,是否有錯(cuò)誤,然后與該go文件引用的包進(jìn)行打包處理形成一個(gè)可執(zhí)行文件(hello.exe),這個(gè)可執(zhí)行文件包含了它所需要的引用,可以直接進(jìn)行拷貝或傳送給其他設(shè)備運(yùn)行。圖圖SEQ圖\*ARABIC2.5gobuild操作方法2:打開命令提示符,cd到D:\biye\PROJECT\src\go_code\demo,執(zhí)行g(shù)orunhello.go,這個(gè)操作會(huì)對(duì)go文件進(jìn)行編譯,產(chǎn)生臨時(shí)的exe文件,并直接運(yùn)行,在界面顯示運(yùn)行的結(jié)果。圖2.6gorun操作圖2.6gorun操作但是這種方法會(huì)比使用gobuild運(yùn)行起來慢很多,所以gorun在調(diào)試開發(fā)時(shí)用的較多,而在生產(chǎn)以及正常使用場(chǎng)合會(huì)使用gobuild指令居多。至此,現(xiàn)已基于GO語言環(huán)境及VSCode開發(fā)工具下完成了GO語言的入門操作??蛻舳伺c服務(wù)器的交互TCPsocket編程TCPsocket編程網(wǎng)絡(luò)編程的主流,其底層是基于TCP/IP協(xié)議的。比如QQ聊天就是基于此協(xié)議編程開發(fā)的。TCP/IP協(xié)議(全稱TransmissionControlProtocol/InternetProtocol,翻譯為中文名字是傳輸控制協(xié)議/因特網(wǎng)互聯(lián)協(xié)議,又稱為網(wǎng)絡(luò)通訊協(xié)議),是Internet最基本的協(xié)議、Internet國(guó)際互聯(lián)網(wǎng)絡(luò)的基礎(chǔ),可以簡(jiǎn)明地看作是由網(wǎng)絡(luò)層的IP協(xié)議和傳輸層的TCP協(xié)議組成。IP地址具有唯一性,任何一個(gè)設(shè)備連接到Internet,都會(huì)有一個(gè)唯一的IP地址,代表了使用端的“身份”,就像身份證一樣,是不會(huì)有重復(fù)的。端口是指在TCP/IP協(xié)議中的邏輯端口,把IP地址比作一間“房子”,那么端口就可以看作是進(jìn)出這間“房子”的“門”。在接收或發(fā)送信息時(shí),我們的身份就是這間“房子主人”IP地址號(hào),其中有很多個(gè)門對(duì)著不同的程序,外界信息可以通過IP地址找到這間“房子”,但還需要找到專門處理這個(gè)程序的信息的門才可以進(jìn)出。所以只有明確IP+端口,才能準(zhǔn)確地接收或者發(fā)送對(duì)應(yīng)程序的信息。一個(gè)IP地址可以有65535個(gè)端口(即256×256個(gè)),通過整數(shù)的端口號(hào)來標(biāo)識(shí)。但是并不是65535個(gè)端口都可以被任意使用,假如有程序占用了某一個(gè)端口,那么其他程序就不能再使用該端口號(hào)。一般的,0號(hào)為保留端口號(hào),1-1024是有名端口,被固定的程序使用,在開發(fā)過程中不可使用以上的端口號(hào)。值得注意的是,計(jì)算機(jī)(尤其是作為服務(wù)器時(shí))應(yīng)該盡可能少地開放、監(jiān)聽端口,這樣能減少一分受網(wǎng)絡(luò)攻擊的危險(xiǎn),盡可能地保證服務(wù)器的安全性。在TCP/IP協(xié)議中,“IP地址+端口號(hào)”唯一確定了一個(gè)網(wǎng)絡(luò)通訊中的某一個(gè)交互過程的起點(diǎn)和終點(diǎn)。這個(gè)“IP地址+端口號(hào)”就叫做socket。socket直接翻譯為英文是“孔”,“插座”的意思,也十分形象、物理性地描述了在網(wǎng)絡(luò)通訊過程中交互雙方各提供一個(gè)通訊連接點(diǎn)。服務(wù)器監(jiān)聽下面開始構(gòu)思,基于TCP/IPsocket編程搭建一個(gè)服務(wù)器,在本地監(jiān)聽7777端口,等待后續(xù)開發(fā)的客戶端來連接。圖圖SEQ圖\*ARABIC3.1監(jiān)聽示意圖golang代碼的實(shí)現(xiàn):因?yàn)樾枰M(jìn)行socket編程,所以需要引“net”包,里面內(nèi)包含了socket編程所用到的方法和函數(shù)。在監(jiān)聽過程中,:7777意思是該服務(wù)器進(jìn)行本地監(jiān)聽,端口號(hào)為7777。實(shí)現(xiàn)監(jiān)聽需要使用net包里面的Listen,到golang官方文檔找到net查看Listen:圖3.2golang文檔-Listen函數(shù)圖3.2golang文檔-Listen函數(shù)圖3.3golang文檔-Listen接口圖3.3golang文檔-Listen接口圖3.SEQ圖\*ARABIC圖3.SEQ圖\*ARABIC4服務(wù)器監(jiān)聽代碼運(yùn)行結(jié)果如下:圖3.圖3.SEQ圖\*ARABIC5客戶端監(jiān)聽運(yùn)行結(jié)果客戶端的連接客戶端連接服務(wù)器的過程有點(diǎn)像打電話,首先是客戶端撥號(hào)給服務(wù)器,取得連線后再做后續(xù)的交流。查閱golang文檔,找到net里的Dial:圖3.圖3.SEQ圖\*ARABIC6golang文檔—Dial函數(shù)示例與服務(wù)器類似,客戶端通過net.Dial,設(shè)置為tcp方式,撥號(hào)為服務(wù)器的IP和端口號(hào),此次課題服務(wù)器在本地,所以應(yīng)是“:7777”,代碼如下:圖3.SEQ圖\*ARABIC7客戶端撥號(hào)代碼圖3.SEQ圖\*ARABIC圖3.SEQ圖\*ARABIC8監(jiān)聽與撥號(hào)運(yùn)行結(jié)果服務(wù)器與客戶端的改善前面已經(jīng)實(shí)現(xiàn)客戶端對(duì)服務(wù)器的連接,但從運(yùn)行結(jié)果來看,客戶端連接上打印出來一段話之后又退出了,服務(wù)器端也缺少對(duì)連接上的客戶端的服務(wù),下面在前面的基礎(chǔ)上對(duì)服務(wù)器和客戶端進(jìn)行性能的改善,實(shí)現(xiàn):1.服務(wù)器在客戶端連接成功后,調(diào)用函數(shù)獲取客戶端的IP和端口號(hào);2.客戶端在成功連上服務(wù)器之后,循環(huán)卡在輸入需要發(fā)送的消息而不退出,直至輸入exit,才退出。3.客戶端連接上之后,服務(wù)器另起一個(gè)協(xié)程來處理該客戶端的請(qǐng)求,而不耽誤下一個(gè)客戶端的連接;讀取IP和端號(hào)在交互中,我們知道有一對(duì)socket實(shí)現(xiàn)了連接,現(xiàn)在已經(jīng)知道服務(wù)器的IP(本地)和端口號(hào),還需要知道是哪里的客戶端(IP是多少,端口號(hào)是多少)連上了我的服務(wù)器。圖3.SEQ圖\*ARABIC9圖3.SEQ圖\*ARABIC9獲取客戶端地址從下圖3.10運(yùn)行結(jié)果可以看到,兩個(gè)客戶端成功連接上服務(wù)器,但是客戶端的端口是隨機(jī)的,并不像服務(wù)器一樣需要固定監(jiān)聽某一個(gè)端口。圖3.圖3.SEQ圖\*ARABIC10獲取地址后的運(yùn)行結(jié)果可以看到,兩個(gè)客戶端成功連接上服務(wù)器,但是客戶端的端口是隨機(jī)的,并不像服務(wù)器一樣需要固定監(jiān)聽某一個(gè)端口??蛻舳说妮斎肟蛻舳伺c服務(wù)器交互的實(shí)際內(nèi)容,就是從客戶端輸入數(shù)據(jù)到服務(wù)器,服務(wù)器根據(jù)接收到客戶端發(fā)送內(nèi)容的不同選擇不同的處理。在客戶端連接成功后,客戶端在斷開連接之前隨時(shí)可能有數(shù)據(jù)的傳送,現(xiàn)在模擬通過隨時(shí)在鍵盤輸入數(shù)據(jù),并發(fā)向服務(wù)器。因?yàn)樾枰K端輸入,現(xiàn)在需要多引入一個(gè)“bufio”包、“os”包,使用“os”包里面的NewReader方法讀取鍵盤輸入。然后使用for循環(huán),用ReadString方法截止至(并包括)檢測(cè)到“\n”(回車鍵)為止,存入一個(gè)字符串變量,但在判斷這個(gè)變量是否等于“exit”時(shí),需要去掉“\n”再判斷,所以使用“strings”包里面的Trim方法隔離開回車鍵等字符。判斷完不是exit指令后,接下來是把終端輸入內(nèi)容傳送給服務(wù)器。先將回車鍵拼接回原來的字符串變量里,因?yàn)槿绻患拥脑?,服?wù)器那邊就會(huì)在兩次接收的信息之間沒有任何分隔符,不利于分辨。查閱golang文檔,找到“net”包里coon接口的Write方法圖3.圖3.SEQ圖\*ARABIC11golag文檔—conn接口 圖3.SEQ圖\*ARABIC圖3.SEQ圖\*ARABIC12客戶端寫入代碼 服務(wù)器協(xié)程讀取當(dāng)服務(wù)器在7777監(jiān)聽端口與客戶端取得連接之后,若一直由服務(wù)器main提供讀寫服務(wù),那么將會(huì)造成阻塞,導(dǎo)致服務(wù)器長(zhǎng)期被某一客戶端占用,其他客戶端無法訪問服務(wù)器的狀態(tài),這種情況的服務(wù)器是沒有現(xiàn)實(shí)意義的,所以我們需要把服務(wù)器主線程當(dāng)成是“前臺(tái)接待”的角色,將連接上的客戶端安排到不同的“工作室”,啟用協(xié)程全程為某一客戶端服務(wù)。那么,無論多少個(gè)客戶端來連接,服務(wù)器都能啟用相對(duì)應(yīng)的協(xié)程來處理,在保證持續(xù)為客戶端服務(wù)的同時(shí)不影響其他客戶端的接入。值得注意是,各個(gè)協(xié)程之間是并發(fā)的,相互之間沒有直接的影響。啟用協(xié)程只是處理所用,數(shù)據(jù)的接收和發(fā)送仍然是通過7777端口進(jìn)行,而不是協(xié)程直接對(duì)應(yīng)客戶端來傳輸數(shù)據(jù)。示意圖如下: 圖3.SEQ圖\*ARABIC圖3.SEQ圖\*ARABIC13服務(wù)器啟協(xié)程示意圖在main函數(shù)外寫協(xié)程process,然后在main里連接之后的for循環(huán)最后調(diào)用協(xié)程。因?yàn)閰f(xié)程也是基于tcp連接之后的操作,所以需要把conn傳入?yún)f(xié)程里面,進(jìn)入?yún)f(xié)程后應(yīng)該是關(guān)閉conn,釋放資源。接下來服務(wù)器對(duì)客戶端的操作處理,都應(yīng)該在此協(xié)程下運(yùn)行。圖3.圖3.SEQ圖\*ARABIC14使用協(xié)程的代碼接下來在協(xié)程里面接收上面客戶端所發(fā)送過來的數(shù)據(jù)。跟前面的Write方法一樣,都是要用byte切片完成。這里要先創(chuàng)建一個(gè)新的切片來讀取,接著用conn里的Read方法讀取,返回一個(gè)整數(shù)n,說明數(shù)據(jù)大小。如果客戶端沒有Write,那么協(xié)程就一直阻塞在讀取階段,直至讀取成功,或者檢測(cè)到錯(cuò)誤(比如客戶端斷開了連接)。最后是顯示數(shù)據(jù),將切片的數(shù)據(jù)顯示為string類型,直到n位為止,否則將會(huì)把創(chuàng)建的切片全部都打印出來。圖圖SEQ圖\*ARABIC15服務(wù)器協(xié)程中讀取數(shù)據(jù)的代碼運(yùn)行嘗試:圖3.圖3.SEQ圖\*ARABIC16客戶端與服務(wù)器交互運(yùn)行結(jié)果通過運(yùn)行結(jié)果,可以看到,當(dāng)一個(gè)客戶端連接上之后,服務(wù)器能夠讀取該客戶端的IP和端口號(hào),并調(diào)用協(xié)程位該客戶端服務(wù),接收其發(fā)送過來的數(shù)據(jù)。同時(shí),服務(wù)器主程序并沒有受前一個(gè)客戶端因交互而產(chǎn)生阻塞,依然能監(jiān)聽并且連接新的一個(gè)客戶端,再并發(fā)調(diào)用另個(gè)協(xié)程為新連接上的客戶端提供服務(wù)。通過測(cè)試,客戶端也能通過exit指令退出。 獲取時(shí)延、IP地域信息通過第3章對(duì)基于GO語言的客戶端服務(wù)器的搭建以及模擬簡(jiǎn)單必要的交互,工作的框架已經(jīng)完整,接下來就需要根據(jù)課題需要,深入學(xué)習(xí)與設(shè)計(jì)如何實(shí)現(xiàn)對(duì)網(wǎng)絡(luò)連接的速度進(jìn)行測(cè)量和描述,怎樣去獲取每個(gè)客戶端更加具體的信息,比如連接Internet的公網(wǎng)IP,所在國(guó)家、城市、運(yùn)營(yíng)商。只有將這些都一一對(duì)應(yīng)監(jiān)測(cè)起來,才能具體的了解到是哪個(gè)運(yùn)營(yíng)商哪個(gè)城市的網(wǎng)絡(luò)出現(xiàn)問題,好讓調(diào)度方有目標(biāo)性地更快更高效地進(jìn)行排查、維護(hù)。TCP網(wǎng)絡(luò)測(cè)速系統(tǒng)中,測(cè)量接入時(shí)延是最簡(jiǎn)單的通過連接所需要的時(shí)間(毫秒級(jí)別)來描述速度,而針對(duì)IP所對(duì)應(yīng)的地域信息則是借助網(wǎng)上的API進(jìn)行查詢。接入延遲延遲是指源端主機(jī)從發(fā)出數(shù)據(jù)包到收到相應(yīng)反饋數(shù)據(jù)包所花費(fèi)的時(shí)間,這通常被稱為往返時(shí)間(Round-triptime,RTT)。只要網(wǎng)絡(luò)中存在延遲,就會(huì)對(duì)數(shù)據(jù)傳輸吞吐量產(chǎn)生影響。吞吐量計(jì)算公式如下:吞吐量(字節(jié)/秒)=TCP窗口大?。ㄗ止?jié))/RTT(秒)可見,延遲(RTT)越高,數(shù)據(jù)傳輸吞吐量就會(huì)越低,從而影響網(wǎng)絡(luò)性能,因此,一旦網(wǎng)絡(luò)上出現(xiàn)高延遲的情況,就應(yīng)該找出問題的原因,以提出解決方案。由于課題模擬的服務(wù)器功能簡(jiǎn)單,規(guī)模較小,難以通過簡(jiǎn)單的測(cè)試獲取范圍較大的延遲時(shí)間,所以通過簡(jiǎn)單的數(shù)據(jù)包的發(fā)送和反饋,加上服務(wù)器隨機(jī)隨眠300毫秒以內(nèi)的時(shí)間,達(dá)到模擬各種網(wǎng)絡(luò)情況的目的。圖4.1接入延遲時(shí)間示意圖圖4.1接入延遲時(shí)間示意圖 如上時(shí)序圖所示,在客戶端成功連接服務(wù)器后,緊接著進(jìn)行接入時(shí)延的測(cè)量。按照時(shí)間順序來說,先是記錄當(dāng)前時(shí)間t1,緊接著客戶端通過Write方法寫入測(cè)試接入時(shí)延的數(shù)據(jù)包,本課題將其定義為“test”字符串,接著是服務(wù)器在循環(huán)正常交互之前,通過Read方法讀取客戶端發(fā)過來的測(cè)試數(shù)據(jù)包是否等于字符串“test”,如果不是,則回復(fù)測(cè)試接入延遲出錯(cuò),接而跳入for循環(huán)開始正常交互;如果是字符串“test”,則向客戶端回復(fù),寫入字符串“testok”。然后到客戶端循環(huán)等待服務(wù)器反饋回來的測(cè)量結(jié)果,讀取結(jié)果如果不等于“testok”,則顯示測(cè)量失??;如果是“testok”,則立即記錄此刻時(shí)間t2,計(jì)算出此次接入時(shí)延t=t2-t1。到此,接入時(shí)延已經(jīng)測(cè)量出來,然后客戶端要把該接入延遲數(shù)據(jù)再傳輸回給服務(wù)器,因?yàn)榻尤霑r(shí)延需要通過后續(xù)存入數(shù)據(jù)庫,供描述各地區(qū)平均接入時(shí)延所用。因?yàn)檫@過程中使用到時(shí)間點(diǎn)的記錄,所以需要引用“time/rand”包,通過里面的Now來實(shí)現(xiàn),兩個(gè)時(shí)間點(diǎn)的作差可以通過Sub來完成,而通過Duration,可以把算出來的時(shí)間差轉(zhuǎn)換成int64類型的整數(shù),下面是golang官方文檔的描述:圖4.2golang文檔—Now函數(shù)圖4.2golang文檔—Now函數(shù)圖4.3golang文檔—Sub函數(shù)圖4.3golang文檔—Sub函數(shù) 圖4.4golang文檔—Nanoseconds函數(shù)圖4.4golang文檔—Nanoseconds函數(shù)下面是代碼實(shí)現(xiàn):Client:(下圖續(xù))圖4.5客戶端發(fā)測(cè)試包圖4.5客戶端發(fā)測(cè)試包部分代碼(續(xù)上圖)圖4.6服務(wù)器接測(cè)試包部分代碼Server:圖4.6服務(wù)器接測(cè)試包部分代碼上面服務(wù)器已經(jīng)做出反饋,由客戶端循環(huán)等待接收并對(duì)此反饋?zhàn)龀雠袛?,若符合設(shè)計(jì)所定義,則可以跳出循環(huán)。圖4.7客戶端接收反饋Client:圖4.7客戶端接收反饋Server:圖4.8服務(wù)器接收時(shí)延數(shù)據(jù)圖4.8服務(wù)器接收時(shí)延數(shù)據(jù)圖4.9測(cè)量接入時(shí)延的運(yùn)行結(jié)果至此,接入時(shí)延部分已完成。下面進(jìn)行運(yùn)行調(diào)試:圖4.9測(cè)量接入時(shí)延的運(yùn)行結(jié)果IP及地域信息公網(wǎng)IP上網(wǎng)的計(jì)算機(jī)得到的IP地址是Internet上的非保留地址,公網(wǎng)的計(jì)算機(jī)和Internet上的其他計(jì)算機(jī)可隨意互相訪問。我們可以通過使用瀏覽器打開/raw來獲取手上聯(lián)網(wǎng)機(jī)器訪問Internet時(shí)的公網(wǎng)IP地址。為了程序開發(fā)的調(diào)理性,我們新定義一個(gè)函數(shù)來實(shí)現(xiàn)獲取公網(wǎng)IP地址的功能。圖4.10golang官方文檔—Get函數(shù)因?yàn)樯婕暗絟ttp訪問,我們需要引入“net/http”包,通過Get函數(shù)來獲取/raw里提供的使用者聯(lián)網(wǎng)機(jī)器的公網(wǎng)IP,下面查看golang官方文檔:圖4.10golang官方文檔—Get函數(shù)圖4.11golang官方文檔—ReadAll函數(shù)其中有使用到ioutil.ReadAll,所以還需引入“io/ioutil”包。圖4.11golang官方文檔—ReadAll函數(shù)引入“bytes”包,使用NewBuffer函數(shù)用于創(chuàng)建一個(gè)用于讀取已存在數(shù)據(jù)的buffer。圖4.12golang官方文檔—NewNuffer函數(shù)圖4.12golang官方文檔—NewNuffer函數(shù)讀取出來后將其強(qiáng)轉(zhuǎn)成strings類型返回代碼實(shí)現(xiàn):圖4.13自定義函數(shù)獲取公網(wǎng)圖4.13自定義函數(shù)獲取公網(wǎng)IP 圖4.14發(fā)送IP給服務(wù)器這里訪問網(wǎng)頁,應(yīng)是在客戶端上完成的,才能返回客戶端的圖4.14發(fā)送IP給服務(wù)器下面是代碼實(shí)現(xiàn):

然后在服務(wù)器端讀取該IP,再進(jìn)行下一步的處理操作(獲取地域信息)。這里應(yīng)在打印接入延時(shí)之后接著進(jìn)行公網(wǎng)IP的讀?。簣D4.15服務(wù)器讀取圖4.15服務(wù)器讀取IPIP對(duì)應(yīng)的地域信息由于IP規(guī)模十分龐大,基于個(gè)人無法開發(fā)一個(gè)庫來做開發(fā),所以本課題將使用淘寶接口根據(jù)剛才實(shí)現(xiàn)得到的公網(wǎng)IP進(jìn)行地域信息查詢。圖4.16淘寶API接口圖4.16淘寶API接口根據(jù)淘寶接口提供的說明,IP信息里面有比較多的變量,為了方便傳輸和顯示,我們把這些描述IP信息的變量統(tǒng)一用一個(gè)自定義的變量來描述,即golang里的結(jié)構(gòu)體。將一類事物的特征都提取出來,形成一個(gè)新的數(shù)據(jù)類型,這個(gè)數(shù)據(jù)類型就叫做結(jié)構(gòu)體。比如說,我們可以用IP所在國(guó)家、城市、運(yùn)營(yíng)商來描述,即每一個(gè)IP都有國(guó)家、城市、運(yùn)營(yíng)商這些特征。我們可以通過定義IP這個(gè)結(jié)構(gòu)體,里面創(chuàng)建多個(gè)變量來分別描述這個(gè)IP的國(guó)家、城市與運(yùn)營(yíng)商,這幾個(gè)叫做實(shí)例。同樣,為了程序代碼的美觀以及條理性,本課題將此定義為一個(gè)新的函數(shù)來調(diào)用,來實(shí)現(xiàn)返回對(duì)應(yīng)的國(guó)家、城市、運(yùn)營(yíng)商的值。那么此處有一個(gè)矛盾:因?yàn)槭钦{(diào)用函數(shù),所以變量值必須是大寫,才能跨函數(shù)使用,但是在淘寶接口中,ip,country等鍵名都是小寫字母開頭。所以得使用json序列化過程中使用tag便簽指定鍵名,這樣就能把小寫與大寫字母對(duì)應(yīng)起來?,F(xiàn)在根據(jù)上圖的數(shù)據(jù)內(nèi)容定義兩個(gè)結(jié)構(gòu)體:查詢的方法:使用Get,訪問地址為:/service/getIpInfo.php?ip=[ip地址字串]2.通過ReadAll讀取網(wǎng)頁獲得的信息圖4.17淘寶API接口函數(shù)3.反序列化并返回圖4.17淘寶API接口函數(shù)代碼實(shí)現(xiàn):然后,就能在協(xié)程中獲取到客戶端發(fā)來的公網(wǎng)IP后調(diào)用該程序讀取該IP的地域信息。圖4.18圖4.18調(diào)用淘寶接口整合、運(yùn)行調(diào)試Server:圖4.19圖4.19服務(wù)器實(shí)現(xiàn)獲取IP及信息的運(yùn)行結(jié)果圖4.20客戶端實(shí)現(xiàn)獲取IP及信息的運(yùn)行結(jié)果Client:圖4.20客戶端實(shí)現(xiàn)獲取IP及信息的運(yùn)行結(jié)果至此,程序運(yùn)行情況符合預(yù)期設(shè)計(jì),服務(wù)器獲取客服端接入時(shí)延、公網(wǎng)IP及其地域信息成功。MySQLMySQL是一種RDBMS(RelationalDatabasementSystem,關(guān)系型數(shù)據(jù)庫管理系統(tǒng))。所謂關(guān)聯(lián)數(shù)據(jù)庫即將數(shù)據(jù)用不同的表進(jìn)行儲(chǔ)存,而非將全部數(shù)據(jù)均置于一個(gè)表中,這樣能在顯著提升請(qǐng)求的響應(yīng)速度和數(shù)據(jù)庫本身的靈活性。MySQL的開發(fā)企業(yè)為MySQLAB,來自瑞典,當(dāng)前歸屬于Oracle。在同類型的系統(tǒng)中他的使用最為流行。同時(shí)它還是很適于用在TCP后端的一個(gè)應(yīng)用軟件。MySQL所配備的SQL語言是訪問數(shù)據(jù)庫時(shí)最為常用最為標(biāo)準(zhǔn)的查詢語言。其實(shí)施雙授權(quán)政策,包括商業(yè)版和社區(qū)版這兩個(gè)版本,具備許多的優(yōu)勢(shì),比如占用資源少,響應(yīng)速度快,使用成本低,源碼開放等,通常在開發(fā)中小型服務(wù)器時(shí),MySQL都是搭建數(shù)據(jù)庫的首選[4]。另外,MySQL可以運(yùn)行在不同的語言開發(fā)平臺(tái)上,包括GO語言。MySQL的安裝與使用MySQL官方下載地址:/downloads/windows/installer/。選擇下載windows64位版本的msiinstaller離線版。按照提示進(jìn)行安裝,到設(shè)置步驟時(shí),選擇MySQL默認(rèn)的端口號(hào)3306,默認(rèn)名稱為MySQL,設(shè)置root密碼為123456,選擇默認(rèn)系統(tǒng)自動(dòng)啟動(dòng)數(shù)據(jù)庫,勾選配置環(huán)境變量按鈕。安裝完成后,使用指令啟動(dòng)/關(guān)閉MySQL,檢查“服務(wù)”中MySQL是否啟動(dòng)。圖5.1關(guān)閉mysql關(guān)閉:以管理員身份運(yùn)行命令提示符,輸入圖5.1關(guān)閉mysql 圖5.2啟動(dòng)mysql啟動(dòng)圖5.2啟動(dòng)mysql下面通過MySQL語句簡(jiǎn)單熟悉MySQL數(shù)據(jù)庫:登錄數(shù)據(jù)庫:mysql-uroot–p123456查詢數(shù)據(jù)庫:showdatabases;新建數(shù)據(jù)庫:createdatabaseitcast;進(jìn)入到itcast數(shù)據(jù)庫:useitcast;新建一個(gè)表:圖5.3mysql創(chuàng)建表圖5.3mysql創(chuàng)建表查看當(dāng)前數(shù)據(jù)庫里的表:showtables;查看一個(gè)表的字段:desctabletest;查看某一個(gè)表里的數(shù)據(jù):select*fromtabletest;刪除一個(gè)表:droptabletest;向一個(gè)表插入數(shù)據(jù):insertintotest(IP,Country,City,Type,Time)values('','中國(guó)','廣州','聯(lián)通','123');修改(更新)表中數(shù)據(jù):updatatestsetTime=234whereIP=‘’;golang服務(wù)器與mysql交互githubgolang本身沒有提供連接mysql的驅(qū)動(dòng),但是定義了標(biāo)準(zhǔn)接口供第三方開發(fā)驅(qū)動(dòng)。數(shù)據(jù)庫驅(qū)動(dòng)程序是開發(fā)語言和數(shù)據(jù)庫聯(lián)系的“翻譯員”,把編程語言的相關(guān)數(shù)據(jù)庫操作翻譯為數(shù)據(jù)庫能夠處理的語言[5]。本課題選擇通過github安裝,所以先安裝git軟件。訪問git官網(wǎng)/downloads,下載最新版本的Git-2.21.0-64-bit.exe,然后安裝。安裝完成后要設(shè)置環(huán)境變量。在PATH環(huán)境變量下增添git安裝路徑下的bin目錄,如:;D:\biye\Git\bin圖5.4設(shè)置圖5.4設(shè)置Git環(huán)境變量設(shè)置好后就可以進(jìn)行g(shù)ithub的安裝了。打開命令提示符,cd到原來GOPATH路徑下,即D:\biye\PROJECT,運(yùn)行g(shù)oget/go-sql-driver/mysql安裝成功后,PROJECT/src文件夾里多出了文件夾,里面含有驅(qū)動(dòng),現(xiàn)在可以通過golang服務(wù)器連接mysql了。圖5.5文件夾 圖5.5文件夾連接查看goang文檔,找到“database/sql”,通過里面的Open函數(shù)實(shí)現(xiàn)對(duì)Mysql的連接圖5.6golang官方文檔—Open函數(shù)圖5.6golang官方文檔—Open函數(shù)Mysql監(jiān)聽的IP+端口Mysql監(jiān)聽的IP+端口數(shù)據(jù)庫名稱連接模式為:db,_:=sql.Open("mysql","root:123456@(:3306)/itcast")連接到的database用戶名:密碼連接到的database用戶名:密碼圖5.7連接mysql的格式圖5.7連接mysql的格式圖5.8連接mysql的代碼下面是代碼的實(shí)現(xiàn)圖5.8連接mysql的代碼運(yùn)行調(diào)試及結(jié)果:Client:圖5.9客戶端發(fā)送延時(shí)圖5.9客戶端發(fā)送延時(shí)數(shù)據(jù)Server:圖5.10服務(wù)器連接Mysql圖5.10服務(wù)器連接Mysql運(yùn)行結(jié)果golang的server服務(wù)器連接mysql成功,下面可以在mysql的itcast數(shù)據(jù)庫里進(jìn)行增刪改查的操作。時(shí)延、IP信息的入庫在5.1的對(duì)mysql基本操作中,我們已經(jīng)在itcast的database里面新建了一個(gè)“test”表格用于存放時(shí)延和IP信息。其中,主鍵IP(唯一標(biāo)識(shí))對(duì)應(yīng)的是string類型的公網(wǎng)IP,Country對(duì)應(yīng)的是string類型的IP的國(guó)家信息,City對(duì)應(yīng)的是string類型的IP所在城市,Type對(duì)應(yīng)的是string類型的IP運(yùn)營(yíng)商,Time對(duì)應(yīng)的是int類型的接入時(shí)延。下面是使用Prepare和Exec來配合對(duì)mysql進(jìn)行增加操作,將時(shí)延、IP信息入庫。查閱golang文檔:圖5.11golang官方文檔—Prepare、Exec圖5.11golang官方文檔—Prepare、Exec所謂prepared,即帶有占位符的sql語句,客戶端將該語句和參數(shù)發(fā)給mysql服務(wù)器。mysql服務(wù)器編譯成一個(gè)prepared語句,這個(gè)語句可以根據(jù)不同的參數(shù)多次調(diào)用。對(duì)于大多數(shù)數(shù)據(jù)庫,prepread的過程都是,先發(fā)送一個(gè)帶占位符的sql語句到服務(wù)器,服務(wù)器返回一個(gè)statementid,然后再把這個(gè)id和參數(shù)發(fā)送給服務(wù)器執(zhí)行,最后再發(fā)送關(guān)閉statement命令。下面是代碼實(shí)現(xiàn):圖5.12go操作插入mysql圖5.12go操作插入mysql運(yùn)行調(diào)試看是否成功入庫:圖5.13“插入”操作運(yùn)行結(jié)果(客戶端)Client:圖5.13“插入”操作運(yùn)行結(jié)果(客戶端)Server:圖5.14“插入”操作運(yùn)行結(jié)果(服務(wù)器)圖5.14“插入”操作運(yùn)行結(jié)果(服務(wù)器)Golang開發(fā)的服務(wù)器和客戶端已顯示成功將時(shí)延和IP信息入庫,下面再通過登錄Mysql進(jìn)一步確認(rèn)是否正確入庫:圖5.15圖5.15檢查mysql表數(shù)據(jù)從Mysql數(shù)據(jù)庫可以看到,golang操作Mysql這一功能已經(jīng)實(shí)現(xiàn)。Echarts顯示科學(xué)統(tǒng)計(jì)作為統(tǒng)計(jì)的分支,是用統(tǒng)計(jì)的方法對(duì)科學(xué)技術(shù)活動(dòng)的規(guī)模和結(jié)構(gòu)進(jìn)行定量的測(cè)定??萍冀y(tǒng)計(jì)是輔助科技關(guān)系實(shí)現(xiàn)科學(xué)化、現(xiàn)代化的手段??萍冀y(tǒng)計(jì)研究的對(duì)象是科學(xué)技術(shù)活動(dòng)總體的數(shù)量特征和數(shù)量關(guān)系,其主要任務(wù)是通過對(duì)科技活動(dòng)有關(guān)數(shù)據(jù)的收集、處理、分析,反映科技活動(dòng)的規(guī)模、結(jié)構(gòu)和布局的總體數(shù)量特征和關(guān)系,從而為評(píng)價(jià)和制定科技政策和發(fā)展規(guī)模提供依據(jù)??萍冀y(tǒng)計(jì)是制定正確的科技政策和發(fā)展規(guī)劃必不可少的工具,沒有完整、準(zhǔn)確、可靠的科技統(tǒng)計(jì)資料就不可能合理地制定出各種科技政策和規(guī)劃,不可能把有限的科技資源在各類科技活動(dòng)中進(jìn)行合理分配,也無法評(píng)價(jià)科技政策和規(guī)劃的實(shí)施效果。在日常工作中,科學(xué)統(tǒng)計(jì)大多使用Excel報(bào)表來實(shí)現(xiàn),其優(yōu)點(diǎn)是可以使用公式和函數(shù)對(duì)數(shù)據(jù)進(jìn)行統(tǒng)計(jì)和計(jì)算,可以快速連接并導(dǎo)入數(shù)據(jù)庫;缺點(diǎn)是太過細(xì)化,無法通過表格獲取區(qū)域比較等總體化、直觀化的印象,更無法在網(wǎng)頁上進(jìn)行可視化的顯示,為科技部門提供決策調(diào)度參考[6]。Echarts是一款大眾化、常見的數(shù)據(jù)可視化工具,是由百度商業(yè)前段團(tuán)隊(duì)開發(fā)的一項(xiàng)有關(guān)圖表實(shí)現(xiàn)技術(shù),此技術(shù)方便開發(fā)者使用,能夠通過圖表將數(shù)據(jù)生動(dòng),直觀的展示,其交互性強(qiáng),數(shù)據(jù)能夠被定制應(yīng)用。其中Echarts包含有17種圖表,有折線圖、柱狀圖、散點(diǎn)圖、K線圖、餅圖、地圖等,這些圖的模塊可以混合使用Echarts也提供動(dòng)態(tài)類型圖表,還能根據(jù)坐標(biāo)設(shè)置不同色彩來表現(xiàn)區(qū)域值域分布情況,。另外Echarts具有實(shí)時(shí)數(shù)據(jù)變化的接口,對(duì)與數(shù)據(jù)的調(diào)節(jié)非常方便簡(jiǎn)單[7]。go-echarts入門在golang這門語言中,目前數(shù)據(jù)可視化的第三方庫還是特別少,go-echarts的開發(fā)就是為了填補(bǔ)這部分的空隙。Echarts是百度開源的非常優(yōu)秀的可視化圖表庫,憑借著良好的交互性,精巧的圖表設(shè)計(jì),得到了眾多開發(fā)者的認(rèn)可。也有其他語言為其實(shí)現(xiàn)了相應(yīng)語言版本的接口,如Python的pyecharts,go-echarts也是借鑒了pyecharts的一些設(shè)計(jì)思想。go-echarts有著豐富的圖表類型以及簡(jiǎn)潔的API設(shè)計(jì),通過靈活的搭配參數(shù),可以畫出精美的圖表,而且附帶詳細(xì)的文檔和大量的示例代碼以幫助開發(fā)者更快的入手。由于本課題的模擬服務(wù)器和客戶端都基于GO語言搭建,go-echarts相比于使用傳統(tǒng)的基于html文件構(gòu)建echarts,顯得更加貼合GO語言,并且有以下的特性優(yōu)點(diǎn):簡(jiǎn)潔的API設(shè)計(jì),使用流暢、簡(jiǎn)單,僅需要幾行核心代碼就可畫出美觀的圖表囊括了20+多種常見圖表,應(yīng)有盡有高度靈活的配置項(xiàng),可輕松搭配出精美的圖表詳細(xì)的文檔和示例,幫助開發(fā)者更快的上手項(xiàng)目多達(dá)400+地圖,為地理數(shù)據(jù)可視化提供強(qiáng)有力的支持Go-echarts的安裝:因?yàn)樵诘?章安裝mysql驅(qū)動(dòng)時(shí),已經(jīng)安裝好了github,所以下面直接使用github安裝go-echarts。打開命令提示符,cd到PROJECT目錄下的src文件夾,運(yùn)行:goget/chenjiandongx/go-echarts/...圖6.SEQ圖\*ARABIC17含go-ecahrts的文件夾圖6.SEQ圖\*ARABIC17含go-ecahrts的文件夾go-echarts安裝成功,接下來訪問,瀏覽教程與入門案例。入門實(shí)現(xiàn):圖6.SEQ圖\*ARABIC圖6.SEQ圖\*ARABIC18go-echartsLable示例圖6.SEQ圖\*ARABIC19示例運(yùn)行結(jié)果先定義數(shù)據(jù):varmapData=map[string]float32{"廣州市":float32(rand.Intn(150))}創(chuàng)建(實(shí)例化)新的地理坐標(biāo)地圖,類型為中國(guó)地圖:geo:=charts.NewGeo("china")然后對(duì)該地圖的配置項(xiàng)進(jìn)行設(shè)置,通過APISetGlobalOptions和Add來實(shí)現(xiàn):

圖6.圖6.SEQ圖\*ARABIC20go-echartsAPI說明本課題以Geo-顯示Lable為例,全局配置項(xiàng)里,包含有:TitleOpts(標(biāo)題組件配置項(xiàng))、VisualMapOpts(視覺映射組件配置項(xiàng)用于進(jìn)行『視覺編碼』,也就是將數(shù)據(jù)映射到視覺元素(視覺通道));系列配置項(xiàng)里,包含有:LabelTextOpts(圖形上的文本標(biāo)簽配置項(xiàng)),RippleEffectOpts(漣漪特效配置項(xiàng))。在里有全部配置的說明:圖6.SEQ圖\*ARABIC21圖6.SEQ圖\*ARABIC21go-echarts關(guān)于配置項(xiàng)的說明(1)圖6.7go-echarts生成html示例圖6.7go-echarts生成html示例圖6.6go-echarts關(guān)于配置項(xiàng)的說明(2)圖6.6go-echarts關(guān)于配置項(xiàng)的說明(2)設(shè)置好后執(zhí)行生成html文件:os.Create("map.html")圖6.8go-echarts入門代碼代碼實(shí)現(xiàn):圖6.8go-echarts入門代碼圖6.9入門實(shí)現(xiàn)效果圖 執(zhí)行后,在該go文件所在的目錄會(huì)有一個(gè)map.html文件,用瀏覽器來打開該文件。圖6.9入門實(shí)現(xiàn)效果圖go_echarts+mysql6.1實(shí)現(xiàn)了go-echarts反映出隨機(jī)數(shù)據(jù)構(gòu)成平均接入時(shí)延的地圖,現(xiàn)在在這個(gè)基礎(chǔ)上,加上GO語言對(duì)mysql數(shù)據(jù)的讀取,把同一個(gè)城市的每一個(gè)IP的接入時(shí)延通過循環(huán)計(jì)算出平均時(shí)延,再加入到對(duì)應(yīng)城市的echarts數(shù)據(jù)中,以此實(shí)現(xiàn)通過前端顯示各個(gè)城市的平均接入時(shí)延情況。首先是在map.go主函數(shù)里,實(shí)例化geo地理坐標(biāo)圖之前實(shí)現(xiàn)對(duì)mysql的連接,其次是對(duì)數(shù)據(jù)庫的讀取操作,再進(jìn)行數(shù)據(jù)的處理(平均值的計(jì)算)數(shù)據(jù)庫的連接:圖6.10go-echarts連接數(shù)據(jù)庫圖6.10go-echarts連接數(shù)據(jù)庫下面是對(duì)數(shù)據(jù)庫里的數(shù)據(jù)進(jìn)行查詢,因?yàn)榇枋龅氖荰ime(接入時(shí)延),所以查詢語句是:selectTimefromtestwhereCity=“廣州”。然后在循環(huán)中每次累加接入時(shí)延,并計(jì)算累加的次數(shù),將結(jié)果進(jìn)行處理后傳輸給廣州對(duì)應(yīng)的數(shù)據(jù)里。其他城市類比可得。圖6.11對(duì)取出的數(shù)據(jù)進(jìn)行處理圖6.11對(duì)取出的數(shù)據(jù)進(jìn)行處理整合調(diào)試通過直接登錄mysql查看是否與經(jīng)過go-echarts顯示出來的一樣。檢驗(yàn)mysql端的查詢結(jié)果:圖6.12mysql端的查詢結(jié)果圖6.12mysql端的查詢結(jié)果圖6.13echarts顯示結(jié)果echarts顯示結(jié)果:圖6.13echarts顯示結(jié)果檢查Mysql中4條數(shù)據(jù)的平均值,就等于echarts顯示的291毫秒??偨Y(jié)課題中的問題由于我本科學(xué)習(xí)較少接觸軟件方面知識(shí)與課程,只是學(xué)習(xí)了C語言程序設(shè)計(jì),在編程尤其對(duì)于網(wǎng)絡(luò)編程方面的知識(shí)比較欠缺,相當(dāng)于從零開始學(xué)習(xí)GO語言與TCP編程以及數(shù)據(jù)庫、前端,所以有些地方不夠嚴(yán)謹(jǐn),在設(shè)計(jì)過程中也遇到了許多的問題。關(guān)于環(huán)境變量在安裝好golang環(huán)境之后,先打開了命令提示符,cd到golang安裝文件夾的bin目錄進(jìn)行g(shù)oversion的執(zhí)行(檢查golang是否安裝成功),隨即進(jìn)行環(huán)境變量GOROOT、GOPATH、path的設(shè)置,緊接著在剛才打開的命令提示符cd到上一級(jí)進(jìn)行檢查goversion,結(jié)果系統(tǒng)無法識(shí)別“go”指令,這一過程困擾了我一段時(shí)間。最后我在CSDN論壇上找到了該現(xiàn)象出現(xiàn)的原因:設(shè)置好環(huán)境變量后沒有重新啟動(dòng)一個(gè)新的命令提示符,而是直接在之前打開的cmd里執(zhí)行g(shù)o操作,所以導(dǎo)致了該問題的出現(xiàn)?;诒敬纬鲥e(cuò)之后,下面的git軟件安裝之后配置完環(huán)境變量,我重啟了cmd再去運(yùn)行g(shù)it--version檢查git是否成功設(shè)置好環(huán)境變量。關(guān)于utf8在安裝mysql時(shí),有一個(gè)設(shè)置是確定編碼類型,我選擇了utf-8。同時(shí)在創(chuàng)建一個(gè)表的時(shí)候也設(shè)置了ENGINE=InnoDBDEFAULTCHARSET=utf8;但是在Mysql(命令提示符狀態(tài)下)中向表插入數(shù)據(jù)時(shí)發(fā)現(xiàn),原來定義為varchar(100)的City在接收中文字符時(shí)失敗,出現(xiàn)了亂碼情況,查詢操作也如此。網(wǎng)上查閱之后,原來還需要在命令提示符狀態(tài)下的myql執(zhí)行設(shè)置:setcharacter_set_client=gbk;即可。在本次設(shè)計(jì)中,我感受到安裝好開發(fā)軟件與環(huán)境后是成功的一半。我由于安裝軟件以及調(diào)試的原因所耗費(fèi)的時(shí)間幾乎占去三分之一。特別是較少接觸軟件編程的,很容易在開發(fā)工具的安裝和環(huán)境的搭建中踩陷阱,此時(shí)只能通過查閱大量資料來排查是哪個(gè)步驟出現(xiàn)了問題,比如環(huán)境變量是否正確設(shè)置等等。其次,受開發(fā)者計(jì)算機(jī)限制,有些配置問題在資料中沒有提到的注意事項(xiàng)也會(huì)很“玄學(xué)”地困擾設(shè)計(jì)者們,有時(shí)候這個(gè)軟件在這臺(tái)計(jì)算機(jī)無法正常運(yùn)行或者運(yùn)行結(jié)果出錯(cuò),但同樣的軟件在另一臺(tái)計(jì)算機(jī)卻能完美地實(shí)現(xiàn)預(yù)期,這些都是難以控制的偶然因素。展望隨著GO語言的普及和更多優(yōu)質(zhì)資源、版本的開源,它的優(yōu)勢(shì)(尤其在網(wǎng)絡(luò)中處理并發(fā)問題)逐漸被更多的開發(fā)者們看重,由Google推出的GO程序語言,是世界上正在快速崛起的幾個(gè)程序語言之一,根據(jù)統(tǒng)計(jì)全球已有超過一百萬位開發(fā)者正在積極的使用。Go語言在并發(fā)方面,goroutine和channel機(jī)制提供了輕量級(jí)并發(fā)機(jī)制;在性能方面,與Java的性能不分上下,而內(nèi)存資源消耗方面,相對(duì)Java和其他動(dòng)態(tài)語言,具備明顯的優(yōu)勢(shì)。在網(wǎng)絡(luò)和HTTP應(yīng)用方面,Go語言有良好的標(biāo)準(zhǔn)庫和生態(tài)系統(tǒng)支持,而在標(biāo)準(zhǔn)庫方面,已提供了處理多種網(wǎng)絡(luò)所需的輕量級(jí)的代碼庫,對(duì)網(wǎng)絡(luò)的核心協(xié)議HTTP的高并發(fā)支持,完全可以撼動(dòng)Java[8]。加上go-echarts今年也開源了,一整條從服務(wù)器后端到前端的連線就實(shí)現(xiàn)了很好的橋接?;诖苏n題中一種測(cè)數(shù)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn),也符合當(dāng)今網(wǎng)絡(luò)使用者們的需求,更重要的是能給網(wǎng)絡(luò)調(diào)度的工作者們提供足夠準(zhǔn)確、可視化的數(shù)據(jù),為實(shí)現(xiàn)高質(zhì)量網(wǎng)絡(luò)服務(wù)人們奉獻(xiàn)了一份力量。參考文獻(xiàn)季民.計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)發(fā)展現(xiàn)狀及趨勢(shì)分析[J].中國(guó)新通信,2016,18(01):45.林劍辛.基于智能手機(jī)APP的移動(dòng)網(wǎng)絡(luò)數(shù)據(jù)服務(wù)質(zhì)量測(cè)量與分析[D].北京郵電大學(xué),2015.王常衡,任廣鵬,羅欽,盧曼.基于TCP的Socket網(wǎng)絡(luò)編程[J].科技經(jīng)濟(jì)導(dǎo)刊,2019,27(07):36.王偉才.基于SSH+Mysql+MongoDB的教育管理系統(tǒng)[D].青島理工大學(xué),2018.劉艷平.Go語言實(shí)現(xiàn)數(shù)據(jù)庫驅(qū)動(dòng)的方法[J].計(jì)算機(jī)與現(xiàn)代化,2018(01):113-115+122.徐欣威.基于ECharts的科技統(tǒng)計(jì)數(shù)據(jù)可視化設(shè)計(jì)與實(shí)現(xiàn)[J].天津科技,2019,46(03):66-70.李潁果.二維地圖展示技術(shù)在遙感產(chǎn)品生產(chǎn)訂單子系統(tǒng)中的應(yīng)用[D].河南大學(xué),2018.陳希,胡彬.Go語言在國(guó)產(chǎn)CPU平臺(tái)上應(yīng)用前景的探索與思考[J].電子技術(shù)應(yīng)用,2018,44(08):1-4+9.J.Meyerson,"TheGoProgrammingLanguage,"inIEEESoftware,vol.31,no.5,pp.104-104,Sept.-Oct.2014.E.W.Irawan,B.HendradjayaandW.D.Sunindyo,"TestcasegenerationmethodforGolanguage,"2016InternationalConferenceonDataandSoftwareEngineering(ICoDSE),Denpasar,2016,pp.1-5.H.Mun,J.Na,H.Park,S.Kim,Y.LeeandJ.Springer,"AnalysisoftheRelationshipBetweenServerLocationandRTT,"2018IEEE42ndAnnualComputerSoftwareandApplicationsConference(COMPSAC),Tokyo,2018,pp.939-942.致謝非常感謝我的指導(dǎo)老師田欣欣老師,田老師是一位非常細(xì)心負(fù)責(zé)的教師,當(dāng)對(duì)網(wǎng)絡(luò)編程幾乎是空白的我一開始接觸本設(shè)計(jì)時(shí),就開始指引我需要學(xué)習(xí)哪方面的知識(shí),并且按步驟列出了本設(shè)計(jì)的大概要點(diǎn),讓我從一開始就明確了本設(shè)計(jì)的目標(biāo)脈絡(luò)。盡管剛開始時(shí)由于我對(duì)概念的不熟悉,田老師還是耐心地指導(dǎo)我,通過線上、線下(教室輔導(dǎo)),甚至還有一次是周末,我遇到解決不了的接入時(shí)延問題,田老師也悉心幫我解答。田老師的輔導(dǎo)不僅讓我順利完成這次畢業(yè)設(shè)計(jì),初步學(xué)習(xí)掌握了有關(guān)這方面的知識(shí),同時(shí)還在為人處世、工作態(tài)度上立下了榜樣。同時(shí)也非常感謝劉博約助教,他在我最一知半解的時(shí)候提供了不少的資料、案例給我,讓我更快的掌握相關(guān)的知識(shí),還在整個(gè)大項(xiàng)目的角度為我講解了本設(shè)計(jì)的整體框架以及項(xiàng)目意義。在整個(gè)畢業(yè)設(shè)計(jì)過程中(前后幾個(gè)月時(shí)間),助教都保持在線狀態(tài),我一有問題的提出,他總是很及時(shí)地為我線上解答。感謝我的母校廣東工業(yè)大學(xué)四年來的培養(yǎng)教育,提供了優(yōu)質(zhì)的學(xué)習(xí)環(huán)境,尤其是圖書館,數(shù)據(jù)庫齊全,還提供了計(jì)算機(jī)環(huán)境,讓我們能夠在不同環(huán)境下調(diào)試代碼。我會(huì)持續(xù)學(xué)習(xí),繼續(xù)全方面完善自己,今后為企業(yè)或者為國(guó)家貢獻(xiàn)自己的綿薄之力,為校爭(zhēng)光。附錄客戶端完整代碼(client.go) packagemainimport( "bytes" "fmt" "io/ioutil" "net" "net/http" "strings" "os" "bufio" "time" "strconv")funcmain(){ conn,err:=net.Dial("tcp",":7777") iferr!=nil{ fmt.Println("clintdialerr=",err) return } fmt.Println("連接成功")//下面開始測(cè)試時(shí)延 fmt.Println("下面開始測(cè)試時(shí)延") t1:=time.Now()//記錄發(fā)包前時(shí)間 _,err=conn.Write([]byte("test"))//向服務(wù)器發(fā)包 iferr!=nil{ fmt.Println("testwrite",err) } buf:=make([]byte,1024)//發(fā)完后開始循環(huán)等待服務(wù)器的反饋 for{ n,err:=conn.Read(buf)//通過conn讀取服務(wù)器的反饋 a:=string(buf[:n])//將讀取到的切片組合成字符串 iferr!=nil{ fmt.Println("服務(wù)器test的Readerr=",err) }if(a=="testok"){//判斷是否設(shè)計(jì)規(guī)定的反饋?zhàn)址? break//如果是,退出此循環(huán) } fmt.Println("測(cè)接入時(shí)延出現(xiàn)錯(cuò)誤,此反饋為",a) } t2:=time.Now()//上面退出循環(huán)后馬上記錄當(dāng)前時(shí)間點(diǎn) t0:=t2.Sub(t1) t3:=time.Duration.Nanoseconds(t0)//將結(jié)果轉(zhuǎn)換成整數(shù)類型t:=t3/1000000.0//使用毫秒單位來描述 fmt.Printf("接入延時(shí)為:%d毫秒\n",t) //下面是把接入延時(shí)傳入服務(wù)器,然后入庫 ts:=strconv.FormatInt(t,10)//引用stronv包,把Int類型的延時(shí)轉(zhuǎn)成string類型 s,err:=conn.Write([]byte(ts))//把string類型的延時(shí)切片傳送給服務(wù)器 iferr!=nil{ fmt.Println("Write失敗",err) } fmt.Println("接入延遲寫入成功,發(fā)送了數(shù)字?jǐn)?shù):",s) external_ip:=get_external() fmt.Println("本客戶端公網(wǎng)為",external_ip) n,err:=conn.Write([]byte(external_ip)) iferr!=nil{ fmt.Println("Write失敗",err) } fmt.Println("發(fā)送數(shù)據(jù)",n)//把公網(wǎng)IP發(fā)送給服務(wù)器 //下面循環(huán)卡住發(fā)信息不讓退出 for{ reader:=bufio.NewReader(os.Stdin) fmt.Println("請(qǐng)輸入") line,err:=reader.ReadString('\n') iferr!=nil{ fmt.Println("輸入時(shí)失敗",err) } line=strings.Trim(line,"\r\n") ifline=="exit"{ fmt.Println("退出") break } _,err=conn.Write([]byte(line+"\n")) iferr!=nil{ fmt.Println("conn.Writeerr=",err) } }}funcget_external()string{ resp,err:=http.Get("/raw") iferr!=nil{ return"" } deferresp.Body.Close() content,_:=ioutil.ReadAll(resp.Body) buf:=new(bytes.Buffer) buf.ReadFrom(resp.Body) //s:=buf.String() returnstring(content)}服務(wù)器完整代碼(server.go)packagemainimport( "encoding/json" "fmt" "io/ioutil" "net" "net/http" "strconv" _"/go-sql-driver/mysql" "database/sql" "time" "math/rand")typeIPInfostruct{ Codeint`json:"code"` DataIP`json:"data"`}typeIPstruct{ Countrystring`json:"country"` CountryIdstring`json:"country_id"` Areastring`json:"area"` AreaIdstring`json:"area_id"` Regionstring`json:"region"` RegionIdstring`json:"region_id"` Citystring`json:"city"` CityIdstring`json:"city_id"` Ispstring`json:"isp"`}funcprocess(connnet.Conn){ deferconn.Close() //下面是顯示 fmt.Printf("正在讀取接入延遲") buf2:=make([]byte,1024) s,err:=conn.Read(buf2) iferr!=nil{ fmt.Println("讀取接入延遲失敗err=",err) } fmt.Println("讀取接入延遲成功") ss:=string(buf2[:s]) t,err:=strconv.ParseInt(ss,10,64) iferr!=nil{ fmt.Println("string轉(zhuǎn)int失敗",err) } fmt.Printf("轉(zhuǎn)換成int:%d毫秒\n",t) fmt.Printf("延遲為:%d毫秒\n",t) fmt.Printf("該客戶端公網(wǎng)IP為") buf1:=make([]byte,1024) n,err:=conn.Read(buf1) iferr!=nil{ fmt.Println("服務(wù)器的Readerr=",err) } fmt.Print(string(buf1[:n])) fmt.Printf("\n") external_ip:=string(buf1[:n]) //地域信息 ip:=net.ParseIP(external_ip) ifip==nil{ fmt.Println("您輸入的不是有效IP地址,請(qǐng)重新輸入!") }else{ result:=TabaoAPI(string(external_ip)) ifresult!=nil{ fmt.Println("國(guó)家:",result.Data.Country) fmt.Println("城市:",result.Data.City) fmt.Println("運(yùn)營(yíng)商:",result.Data.Isp) //下面向mysql數(shù)據(jù)庫發(fā)送并存儲(chǔ)用戶IP,國(guó)家,城市,運(yùn)營(yíng)商 db,_:=sql.Open("mysql","root:123456@(:3306)/itcast") deferdb.Close() err=db.Ping() iferr!=nil{ fmt.Println("連接Mysql失敗",err) return }fmt.Println("連接mysql成功") //IPint:=StringIpToInt(external_ip) stmt,err:=db.Prepare(`REPLACEINTOtext(IP,Country,City,Type,Time)values(?,?,?,?,?)`)iferr!=nil{ fmt.Println("prepare失敗",err) return }res1,err:=stmt.Exec(external_ip,result.Data.Country,result.Data.City,result.Data.Isp,t)iferr!=nil{ fmt.Println("exec失敗",err) return } fmt.Println("操作插入mysql成功",res1) } } //下面循環(huán)等待客戶端發(fā)送信息 for{ buf:=make([]byte,1024) n,err:=conn.Read(buf) iferr!=nil{ fmt.Println("Read出錯(cuò)",err) return } fmt.Println(string(buf[:n])) }}funcmain(){ fmt.Println("服務(wù)器開始監(jiān)聽...") listen,err:=net.Listen("tcp",":7777

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論