基于TCP的服務(wù)器客戶端程序設(shè)計_第1頁
基于TCP的服務(wù)器客戶端程序設(shè)計_第2頁
基于TCP的服務(wù)器客戶端程序設(shè)計_第3頁
基于TCP的服務(wù)器客戶端程序設(shè)計_第4頁
基于TCP的服務(wù)器客戶端程序設(shè)計_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、重慶交通大學(xué)信息科學(xué)與工程學(xué)院 課程設(shè)計實驗報告 專 業(yè): 學(xué) 號: 姓 名: 實驗室(中心): 信息技術(shù)軟件實驗室 指 導(dǎo) 教 師 : 實驗完成時間: 2015 年 1 月 12 日目錄1、 實驗設(shè)計題目-22、 實驗?zāi)康?23、 實驗設(shè)計要求-24、 課程設(shè)計條件-2五、實驗設(shè)計分析-4六、實驗設(shè)計流程圖-9七、結(jié)果分析-13八、實驗心得體會-14九、實驗主要代碼-15171、 實驗設(shè)計題目基于tcp的服務(wù)器/客戶端程序設(shè)計2、 實驗?zāi)康?、 理解客戶端與服務(wù)器模型的工作原理。2、 掌握套接字的概念。3、 掌握tcp協(xié)議,基于tcp協(xié)議來設(shè)計此客戶端/服務(wù)器程序。4、 通過設(shè)計面向連接的數(shù)

2、據(jù)流傳輸服務(wù)程序,加深對面向連接的服務(wù)程序工作流程和基本框架的理解。3、 實驗設(shè)計要求1)任選一種編程語言,編程實現(xiàn)面向連接的客戶/服務(wù)器程序,客戶端、服務(wù)器端分別編程;2) 編程要充分體現(xiàn)服務(wù)器端與客戶端的連接建立、數(shù)據(jù)傳輸、連接釋放的過程;四、課程設(shè)計條件 本次課程設(shè)計我采用的是java語言,實現(xiàn)客戶端和服務(wù)器之間的聯(lián)系。 java 編程語言的風(fēng)格十分接近c、c+語言。java是一個純的面向?qū)ο蟮某绦蛟O(shè)計語言,它繼承了 c+語言面向?qū)ο蠹夹g(shù)的核心。java舍棄了c +語言中容易引起錯誤的指針(以引用取代)、運算符重載(operator overloading)、多重繼承(以接口取代)等特性

3、,增加了垃圾回收器功能用于回收不再被引用的對象所占據(jù)的內(nèi)存空間,使得程序員不用再為內(nèi)存管理而擔(dān)憂。在 java 1.5 版本中,java 又引入了泛型編程(generic programming)、類型安全的枚舉、不定長參數(shù)和自動裝/拆箱等語言特性。java 不同于一般的編譯執(zhí)行計算機語言和解釋執(zhí)行計算機語言。它首先將源代碼編譯成二進(jìn)制字節(jié)碼(bytecode),然后依賴各種不同平臺上的虛擬機來解釋執(zhí)行字節(jié)碼。從而實現(xiàn)了“一次編譯、到處執(zhí)行”的跨平臺特性。不過,每次的執(zhí)行編譯后的字節(jié)碼需要消耗一定的時間,這同時也在一定程度上降低了 java 程序的運行效率。java語言的變量聲明,操作符形式,

4、參數(shù)傳遞,流程控制等方面和c語言,c+語言完全相同.盡管如此,java和c語言,c+語言又有許多差別,主要表現(xiàn)在如下幾個方面:java中對內(nèi)存的分配是動態(tài)的,它采用面向?qū)ο蟮臋C制,采用運算符new為每個對象分配內(nèi)存空間,而且,實際內(nèi)存還會隨程序運行情況而改變。程序運行中 java系統(tǒng)自動對內(nèi)存進(jìn)行掃描,對長期不用的空間作為”垃圾”進(jìn)行收集,使得系統(tǒng)資源得到更充分地利用.按照這種機制,程序員不必關(guān)注內(nèi)存管理問題,這使java程序的編寫變得簡單明了,并且避免了由于內(nèi)存管理方面的差錯而導(dǎo)致系統(tǒng)出問題。而c語言通過malloc()和free()這兩個庫函數(shù)來分別實現(xiàn)分配內(nèi)存和釋放內(nèi)存空間的,c+語言中

5、則通過運算符new和delete來分配和釋放內(nèi)存。在c和c+這種機制中,程序員必須非常仔細(xì)地處理內(nèi)存的使用問題。一方面,如果對己釋放的內(nèi)存再作釋放或者對未曾分配的內(nèi)存作釋放,都會造成死機;而另一方面,如果對長期不用的或不再使用的內(nèi)存不釋放,則會浪費系統(tǒng)資源,甚至因此造成資源枯竭。 java不在所有類之外定義全局變量,而是在某個類中定義一種公用靜態(tài)的變量來完成全局變量的功能。 java不用goto語句,而是用try-catch-finally異常處理語句來代替goto語句處理出錯的功能。 java不支持頭文件,而c和c+語言中都用頭文件來定義類的原型,全局變量,庫函數(shù)等,這種采用頭文件的結(jié)構(gòu)使得

6、系統(tǒng)的運行維護相當(dāng)繁雜。 java不支持宏定義,而是使用關(guān)鍵字final來定義常量,在c+中則采用宏定義來實現(xiàn)常量定義,這不利于程序的可讀性。 java對每種數(shù)據(jù)類型都分配固定長度。比如,在java中,int類型總是32位的,而在c和c+中,對于不同的平臺,同一個數(shù)據(jù)類型分配不同的字節(jié)數(shù),同樣是int類型,在pc機中為二字節(jié)即16位,而在vax-11中,則為32位.這使得c語言造成不可移植性,而java則具有跨平臺性(平臺無關(guān)性)。java語言編寫的類庫可以在其它平臺的java應(yīng)用程序中使用,而不像c+語言必須依賴于windows平臺。五、實驗設(shè)計分析 本實驗的設(shè)計是基于tcp/ip協(xié)議的程序

7、時,傳輸層使用tcp協(xié)議,它的最大特點是在通信之前要在客戶和服務(wù)器之間先建立連接,在數(shù)據(jù)傳輸完成后要關(guān)閉連接,釋放網(wǎng)絡(luò)資源。對于tcp協(xié)議,主要有以下特點:(1) tcp是面向連接的運輸層協(xié)議。應(yīng)用程序在使用tcp協(xié)議之前,必須先建立tcp連接。在傳送數(shù)據(jù)完畢后,必須釋放已經(jīng)建立的tcp連接。也就是說,應(yīng)用進(jìn)程之間的通信好像在“打電話”:通話前要先撥號建立連接,通話結(jié)束后要掛機釋放連接。(2) 每一條tcp連接只能有兩個端點,每一條tcp連接只能是點對點的,即一對一的連接。(3) tcp提供可靠交付的服務(wù)。通過tcp連接傳送的數(shù)據(jù),無差錯、不丟失、不重復(fù),并且按序到達(dá)。(4) tcp提供全雙工

8、通信。tcp允許通信雙方的應(yīng)用進(jìn)程在任何時候都能發(fā)送數(shù)據(jù)。tcp連接的兩端都設(shè)有發(fā)送緩存和接受緩存,用來臨時存放雙向通信的數(shù)據(jù)。在發(fā)送時,應(yīng)用程序在把數(shù)據(jù)傳送到tcp的緩存后,就可以做自己的事,而tcp在合適的時候把數(shù)據(jù)發(fā)送出去。在接收時,tcp把收到的數(shù)據(jù)放入緩存,上層的應(yīng)用進(jìn)程在合適的時候讀取緩存中的數(shù)據(jù)。(5) 面向字節(jié)流。tcp中的“流”指的是流入到進(jìn)程或從進(jìn)程流出的字節(jié)序列。雖然應(yīng)用程序和tcp的交互是一次一個數(shù)據(jù)塊,但tcp把應(yīng)用程序交下來的數(shù)據(jù)看成僅僅是一連串的無結(jié)構(gòu)的字節(jié)流。tcp不保證接收方應(yīng)用程序所收到的數(shù)據(jù)塊和發(fā)送方應(yīng)用程序所發(fā)出的數(shù)據(jù)塊具有對應(yīng)大小的關(guān)系。但接收方應(yīng)用程

9、序收到的字節(jié)流必須和發(fā)送方應(yīng)用程序發(fā)出的字節(jié)流完全一樣。tcp連接是一條虛連接而不是一條真正的物理連接。tcp報文段先要傳送到ip層,加上ip首部后,再傳送到數(shù)據(jù)鏈路層。再加上數(shù)據(jù)鏈路層的首部和尾部后,才離開主機發(fā)送到物理鏈路。每一條tcp連接有兩個端點,這個端點就是套接字(socket),端口號拼接到ip地址即構(gòu)成了套接字,每一條tcp連接唯一地被通信兩端的兩個端點,即兩個套接字所確定。同一個ip地址可以有多個不同的tcp連接,而同一個端口號也可以出現(xiàn)在不同的tcp連接中。tcp是面向連接的協(xié)議。運輸連接是用來傳送tcp報文的。tcp運輸連接的建立和釋放是每一次面向連接的通信中必不可少的進(jìn)程

10、。因此,運輸連接就有三個階段,即:連接建立、數(shù)據(jù)傳送和連接釋放。運輸連接的管理就是使運輸連接的建立和釋放都能正常的進(jìn)行。在tcp連接建立過程中要解決一下三個問題:(1) 要使每一方能夠確知對方的存在。(2) 要允許雙方協(xié)商一些參數(shù)(如最大窗口值、是否使用窗口擴大選項和時間戳選項及服務(wù)質(zhì)量等)。(3) 能夠?qū)\輸實體資源(如緩存大小、連接表中的項目等)進(jìn)行分配。 tcp連接的建立采用客戶服務(wù)器方式。主動發(fā)起連接建立的應(yīng)用進(jìn)程叫做客戶,而被動等待連接建立的應(yīng)用進(jìn)程叫做服務(wù)器。closedlistensyn-rcvdestab-lishedclosedsyn-sentestab-lished服務(wù)器b

11、客戶a 下圖是tcp連接建立的過程。 數(shù)據(jù)傳送 主機a運行的是tcp客戶程序,而b運行tcp服務(wù)器程序。最初兩端的tcp進(jìn)程都處于closed狀態(tài)。a是主動打開連接,而b是被動打開連接。 b的tcp服務(wù)器進(jìn)程先創(chuàng)建傳輸控制塊tcb,準(zhǔn)備接受客戶進(jìn)程的連接請求。然后服務(wù)器進(jìn)程就處于listen狀態(tài),等待客戶的連接請求。如有,即做出響應(yīng)。a的tcp客戶進(jìn)程也是首先創(chuàng)建傳輸控制模塊tcb,然后向b發(fā)出連接請求報文段,這時首部中的同步位syn=1,同時選擇一個初始序號seq=x。syn報文段不能攜帶數(shù)據(jù),但要消耗掉一個序號。這時,tcp客戶進(jìn)程進(jìn)入syn-sent狀態(tài)。b收到連接請求報文段后,如同意建

12、立連接,則向a發(fā)送確認(rèn)。在確認(rèn)報文段中應(yīng)把syn位和ack位都置1,確認(rèn)號是ack=x+1,同時也為自己選擇一個初始序號seq=y。這個報文段也不能攜帶數(shù)據(jù),但同樣要消耗掉一個序號。這時tcp服務(wù)器進(jìn)程進(jìn)入syn-rcvd狀態(tài)。tcp客戶進(jìn)程收到b的確認(rèn)后,還要向b給出確認(rèn)。確認(rèn)報文段的ack置1,確認(rèn)號ack=y+1,而自己的序號seq=x+1,ack報文段可以攜帶數(shù)據(jù),但如果不攜帶數(shù)據(jù)則不消耗序號,在這種情況下,下一個數(shù)據(jù)報文段的序號仍是seq=x+1。這時,tcp連接已經(jīng)建立,a進(jìn)入established狀態(tài)。當(dāng)b收到a確認(rèn)后,也進(jìn)入established狀態(tài),這個過程就是三次握手。數(shù)據(jù)

13、傳輸結(jié)束后,通信雙方都可釋放連接。現(xiàn)在a和b都處established狀態(tài)。a的應(yīng)用進(jìn)程先向其tcp發(fā)出連接釋放報文段,并停止再發(fā)送數(shù)據(jù),主動關(guān)閉tcp連接。a把連接釋放報文段首部的終止控制位fin置1,其序號seq=u,它等于前面已傳送過的數(shù)據(jù)的最后的一個字節(jié)的序號加1。這時a進(jìn)入fin-wait-1狀態(tài),等待b的確認(rèn)。fin報文段即使不攜帶數(shù)據(jù),它也消耗掉一個序號。b收到連接釋放報文段后即發(fā)出確認(rèn),確認(rèn)號是ack=u+1,而這個報文段自己的序號是v,等于b前面已傳送過的數(shù)據(jù)的最后一個字節(jié)的序號加1。然后b就進(jìn)入close-wait狀態(tài)。tcp服務(wù)器進(jìn)程這時應(yīng)停止高層應(yīng)用進(jìn)程,因而從a到b這

14、個方向的連接就釋放了,這時的tcp連接處于半關(guān)閉狀態(tài),即a已經(jīng)沒有數(shù)據(jù)要發(fā)送了,但b若發(fā)送數(shù)據(jù),a仍要接收。也就是說,從b到a這個方向的連接并為關(guān)閉,這個狀態(tài)可能會持續(xù)一些時間。a收到來自b的確認(rèn)后,就進(jìn)入fin-wait-2狀態(tài),等待b發(fā)出的連接釋放報文段。若b已經(jīng)沒有要向a發(fā)送的數(shù)據(jù),其應(yīng)用進(jìn)程就通知tcp釋放連接。這時b發(fā)出的連接釋放報文段必須使fin=1。假定b的序號為w,b還必須重復(fù)上次已發(fā)送過的確認(rèn)號ack=u+1。這是b就進(jìn)入last-ack狀態(tài),等待a的確認(rèn)。a在收到b的連接釋放報文段后,必須對此發(fā)出確認(rèn)。在確認(rèn)報文段中把ack置1,確認(rèn)號ack=w+1,而自己的序號是seq=

15、u+1。然后進(jìn)入到time-wait狀態(tài)。要經(jīng)過4分鐘才能進(jìn)入到closed狀態(tài),才能開始建立下一個新的連接,當(dāng)a撤銷相應(yīng)的傳輸控制塊tcb后,就結(jié)束了這次的tcp連接。這個過程就是tcp連接釋放過程的四次握手。tcp的連接釋放采用四次握手機制。任何一方都可以在數(shù)據(jù)傳送結(jié)束后發(fā)出連接釋放的通知,待對方確認(rèn)后就進(jìn)入半關(guān)閉狀態(tài)。當(dāng)另一方也沒有數(shù)據(jù)再發(fā)送時,則發(fā)送連接通知,對方確認(rèn)后就完全關(guān)閉了tcp連接。如下圖所示。服務(wù)器b客戶 aestab-lishedclose-waitlast-ackclosedestab-lishedfin-wait-1fin-wait-2time-waitclosed主

16、動 數(shù)據(jù)傳送被動 tcp雖然是面向字節(jié)流的,但tcp傳送的數(shù)據(jù)單元卻是報文段。一個tcp報文段分為首部和數(shù)據(jù)兩部分,而tcp的全部功能都體現(xiàn)在它的首部中各字段的作用。因此,只有弄清tcp首部各字段的作用才能掌握tcp的工作原理。 tcp報文段首部的前20個字節(jié)是固定的,后面有4n字節(jié)是根據(jù)需要而增加的選項。因此tcp首部的最小長度是20字節(jié)。如下圖所示。對于tcp報文段中的序號部分,它是占了4 字節(jié),tcp是面向字節(jié)流的,在下一個tcp連接中傳送的字節(jié)流中的每一個字節(jié)都按順序編號,整個要傳送的字節(jié)流的起始序號必須在連接建立時設(shè)置。首部中的序號字段值則指的是本報文段所發(fā)送的數(shù)據(jù)的第一個字節(jié)的序號

17、。例如,一報文段的序號字段值是301,而攜帶的數(shù)據(jù)共有100字節(jié)。這就表明:本報文段的數(shù)據(jù)的第一個字節(jié)的序號是301,最后一個字節(jié)的序號是400。顯然,下一個報文段的數(shù)據(jù)序號應(yīng)該從401開始。對于確認(rèn)號,是占4個字節(jié),是期望收到對方下一個報文段的第一個數(shù)據(jù)字節(jié)的序號。例如,b正確收到了a發(fā)送過來的一個報文段,其序號字段值是501,而數(shù)據(jù)長度是200字節(jié),這表明b正確收到了a發(fā)送的到序號700為止的數(shù)據(jù)。因此,b期望收到a的下一個數(shù)據(jù)序號是701,于是b在發(fā)送給a的確認(rèn)報文段中把確認(rèn)號置為701。還有一個比較重要的部分就是校驗和。是占2個字節(jié),校驗和字段檢驗的范圍包括首部和數(shù)據(jù)這兩部分。在計算校

18、驗和時,要在tcp報文段的前面加上12字節(jié)的偽首部。偽首部的格式與udp用戶數(shù)據(jù)報的偽首部一樣。但應(yīng)把偽首部第4個字段中的17改為6,把第5字段中的udp長度改為tcp長度,接收方收到此報文段后,仍要加上這個偽首部來計算校驗和。tcp可靠傳輸?shù)膶崿F(xiàn)是已字節(jié)為單位的滑動窗口。發(fā)送窗口是根據(jù)接收窗口設(shè)置的,但在同一時刻,發(fā)送窗口并不總是和接受窗口一樣大。這是因為通過網(wǎng)絡(luò)傳送窗口值需要經(jīng)歷一定的時間滯后。發(fā)送方還可以根據(jù)網(wǎng)絡(luò)當(dāng)時的擁塞情況適當(dāng)?shù)臏p小自己的發(fā)送窗口值。對不按序到達(dá)的數(shù)據(jù)是先臨時存放在接受窗口中,等到字節(jié)流中所缺少的字節(jié)收到后,再按序交付上層的應(yīng)用進(jìn)程。tcp要求接收方必須有累積確認(rèn)的功

19、能,這樣可以減少傳輸開銷。接收方可以在合適的時候發(fā)送確認(rèn),也可以在自己有數(shù)據(jù)要發(fā)送時把確認(rèn)信息順便捎帶上。但是,接收方也不應(yīng)該過分推遲發(fā)送確認(rèn),否則會導(dǎo)致發(fā)送方不必要的重傳,這回浪費網(wǎng)絡(luò)的資源。其次,捎帶確認(rèn)實際上并不經(jīng)常發(fā)生,因為大多數(shù)應(yīng)用程序不同時在兩個方向上發(fā)送數(shù)據(jù)。六、實驗設(shè)計流程圖本課程設(shè)計采用的是java語言編制的,在java中,客戶端和服務(wù)器之間的通信編程一般是基于socket實現(xiàn)的。socket是兩個實體之間進(jìn)行通信的有效端點,通過socket可以獲得源ip地址和源端口、終點ip地址和終點端口,并創(chuàng)建一個能被多人使用的分布式應(yīng)用程序,實現(xiàn)與服務(wù)器的雙向自由通信。本設(shè)計是一對多的

20、socket通信,即一個服務(wù)器對應(yīng)多個客戶端,采用的方法是將socket對象放置在線程中,這樣當(dāng)每一個socket對象執(zhí)行完任務(wù)后,只有包含該socket對象的線程會終止,對其他線程沒有任何影響。服務(wù)器:服務(wù)器是用來接收客戶端的各種信息的,并把信息傳送回給客戶端。網(wǎng)絡(luò)應(yīng)用程序一般是以客戶機/服務(wù)器的模型的方式工作的。因特網(wǎng)是客戶機/服務(wù)器模型的一個典型應(yīng)用。在這種工作方式中,一個服務(wù)器程序通常事先啟動,并在一個熟知端口偵聽對服務(wù)器的請求。當(dāng)客戶機應(yīng)用程序需要某種服務(wù)時,需向提供這種服務(wù)的服務(wù)器發(fā)出請求,服務(wù)器在接收到請求后,向客戶機發(fā)出相應(yīng)請求信息。這樣客戶機應(yīng)用程序和服務(wù)器程序之間便建立了通

21、信連接此后可以進(jìn)行數(shù)據(jù)通信。通信任務(wù)完成后需要關(guān)閉它們之間的通信連接。 開始客戶端:設(shè)置一個新的socket,定義端口號為5500,連接到本機將輸入數(shù)據(jù)流連接到socket上將數(shù)據(jù)輸出流連接到socket上打印輸入待求平方值,輸入bye結(jié)束將輸入數(shù)據(jù)流讀入到緩存中進(jìn)行一個while死循環(huán)讀入用戶的寫入寫到socket中寫到socket中,清空緩存區(qū),立即發(fā)送,從socket中讀數(shù)據(jù)輸入為bye?ny返回結(jié)果 結(jié)束服務(wù)器線程:相當(dāng)于服務(wù)器里面的socket的一個集合,執(zhí)行一次,就運行一個socket對象,當(dāng)每一個socket對象執(zhí)行完任務(wù)后,只有包含該socket對象的線程會終止,對其他線程沒有

22、任何影響。 結(jié)束輸出結(jié)果進(jìn)行平方運算將接收到的值打印出來清空緩存區(qū),立即發(fā)送將bye寫入到socket中y數(shù)據(jù)為bye?讀緩存中的數(shù)據(jù)執(zhí)行while死循環(huán)在run()方法中與客戶端通信啟動run()方法 開始在構(gòu)造方法中為每個套接字連接輸入和輸出流七、結(jié)果分析首先,運行的是服務(wù)器的主程序,由顯示可知,服務(wù)器已處于等待連接狀態(tài)。然后運行的是客戶端的程序代碼??芍?wù)器與客戶端已建立了連接。此連接的建立是通過服務(wù)器和客戶端都有一個端口號一樣的socket,這樣才可以建立連接。連接建立以后,就要開始進(jìn)行數(shù)據(jù)傳輸了,通過客戶端輸入要傳送的數(shù)據(jù),此數(shù)據(jù)通過客戶端和服務(wù)器之間建立的連接進(jìn)入到服務(wù)器。在服

23、務(wù)器中又調(diào)用線程的程序,來進(jìn)行數(shù)據(jù)的出來,本設(shè)計是對數(shù)據(jù)進(jìn)行求平方,并把結(jié)果返回給客戶端。在客戶端輸入bye之后,便刪除了所建立的連接。多次運行客戶端的程序,即可實現(xiàn)一對多的通信過程,一個服務(wù)器對應(yīng)多個客戶端,每次執(zhí)行完一次,便終止此socket對象,下次執(zhí)行的時候,再進(jìn)行另外一個線程。八、實驗心得體會 經(jīng)過不斷的修改與查找資料,終于完成了此次課程設(shè)計實驗,雖說這次設(shè)計的實驗不是很大型,但是還是學(xué)到了很多東西,收獲頗豐,不僅學(xué)習(xí)到了一些新的知識,回顧了一些以前快要遺忘的知識點,而且是自己的學(xué)習(xí)目標(biāo)更加明確,學(xué)習(xí)方法更加完善,也體會到了軟件開發(fā)的趣味,更加清楚的認(rèn)識到了自己在軟件開發(fā)及學(xué)習(xí)上的不

24、足之處。 此次設(shè)計的是服務(wù)器與客戶端之間進(jìn)行通信,老師在我們設(shè)計之前講解的很清晰,使得我們大家操作起來比較嫻熟。讓我感覺到了軟件編程的趣味性和實用性,雖說一些技術(shù)我們在課堂上也曾學(xué)習(xí)過,但是大都停留在理論基礎(chǔ)上,實際開發(fā)很少,而這次實驗給了我們一個很好的邊學(xué)習(xí)邊實踐的機會,對我們深入學(xué)習(xí)這些技術(shù)有很大的幫助,深刻體會到了這些技術(shù)的實用性。這次課程設(shè)計的編程我采用的是java的語言,雖說以前沒有學(xué)習(xí)過這門語言,可是經(jīng)過兩個多星期的查找資料與詢問同學(xué),大致上對于java的編程方法還是有了一定的理解和認(rèn)識。java的功能很強大,有很多要實現(xiàn)的功能,只要通過調(diào)用一些函數(shù)就可以實現(xiàn)了,確實是很好用的一門

25、語言。每當(dāng)自己成功調(diào)試一段代碼或者通過自己的努力克服一個技術(shù)困難,都頗有收獲感。這次實驗讓我們體驗了軟件的實用性,發(fā)現(xiàn)自己的不足,增加了一定的編程經(jīng)驗。結(jié)束了此次實驗,讓我發(fā)現(xiàn)我對我們專業(yè)有了新的認(rèn)識,通過這次實驗,我了解到,要真真正正掌握到計算機程序不是一件簡單的事情,但真正掌握后,它帶給我們的將是無窮的便捷與科技,我會努力學(xué)習(xí)計算機的!九、實驗主要代碼【服務(wù)器線程程序】package .cqjtu.socket2;import java.io.*;import .*;public class serverthread extends threadprivate socket s

26、;private datainputstream is;/輸入數(shù)據(jù)流private dataoutputstream os;/輸出數(shù)據(jù)流/在構(gòu)造方法中為每個套接字連接輸入和輸出流public serverthread(socket socket) throws ioexceptionsuper();s=socket;is=new datainputstream(s.getinputstream();os=new dataoutputstream(s.getoutputstream();start(); /啟動run()方法/在run()方法中與客戶端通信public void run()try

27、string str;double result,zhi;boolean notend=true;while(notend)str=is.readutf();/讀數(shù)據(jù)if(!str.equals(bye)zhi=double.parsedouble(str);system.out.println(接收到的值為:+zhi);result=zhi*zhi;str=double.tostring(result);os.writeutf(str);/寫入數(shù)據(jù)os.flush();/清空緩存system.out.println(平方值+str+已經(jīng)發(fā)送);elsenotend=false;os.writeutf(bye);os.flush();is.close();os.close();s.close();catch(ioexception e)e.printstacktrace();【服務(wù)器主程序】package .cqjtu.socket2;import java.io.*;import .*;public class multiserver public static void main(stringargs)trysystem.out.println(等待連接);serversocket se

溫馨提示

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

評論

0/150

提交評論