




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
《計算機網絡原理》實驗指導書課程代碼:0660086天津理工大學計算機計算機科學與工程學院2023年9月
目錄一、實驗指導書的選用范圍 1二、計算機網絡技術課程簡介 1三、實驗的地位、作用和目的及學生能力標準 1四、實驗方式與基本規定 1五、考核方式與實驗報告規定 2六、實驗項目 2實驗一:驗證常用網絡命令 2實驗1.1驗證常用的網絡命令 2實驗1.2用telnet方式收發郵件 11實驗二:基于TCP/UDP的Socket編程 14實驗2.1:基于TCPandUDP的socket編程 14實驗2.2:基于TCP的WebServer 14實驗2.3:基于TCP/UDP的Daytime的客戶端和服務器端 14實驗2.4:基于TCP/UDP的Echo的客戶端和服務器端 15實驗2.5SOCKET編程實現聊天程序 15實驗2.6SOCKET編程實現miniFTPClient/Server程序 15附錄1參考程序 16附錄2網絡編程接口WinSockAPI 19實驗三:模擬環境下的路由器配置 263.1[BosonRouterSimulator4.3安裝及注冊] 263.2[BosonRouterSimulator啟動及使用] 323.3實驗習題 36七、實驗重要儀器名稱 42八、課程設計交付成果說明 42
一、實驗指導書的選用范圍課程名稱:計算機網絡原理所屬專業:計算機科學與技術、信息與計算科學領域方向:網絡編程,網絡管理,網絡安全等相關方向參考學時:課內12學時,課外12學時以上合用學生:計算機及相關專業的本科生先修課規定:《通信原理基礎》、《數據結構》、《面向對象程序設計C++》、《計算機組成原理》等實驗成績占總成績:20% 大綱依據:課程指導委員會指導意見二、計算機網絡技術課程簡介本課程是計算機科學與技術專業必修課。課程教學目的是立足于介紹本方向的基本概念、技術和方法,為使學生能追蹤網絡技術最新發展而奠定基礎。通過網絡實驗,規定學生掌握網絡技術的發展規律,掌握網絡技術的基本概念、基本原理和基本技術等知識,可以編寫網絡軟件、設計一般的網絡并能分析網絡的性能及解決網絡中的問題。本實驗課分為驗證性實驗和綜合性實驗。三、實驗的地位、作用和目的及學生能力標準計算機網絡技術實驗是計算機專業的必修課程《計算機網絡技術》的重要組成部分。通過實驗,可以填補課堂理論教學中的局限性,增強學生對所學知識的感性結識;掌握網絡操作的一般知識;深化理論知識,使理論與實踐結合起來;培養學生設計實驗方案的能力和運用所學知識解決實際問題的能力。規定學生掌握網絡技術的發展規律,掌握網絡技術的基本概念、基本原理和基本技術等知識,可以編寫網絡軟件、設計一般的網絡并能分析網絡的性能及解決網絡中的問題。四、實驗方式與基本規定1、實驗開始前,指導教師要講解實驗過程和注意事項。2、實驗分為學生獨立完畢實驗以及小組完畢實驗兩種。3、實驗過程中要具體記錄實驗過程和結果。4、在實驗結束后一周之內完畢實驗報告。小組實驗的,要注明每個人的分工。實驗報告按照統一規定填寫。五、考核方式與實驗報告規定實驗考核從兩方面評估每次的實驗成績:實驗操作完畢情況和實驗報告書寫質量。實驗操作情況:指導教師根據學生的實驗準備情況、實驗情況、源程序質量、回答問題情況、實驗紀律等方面給分。實驗報告書寫:學生在實驗后的一周內提交打印好的實驗報告。教師根據實驗報告質量評估成績。3實驗總成績=1/3(∑第i次實驗成績)i=1六、實驗項目實驗一:驗證常用網絡命令[實驗目的]:熟悉windows下的一些網絡命令的功能和使用方法。進而能用這些命令察看網絡的狀況并解決網絡中的一些問題。掌握收發郵件的命令。[實驗規定]:1、請嘗試以下一些windows下的網絡命令,記錄實驗的過程、結果以及碰到的問題及解決方法。2、telnet收發電子郵件。[實驗過程]:實驗1.1驗證常用的網絡命令實驗內容⑴ARP:顯示和修改IP地址與物理地址之間的轉換表ARP-sinet_addreth_addr[if_addr]ARP-dinet_addr[if_addr]ARP-a[inet_addr][-Nif_addr]-a顯示當前的ARP信息,可以指定網絡地址-g跟-a同樣.-d刪除由inet_addr指定的主機.可以使用*來刪除所有主機.-s添加主機,并將網絡地址跟物理地址相相應,這一項是永久生效的。eth_addr物理地址.if_addrIfpresent,thisspecifiestheInternetaddressoftheinterfacewhoseaddresstranslationtableshouldbemodified.Ifnotpresent,thefirstapplicableinterfacewillbeused.例子:C:\>arp–a(顯示當前所有的表項)Interface:1onInterface0x1000003InternetAddressPhysicalAddressType00-01-f4-0c-8e-3bdynamic//物理地址一般為48位即6個字節1252-54-ab-21-6a-0edynamic5352-54-ab-1b-6b-0adynamicC:\>arp-a1(只顯示其中一項)NoARPEntriesFoundC:\>arp-a(只顯示其中一項)Interface:1onInterface0x1000003InternetAddressPhysicalAddressType00-01-f4-0c-8e-3bdynamicC:\>arp-s1200-aa-00-62-c6-09添加,可以再打入arp–a驗證是否已經加入.⑵ftp文獻傳輸命令該命令只有在安裝了TCP/IP協議之后才可用。Ftp是一種服務,一旦啟動,將創建在其中可以使用ftp命令的子環境,通過鍵入quit子命令可以從子環境返回到Windows2023命令提醒符。當ftp子環境運營時,它由ftp命令提醒符代表。ftp[-v][-n][-i][-d][-g][-s:filename][-a][-w:windowsize][computer]參數-v嚴禁顯示遠程服務器響應。-n嚴禁自動登錄到初始連接。-I多個文獻傳送時關閉交互提醒。-d啟用調試、顯示在客戶端和服務器之間傳遞的所有ftp命令。-g禁用文獻名組,它允許在本地文獻和途徑名中使用通配符字符(*和?)。(請參閱聯機“命令參考”中的glob命令。)-s:filename指定包含ftp命令的文本文獻;當ftp啟動后,這些命令將自動運營。該參數中不允許有空格。使用該開關而不是重定向(>)。-a在捆綁數據連接時使用任何本地接口。-w:windowsize替代默認大小為4096的傳送緩沖區。Computer指定要連接到遠程計算機的計算機名或IP地址。假如指定,計算機必須是行的最后一個參數。下面是一些常用命令:!:從ftp子系統退出到系統外殼?:顯示ftp說明,跟help同樣append:添加文獻,格式為:append本地文獻遠程文獻cd:更換遠程目錄lcd:更換本地目錄,若無參數,將顯示當前目錄open:與指定的ftp服務器連接opencomputer[port]close:結束與遠程服務器的FTP會話并返回命令解釋程序bye:結束與遠程計算機的FTP會話并退出ftpdir:結束與遠程計算機的FTP會話并退出ftpget和recv:使用當前文獻轉換類型將遠程文獻復制到本地計算機getremote-file[local-file]send和put:上傳文獻:sendlocal-file[remote-file]其它命令請參考幫助文獻。例子:C:\>ftpftp>openConnectedto.220ProFTPD1.2.0pre9Server(浙江大學自由軟件服務器)[]User(:(none)):anonymous331Anonymousloginok,sendyourcompletee-mailaddressaspassword.Password:230Anonymousaccessgranted,restrictionsapply.ftp>dir//查看本目錄下的內容:…ftp>cdpub//切換目錄250CWDcommandsuccessful.ftp>dir200PORTcommandsuccessful.150OpeningASCIImodedataconnectionforfilelist.…ftp>cdmicrosoft250CWDcommandsuccessful.ftp>dir200PORTcommandsuccessful.150OpeningASCIImodedataconnectionforfilelist.-rw-r--r--1ftpftp288632Dec81999chargeni.exe226Transfercomplete.ftp:69bytesreceivedin0.01Seconds6.90Kbytes/sec.ftp>lcde:\//本地目錄切換LocaldirectorynowE:\.ftp>getchargeni.exe//下載文獻200PORTcommandsuccessful.150OpeningASCIImodedataconnectionforchargeni.exe(288632bytes).226Transfercomplete.ftp:289739bytesreceivedin0.36Seconds802.60Kbytes/sec.ftp>bye//離開221Goodbye.⑶Ipconfig該診斷命令顯示所有當前的TCP/IP網絡配置值。該命令在運營DHCP系統上的特殊用途,允許用戶決定DHCP配置的TCP/IP配置值。ipconfig[/?|/all|/release[adapter]|/renew[adapter]|/flushdns|/registerdns|/showclassidadapter|/setclassidadapter[classidtoset]]/all產生完整顯示。在沒有該開關的情況下ipconfig只顯示IP地址、子網掩碼和每個網卡的默認網關值。例如:C:\>ipconfigWindows2023IPConfigurationEthernetadapter本地連接:Connection-specificDNSSuffix.:IPAddress............:1//IP地址SubnetMask...........://子網掩碼DefaultGateway.........://缺省網關C:\>ipconfig/displaydns//顯示本機上的DNS域名解析列表C:\>ipconfig/flushdns//刪除本機上的DNS域名解析列表⑷Nbtstat該診斷命令使用NBT(TCP/IP上的NetBIOS)顯示協議記錄和當前TCP/IP連接。該命令只有在安裝了TCP/IP協議之后才可用。nbtstat[-aremotename][-AIPaddress][-c][-n][-R][-r][-S][-s][interval]參數-aremotename使用遠程計算機的名稱列出其名稱表。-AIPaddress使用遠程計算機的IP地址并列出名稱表。-c給定每個名稱的IP地址并列出NetBIOS名稱緩存的內容。-n列出本地NetBIOS名稱。“已注冊”表白該名稱已被廣播(Bnode)或者WINS(其他節點類型)注冊。-R清除NetBIOS名稱緩存中的所有名稱后,重新裝入Lmhosts文獻。-r列出Windows網絡名稱解析的名稱解析記錄。在配置使用WINS的Windows2023計算機上,此選項返回要通過廣播或WINS來解析和注冊的名稱數。-S顯示客戶端和服務器會話,只通過IP地址列出遠程計算機。-s顯示客戶端和服務器會話。嘗試將遠程計算機IP地址轉換成使用主機文獻的名稱。interval重新顯示選中的記錄,在每個顯示之間暫停interval秒。按CTRL+C停止重新顯示記錄信息。假如省略該參數,nbtstat打印一次當前的配置信息。例子:C:\>nbtstat–A周邊主機的ip地址C:\>nbtstat–cC:\>nbtstat–nC:\>nbtstat-S本地連接:NodeIpAddress:[1]ScopeId:[]NetBIOSConnectionTableLocalNameStateIn/OutRemoteHostInputOutputJJY<03>Listening此外可以加上間隔時間,以秒為單位⑸net:許多Windows2023網絡命令都以詞net開頭。這些net命令有一些公用屬性:鍵入net/?可以看到所有可用的net命令的列表。鍵入nethelpcommand,可以在命令行獲得net命令的語法幫助。例如,關于netaccounts命令的幫助信息,請鍵入nethelpaccounts。所有net命令都接受/yes和/no選項(可以縮寫為/y和/n)。/y選項向命令產生的任何交互式提醒自動回答“是”,而/n回答“否”。例如,netstopserver通常提醒您確認要停止基于“服務器”服務的所有服務;而netstopserver/y對該提醒自動回答“是”,然后“服務器”服務關閉。例如:Netsend:(也許許多人已經用過,或者感到厭煩,索性把服務給關了)將消息發送到網絡上的其他用戶、計算機或消息名。必須運營信使服務以接受郵件。netsend{name|*|/domain[:name]|/usersmessage}Netstop:停止Windows2023網絡服務。netstopservice例如:C:\>netstopmessengerMessenger服務正在停止.Messenger服務已成功停止。此時再打入netsend本機名消息,就沒用了;相應的,要打開這個服務,只需把stop改為start,就可以了。NetstartFTPPublishingService啟動FTP發布服務。該命令只有在安裝了Internet信息服務后才可用。netstart"ftppublishingservice"類似的命令有很多,請參考幫助文獻。⑹Netstat顯示協議記錄和當前的TCP/IP網絡連接。該命令只有在安裝了TCP/IP協議后才可以使用。netstat[-a][-e][-n][-s][-pprotocol][-r][interval]參數-a顯示所有連接和偵聽端口。服務器連接通常不顯示。-e顯示以太網記錄。該參數可以與-s選項結合使用。-n以數字格式顯示地址和端標語(而不是嘗試查找名稱)。-s顯示每個協議的記錄。默認情況下,顯示TCP、UDP、ICMP和IP的記錄。-p選項可以用來指定默認的子集。-pprotocol顯示由protocol指定的協議的連接;protocol可以是tcp或udp。假如與-s選項一同使用顯示每個協議的記錄,protocol可以是tcp、udp、icmp或ip。-r顯示路由表的內容。Interval重新顯示所選的記錄,在每次顯示之間暫停interval秒。按CTRL+B停止重新顯示記錄。假如省略該參數,netstat將打印一次當前的配置信息。例如:C:\>netstat-asIPStatisticsPacketsReceived=256325…ICMPStatisticsReceivedSentMessages1668…TCPStatistics…SegmentsReceived=41828UDPStatisticsDatagramsReceived=82401…⑺Ping驗證與遠程計算機的連接。該命令只有在安裝了TCP/IP協議后才可以使用。ping[-t][-a][-ncount][-llength][-f][-ittl][-vtos][-rcount][-scount][[-jcomputer-list]|[-kcomputer-list]][-wtimeout]destination-list參數-tPing指定的計算機直到中斷。-a將地址解析為計算機名。-ncount發送count指定的ECHO數據包數。默認值為4。-llength發送包含由length指定的數據量的ECHO數據包。默認為32字節;最大值是65,527。-f在數據包中發送“不要分段”標志。數據包就不會被路由上的網關分段。-ittl將“生存時間”字段設立為ttl指定的值。-vtos將“服務類型”字段設立為tos指定的值。-rcount在“記錄路由”字段中記錄傳出和返回數據包的路由。count可以指定最少1臺,最多9臺計算機。-scount指定count指定的躍點數的時間戳。-jcomputer-list運用computer-list指定的計算機列表路由數據包。連續計算機可以被中間網關分隔(路由稀疏源)IP允許的最大數量為9。-kcomputer-list運用computer-list指定的計算機列表路由數據包。連續計算機不能被中間網關分隔(路由嚴格源)IP允許的最大數量為9。-wtimeout指定超時間隔,單位為毫秒。destination-list指定要ping的遠程計算機。較一般的用法是ping–t.例如:C:\>ping.Pinging[1]with32bytesofdata:Replyfrom1:bytes=32time=10msTTL=253Replyfrom1:bytes=32time<10msTTL=253Replyfrom1:bytes=32time<10msTTL=253Replyfrom1:bytes=32time<10msTTL=253Pingstatisticsfor1:Packets:Sent=4,Received=4,Lost=0(0%loss),Approximateroundtriptimesinmilli-seconds:Minimum=0ms,Maximum=10ms,Average=2ms⑻Route控制網絡路由表。該命令只有在安裝了TCP/IP協議后才可以使用。route[-f][-p][command[destination][masksubnetmask][gateway][metriccostmetric]]參數-f清除所有網關入口的路由表。假如該參數與某個命令組合使用,路由表將在運營命令前清除。-p該參數與add命令一起使用時,將使路由在系統引導程序之間持久存在。默認情況下,系統重新啟動時不保存路由。與print命令一起使用時,顯示已注冊的持久路由列表。忽略其他所有總是影響相應持久路由的命令。Command指定下列的一個命令。命令目的print打印路由add添加路由delete刪除路由change更改現存路由destination指定發送command的計算機。masksubnetmask指定與該路由條目關聯的子網掩碼。假如沒有指定,將使用55。gateway指定網關。metriccostmetric指派整數躍點數(從1到9999)在計算最快速、最可靠和(或)最便宜的路由時使用。例如:本機ip為1,缺省網關是,假設此網段上另有一網關54,現在想添加一項路由,使得當訪問子網絡時通過這一個網關,那么可以加入如下命令:C:\>routeaddmaskC:\>routeprint(鍵入此命令查看路由表,看是否已經添加了)C:\>routedeleteC:\>routeprint(此時可以看見已經沒了添加的項)⑼Telnet虛擬終端命令在命令行鍵入telnet,將進入telnet模式。鍵入help,可以看到一些常用命令。MicrosoftTelnet>help指令也許縮寫了。支持的指令為:close關閉當前連接display顯示操作參數open連接到一個站點quit退出telnetset設立選項(要列表,請鍵入'set?')status打印狀態信息unset解除設立選項(要列表,請鍵入'unset?')?/help打印幫助信息可以鍵入display命令來查看當前配置:C:\telnetMicrosoftTelnet>displayEscape字符為'CTRL+]'WILLAUTH(NTLM身份驗證)關閉LOCAL_ECHO發送CR和LFWILLTERMTYPE優選的類型為ANSI協商的規則類型為ANSI可以使用set命令來設立環境變量,如:MicrosoftTelnet>setlocal_echoonNTLM打開NTLM身份驗證。LOCAL_ECHO打開LOCAL_ECHO。TERMx(x表達ANSI,VT100,VT52或VTNT)CODESETx(x表達ShiftJIS,JapaneseEUC,JISKanji,JISKanji(78),DECKanji或NECKanji)CRLF發送CR和LF例如:假設主機1打開了telnet服務MicrosoftTelnet>open1正在連接到1...您將要發送密碼信息到Internet區域中的遠程計算機。這也許不安全。是否還要發送(y/n):y(不同系統會有區別)上面曾說明了Escape字符為'CTRL+]',所以鍵入這個字符就可以切換到外面,再按下單獨的Enter鍵又可以回去。MicrosoftTelnet>status已連接到1協商的規則類型為ANSI⑽Tracert該診斷實用程序將包含不同生存時間(TTL)值的Internet控制消息協議(ICMP)回顯數據包發送到目的,以決定到達目的采用的路由。要在轉發數據包上的TTL之前至少遞減1,必需途徑上的每個路由器,所以TTL是有效的躍點計數。數據包上的TTL到達0時,路由器應當將“ICMP已超時”的消息發送回源系統。Tracert先發送TTL為1的回顯數據包,并在隨后的每次發送過程將TTL遞增1,直到目的響應或TTL達成最大值,從而擬定路由。路由通過檢查中級路由器發送回的“ICMP已超時”的消息來擬定路由。但是,有些路由器悄悄地下傳包含過期TTL值的數據包,而tracert看不到。tracert[-d][-hmaximum_hops][-jcomputer-list][-wtimeout]target_name參數/d指定不將地址解析為計算機名。-hmaximum_hops指定搜索目的的最大躍點數。-jcomputer-list指定沿computer-list的稀疏源路由。-wtimeout每次應答等待timeout指定的微秒數。target_name目的計算機的名稱。最簡樸的一種用法如下:C:\>tracert.Tracingrouteto[1]overamaximumof30hops:1<10ms<10ms<10ms2<10ms<10ms<10ms03<10ms<10ms<10ms1Tracecomplete.實驗1.2用telnet方式收發郵件{舉例}:telnet25 //連接smtp服務器.端口是25
22021SMTPServerofAIMC;Mon,25Jun2023
12:41:51+0800//服務器返回的信息
HELO
25021,unknown.host<24>okay.
MAILFROM://告訴服務器發件人的Email地址
250<>,senderok.
RCPTTO://告訴服務器收件人的地址.
250Usernotlocal,willforwardto<>.//OK!下面開始寫信了~~
DATA//告訴服務器我們要開始寫信了SUBJECT:HELLO//subject后面填寫的是郵件的主題.假如不需要主題可以直接輸入內容.
Hi:
Howareyou?
.//換行后輸入.(dot)后按回車,表達信件內容書寫完畢.
250Requestedmailactionokay,completed.
QUIT//發送信件,結束對話,退出SMTP服務器.假如想取消發送可以用RSET命令.
22121closingconnection.下面用POP服務器收剛才發送的Email.
telnet110//還是要先連接.端口110
+OKincoresystemmailPOP3Serverready
userstonegong//告訴服務器你的用戶名
+OKcoremail
pass*********//這里的****代表你的密碼.你輸入的時候會明文顯示.+OK1message(s)[457byte(s)]//看到信了嗎?
list//查看信件列表.
+OK1457
1457
.//第一個475是所有郵件的總字節數,1后面的那個是第一封郵件的字節數.由于只有一封,所以相等了.
retr1//返回第一封信的所有內容.
+OK457octets
Received:from21(unknown[48])
by(Postfix)withSMTPidE578D1CED4CAC
for<>;Mon,25Jun202312:49:17+0800
(CST)
Received:fromunknown.host([24])by21(AIMC
)
withSMTPidjma3b36f1fc;Mon,25Jun202312:43:27+0800
subject:HELLO
hi:
Howareyou?
Message-Id:<>
Date:Mon,25Jun202312:49:17+0800(CST)
From:
.//剛才發的那封~
dele1//刪除郵件.
+OKcoremail
list
+OK00
.//這時郵件并沒有完全刪除,要等到退出后在完全刪除//假如現在想恢復可以用RESTn命令,n表達Email的編號.
Quit//退出.
+OKcoremail
假如上面有哪些命令你沒有理解也可以看看下面這份命令詳解.先看SMTP服務器的.
HELO:<地址>
運用HELO命令可以告訴SMTP服務器你的地址,<地址>一般為你的E-mail地址@后面的部分。若你的電
子郵件地址為:
,則<地址>就為21(我就什么也沒輸入.也可以的)
MAILFROM:<發件人Email地址>
運用MAILFROM命令輸入收信者回復你時可用的電子郵件地址,一般為你的電子信箱地址,但也可以是符合郵件地址格式的任意字符。
RCPTTO:<收信人的E-mail地址>
RCPTTO命令規定你輸入收信人的電子郵件地址,可以用多個RCPT
TO命令將郵件同時發送給多個收信
人。
VRFY:<某個Email地址>
VRFY命令將驗證其后的電子郵件地址的對的性。一般可先運用VRFY命令對電子郵件地址進行校驗,再運用RCPTTO命令將郵件發送到該地址。DATA
鍵入DATA后回車,即可開始輸入郵件內容。假如在首行輸入Subject:<主題內容><回車>,則收信者可在主題或Subject欄將看到<主題內容>。否則,輸入部分將作為郵件主體(Body)部分的內容。結束信件內容輸入,可順序按<回車><.(句號)><回車>.
RSET
RSET命令將中止發信操作,刪除輸入內容。
QUIT
QUIT發送信件,結束對話,退出SMTP服務器。
再說說POP的.
USER<用戶名>
用USER命令輸入用戶信箱名,<用戶名>一般為用戶電子郵件地址@前面的部分,如地址為,則<用戶名>為Someone,命令執行后將顯示一些信息,并提醒用戶輸入密碼。
PASS<密碼>
用PASS命令輸入用戶信箱密碼。
STAT
輸入STAT命令,服務器將告訴用戶共有多少封信件在信箱中。
LIST
顯示信件個數、序號和每個信件的大小。
TOPnm
顯示第n個信件前m行的內容。
RETRn
RETR命令可以顯示第n個信件的所有內容。
DELEn
DELE命令用來刪除指定的第n個信件。
RESTn
REST命令可以恢復被刪除的n個信件。
LAST
LAST命令可以顯示下一個信件的編號。
NOOP
NOOP命令不執行任何操作,僅用來測試服務器的響應是否正常。
QUIT
QUIT退出POP3服務器,結束信件查閱過程。[規定]:用telnet方式登陸自己的郵箱,進行收發郵件的實驗,掌握收發郵件的命令及過程。仿照上述{舉例}中的過程,將自己的實驗過程記錄下來,寫在下面。
實驗二:基于TCP/UDP的Socket編程[實驗目的]:熟悉和掌握socket編程的基本理論和方法。掌握基于TCP和UDP的工作原理以及Socket編程的一般方法,可以編寫簡樸的網絡應用程序。[實驗規定]:請在以下題目中選擇一個,按照規定完畢實驗,并完畢實驗報告。實驗可以分組進行,每2人一組,在報告中注明每個成員的分工。編程可以使用任何高級語言,建議使用java或C++。實驗2.1:基于TCPandUDP的socket編程實驗內容:運用Java或C++語言,分別基于TCP和UDP編寫一個簡樸的Client/Server網絡應用程序。規定實現客戶向服務器傳輸任意一個字符串,服務器將收到的字符串變換成大寫后傳回客戶。修改上述程序,實現服務器根據客戶請求,將服務器端指定的文獻可靠地傳輸給客戶。假如服務器沒有指定的文獻,服務器將給客戶返回一個信息,告知客戶其請求文獻不存在。有條件的同學可以進一步改善b)的程序,使之更實用。比如可以請求服務器先傳輸目錄,然后客戶根據目錄請求傳輸文獻等。實驗方式:每位同學上機編程實驗,實驗指導教師現場指導。程序可參考附錄的程序1、程序2、程序3和程序4(程序中有錯誤需完善)實驗報告:在實驗報告中要說明Socket編程的客戶端和服務器端重要環節、運用Java語言用到的重要類及其重要作用、TCP和UDP編程的重要差異和特點、你所實現的文獻傳輸的程序代碼、實驗過程和實驗結果。實驗2.2:基于TCP的WebServer實驗內容:運用Java語言,基于TCP編寫一個簡樸的WebServer,規定可以實現單用戶簡樸頁面瀏覽。修改上述WebServer,實現多用戶同時連接(多線程)請求。實驗方式:每位同學上機編程實驗,實驗指導教師現場指導。程序可參考附錄的程序5(程序中有錯誤需完善)實驗報告:在實驗報告中要說明實現WebServer的重要環節、關鍵類和作用、實現非連續方式(HTTP1.0)和連續方式(HTTP1.1)在代碼上的重要差異和特點、你所實現的最終WebServer程序代碼、實驗過程和實驗結果。實驗2.3:基于TCP/UDP的Daytime的客戶端和服務器端實驗報告規定同實驗一。參考程序請自己在網絡中查找。實驗2.4:基于TCP/UDP的Echo的客戶端和服務器端實驗報告規定同實驗一。參考程序請自己在網絡中查找。實驗2.5SOCKET編程實現聊天程序1.實驗目的掌握網絡應用程序的開發方法;掌握Client/Server結構軟件的設計與開發方法掌握Socket機制的工作原理2.。實驗前的準備閱讀教材關于TCP/IP協議和Socket的相關內容;閱讀WinSock編程指南;閱讀本實驗所附內容;熟悉VC++6.0開發工具3.實驗內容使用Win32Socket函數實現聊天程序:能互相對發文本消息。4.實驗規定按實驗內容進行軟件編制和調試進行功能測試,記錄測試環節給出程序重要部分流程圖實驗2.6SOCKET編程實現miniFTPClient/Server程序1.實驗目的掌握網絡應用程序的開發方法;掌握Client/Server結構軟件的設計與開發方法掌握Socket機制的工作原理2.。實驗前的準備閱讀教材關于TCP/IP協議和Socket的相關內容;閱讀WinSock編程指南;閱讀本實驗所附內容;熟悉VC++6.0開發工具3.實驗內容使用Win32Socket函數實現miniFTPclient/Server:在客戶端實現GETfile,PUTfile,CD(changeDirectory),PWD(displaycurrentdirectoryinserver)功能。4.實驗規定按實驗內容進行軟件編制和調試進行功能測試,記錄測試環節給出程序重要部分流程圖附錄1參考程序1、TCPClient.javaimportjava.io.*:import.*:classTCPClient{publicstaticvoidmain(Stringargv[])throwsException{Stringsentence;StringmodifiedSentence;BufferedReaderinfromUser=newBufferedReader(newInputStreamReader(System.in));SocketclientSocket=newSocket(“hostname”,6789);DataOutputStreamoutToServer=NewDataOutputStream(clientSocket.getOutputStream());BufferedReaderinfromServer=newBufferedReader(newInputStreamReader(clientSocket.getInputStream()));sentence=inFromUser.readLine();outToServer.writeBytes(sentence+‘\n’);modifiedSentence=inFromServer.readLine();System.out.println(“FROMSERVER:”+modifiedSentence);clientSocket.close();}}2、TCPServer.javaimportjava.io.*:import.*:classTCPServer{publicstaticvoidmain(Stringargv[])throwsException{StringClientSentence;StringcapitalizedSentence;ServerSocketwelcomeSocket=newServerSocket(6789);While(true){SocketconnectionSocket=welcomeSocket.accept();BufferedReaderinfromClient=newBufferedReader(newInputStreamReader(connectionSocket.getInputStream()));DataOutputStreamoutToClient=newDataOutputStream(connectionSocket.getOutputStream());ClientSentence=infromClient.readLine();capitalizedSentence=clientSentence.toUpperCase()+‘\n’;outToClient.writeBytes(capitalizedSentence);}}}3、UDPClientimportjava.io.*;import.*;classUDPClient{publicstaticvoidmain(Stringargs[])throwsException{BufferedReaderinFromUser=newBufferedReader(newInputStreamReader(System.in));DatagramSocketclientSocket=newDatagramSocket();InetAddressIPAddress=InetAddress.getByName("tangnat");byte[]sendData=newbyte[1024];byte[]receiveData=newbyte[1024];Stringsentence=inFromUser.readLine();sendData=sentence.getBytes();DatagramPacketsendPacket=newDatagramPacket(sendData,sendData.length,IPAddress,9876);clientSocket.send(sendPacket);DatagramPacketreceivePacket=newDatagramPacket(receiveData,receiveData.length);clientSocket.receive(receivePacket);StringmodifiedSentence=newString(receivePacket.getData());System.out.println("FROMSERVER:"+modifiedSentence);clientSocket.close();}}4、UDPServerimportjava.io.*;import.*;classUDPServer{publicstaticvoidmain(Stringargs[])throwsException{DatagramSocketserverSocket=newDatagramSocket(9876);byte[]receiveData=newbyte[1024];byte[]sendData=newbyte[1024];while(true){DatagramPacketreceivePacket=newDatagramPacket(receiveData,receiveData.length);serverSocket.receive(receivePacket);Stringsentence=newString(receivePacket.getData());InetAddressIPAddress=receivePacket.getAddress();intport=receivePacket.getPort();StringcapitalizedSentence=sentence.toUpperCase();sendData=capitalizedSentence.getBytes();DatagramPacketsendPacket=newDatagramPacket(sendData,sendData.length,IPAddress,port);serverSocket.send(sendPacket);}}}5、WebServer.javaimportjava.io.*;import.*;importjava.util.*;classWebServer{publicstaticvoidmain(Stringargv[])throwsException{StringrequestMessageLine;Stringfilename;ServerSocketListenSocket=newServerSocket(6789);SocketconnectionSocket=ListenSocket.accept();BufferedReaderinfromClient=newBufferedReader(newInputStreamReader(connectionSocket.getInputStream()));DataOutputStreamoutToClient=newDataOutputStream(connectionSocket.getOutputStream());requestMessageLine=infromClient.readLine();StringTokenizertokenizedLine=newStringTokenizer(requestMessageLine);if(tokenizedLine.nextToken().equals(“GET”)){fileName=tokenizedLine.nextToken();if(filename.startsWith(“/”)==true)filename=filename.substring(1);Filefile=newFile(fileName);intnumOfBytes=(int)file.length();FileInputStreaminFile=newFileInputStream(fileName);Byte[]fileInBytes=newbyte[numOfBytes];inFile.read(fileInBytes);“HTTP/1.0200DocumentFollows\r\n”);if(filename.endsWith(“.jpg”))outToClient.writeBytes(“Content-Type:image/jpeg\r\n”);if(filename.endsWith(“.gif”))outToClient.writeBytes(“Content-Type:image/gif\r\n”);outToClient.writeBytes(“Content-Length:”+numOfBytes+“\r\n”);outToClient.writeBytes(“\r\n”);outToClient.write(fileInBytes,0,numOfBytes);connectionSocket.close();}elseSystem.out.println(“BadRequestMessage”);}}附錄2網絡編程接口WinSockAPI使用WinSockAPI的編程,應當了解TCP/IP的基礎知識。雖然你可以直接使用WinSockAPI來寫網絡應用程序,但是,要寫出優秀的網絡應用程序,還是必須對TCP/IP協議有一些了解的。1.TCP/IP協議與WinSock網絡編程接口的關系WinSock并不是一種網絡協議,它只是一個網絡編程接口,也就是說,它不是協議,但是它可以訪問很多種網絡協議,你可以把他當作一些協議的封裝。現在的WinSock已經基本上實現了與協議無關。你可以使用WinSock來調用多種協議的功能。那么,WinSock和TCP/IP協議到底是什么關系呢?事實上,WinSock就是TCP/IP協議的一種封裝,你可以通過調用WinSock的接口函數來調用TCP/IP的各種功能.例如我想用TCP/IP協議發送數據,你就可以使用WinSock的接口函數Send()來調用TCP/IP的發送數據功能,至于具體怎么發送數據,WinSock已經幫你封裝好了這種功能。2、TCP/IP協議介紹TCP/IP協議包含的范圍非常的廣,他是一種四層協議,包含了各種硬件、軟件需求的定義。TCP/IP協議確切的說法應當是TCP/UDP/IP協議。UDP協議(UserDatagramProtocol用戶數據報協議),是一種保護消息邊界的,不保障可靠數據的傳輸。TCP協議(TransmissionControlProtocol傳輸控制協議),是一種流傳輸的協議。他提供可靠的、有序的、雙向的、面向連接的傳輸。保護消息邊界,就是指傳輸協議把數據當作一條獨立的消息在網上傳輸,接受端只能接受獨立的消息。也就是說存在保護消息邊界,接受端一次只能接受發送端發出的一個數據包。
而面向流則是指無保護消息保護邊界的,假如發送端連續發送數據,接受端有也許在一次接受動作中,會接受兩個或者更多的數據包。舉例來說,假如,我們連續發送三個數據包,大小分別是2k、4k、8k,這三個數據包都已經到達了接受端的網絡堆棧中,假如使用UDP協議,不管我們使用多大的接受緩沖區去接受數據,我們必須有三次接受動作,才可以把所有的數據包接受完。而使用TCP協議,我們只要把接受的緩沖區大小設立在14k以上,我們就可以一次把所有的數據包接受下來,只需要有一次接受動作。這就是由于UDP協議的保護消息邊界使得每一個消息都是獨立的。而流傳輸,卻把數據當作一串數據流,它不認為數據是一個一個的消息。所以有很多人在使用TCP協議通訊的時候,并不清楚TCP是基于流的傳輸,當連續發送數據的時候,他們時常會結識TCP會丟包。其實不然,由于當他們使用的緩沖區足夠大時,他們有也許會一次接受到兩個甚至更多的數據包,而很多人往往會忽視這一點,只解析檢查了第一個數據包,而已經接受的其他據包卻被忽略了。3.WinSock編程簡樸流程WinSock編程分為服務器端和客戶端兩部分,TCP服務器端的大體流程如下:對于任何基于WinSock的編程一方面必須要初始化WinSockDLL庫。intWSAStarup(WORDwVersionRequested,LPWSADATAlpWsAData)。wVersionRequested是我們規定使用的WinSock的版本。調用這個接口函數可以初始化WinSock。然后必須創建一個套接字(Socket)。SOCKETSocket(intaf,inttype,intprotocol);套接字可以說是WinSock通訊的核心。WinSock通訊的所有數據傳輸,都是通過套接字來完畢的,套接字包含了兩個信息,一個是IP地址,一個是Port端標語,使用這兩個信息,就可以擬定網絡中的任何一個通訊節點。當調用了Socket()接口函數創建了一個套接字后,必須把套接字與你需要進行通訊的地址建立聯系,可以通過綁定函數來實現這種聯系。intbind(SOCKETs,conststructsockaddrFAR*name,intnamelen);structsockaddr_in{shortsin_family; u_shortsin_prot; structin_addrsin_addr; charsin_sero[8]; }就包含了需要建立連接的本地的地址,涉及地址族、IP和端口信息。sin_family字段必須把它設為AF_INET,這是告訴WinSock使用的是IP地址族。sin_prot就是要用來通訊的端標語。sin_addr就是要用來通訊的IP地址信息。在這里,必須還得提一下有關'大頭(big-endian)'小頭(little-endian)'。由于各種不同的計算機解決數據時的方法是不同樣的,IntelX86解決器上是用'小頭'形式來表達多字節的編號,就是把低字節放在前面,把高字節放在后面,而互聯網標準卻正好相反,所以,必須把主機字節轉換成網絡字節的順序。WinSockAPI提供了幾個函數。把主機字節轉化成網絡字節的函數;u_longhtonl(u_longhostlong);u_shorthtons(u_shorthostshort);把網絡字節轉化成主機字節的函數;u_longntohl(u_longnetlong);u_shortntohs(u_shortnetshort);這樣,設立IP地址和port端口時,就必須把主機字節轉化成網絡字節后,才干用Bind()函數來綁定套接字和地址。當綁定完畢之后,服務器端必須建立一個監聽的隊列來接受客戶端的連接請求。intlisten(SOCKETs,intbacklog);這個函數可以把套接字轉成監聽模式。假如客戶端有了連接請求,我們還必須使用intaccept(SOCKETs,structsockaddrFAR*addr,intFAR*addrlen);來接受客戶端的請求。現在基本上已經完畢了一個服務器的建立,而客戶端的建立的流程則是初始化WinSock,然后創建Socket套接字,再使用intconnect(SOCKETs,conststructsockaddrFAR*name,intnamelen);來連接服務端。下面是一個最簡樸的創建服務器端和客戶端的例子:服務器端的創建:WSADATAwsd;SOCKETsListen;SOCKETsclient;UINTport=800;intiAddrSize;structsockaddr_inlocal,client;WSAStartup(0x11,&wsd);sListen=Socket(AF_INET,SOCK_STREAM,IPPOTO_IP);local.sin_family=AF_INET;local.sin_addr=htonl(INADDR_ANY);local.sin_port=htons(port);bind(sListen,(structsockaddr*)&local,sizeof(local));listen(sListen,5);sClient=accept(sListen,(structsockaddr*)&client,&iAddrSize);客戶端的創建:WSADATAwsd;SOCKETsClient;UINTport=800;charszIp[]="";intiAddrSize;structsockaddr_inserver;WSAStartup(0x11,&wsd);sClient=Socket(AF_INET,SOCK_STREAM,IPPOTO_IP);server.sin_family=AF_INET;server.sin_addr=inet_addr(szIp);server.sin_port=htons(port);connect(sClient,(structsockaddr*)&server,sizeof(server));當服務器端和客戶端建立連接以后,無論是客戶端,還是服務器端都可以使用intsend(SOCKETs,constcharFAR*buf,intlen,intflags);intrecv(SOCKETs,charFAR*buf,intlen,intflags);函數來接受和發送數據,由于,TCP連接是雙向的。當要關閉通訊連結的時候,任何一方都可以調用intshutdown(SOCKETs,inthow);來關閉套接字的指定功能,再調用intcloseSocket(SOCKETs);來關閉套接字句柄,這樣一個通訊過程就算完畢了。注意:上面的代碼沒有任何檢查函數返回值,假如你作網絡編程就一定要檢查任何一個WinSockAPI函數的調用結果,由于很多時候函數調用并不一定成功。上面介紹的函數,返回值類型是int的話,假如函數調用失敗的話,返回的都是SOCKET_ERROR。4.WinSock編程的模型上面介紹的僅僅是最簡樸的WinSock通訊的方法,而實際中很多網絡通訊的卻很多難以解決的意外情況。例如,WinSock提供了兩種套接字模式:鎖定和非鎖定。當使用鎖定套接字的時候,使用的很多函數,例如accpet、send、recv等等,假如沒有數據需要解決,這些函數都不會返回,也就是說,你的應用程序會阻塞在那些函數的調用處。而假如使用非阻塞模式,調用這些函數,不管你有沒有數據到達,他都會返回。所以有也許我們在非阻塞模式里,調用這些函數大部分的情況下會返回失敗,所以就需要我們來解決很多的意外犯錯。這顯然不是我們想要看到的情況。我們可以采用WinSock的通訊模型來避免這些情況的發生。WinSock提供了五種套接字I/O模型來解決這些問題。他們分別是select(選擇),WSAAsyncSelect(異步選擇),WSAEventSelect(事件選擇,overlapped(重疊),completionport(完畢端口)。這里具體介紹一下select,WSAASyncSelect兩種模型。Select模型是最常見的I/O模型。使用intselect(intnfds,fd_setFAR*readfds,fd_setFAR*writefds,fd_setFAR*exceptfds,conststructtimevalFAR*timeout);函數來檢查你要調用的Socket套接字是否已有了需要解決的數據。select包含三個Socket隊列,分別代表:readfds,檢查可讀性,writefds,檢查可寫性,exceptfds,例外數據。timeout是select函數的返回時間。例如,想要檢查一個套接字是否有數據需要接受,我們可以把套接字句柄加入可讀性檢查隊列中,然后調用select,假如,該套接字沒有數據需要接受,select函數會把該套接字從可讀性檢查隊列中刪除掉,所以我們只要檢查該套接字句柄是否還存在于可讀性隊列中,就可以知道到底有沒有數據需要接受了。WinSock提供了一些宏用來操作套接字隊列fd_set。FD_CLR(s,*set)從隊列set刪除句柄s。FD_ISSET(s,*set)檢查句柄s是否存在與隊列set中。FD_SET(s,*set)把句柄s添加到隊列set中。FD_ZERO(*set)把set隊列初始化成空隊列。WSAAsyncSelect(異步選擇)模型:WSAASyncSelect模型就是把一個窗口和套接字句柄建立起連接,套接字的網絡事件發生時時候,就會把某個消息發送到窗口,然后可以在窗口的消息響應函數中解決數據的接受和發送。intWSAAsyncSelect(SOCKETs,HWNDhWnd,unsignedintwMsg,longlEvent);這個函數可以把套接字句柄和窗口建立起連接,wMsg是我們必須自定義的一個消息。lEvent就是制定的網絡事件。涉及FD_READ,FD_WRITE,FD_ACCEPT,FD_CONNECT,FD_CLOSE。幾個事件。例如,需要接受FD_READ,FD_WRITE,FD_CLOSE的網絡事件。可以調用WSAAsyncSelect(s,hWnd,WM_SOCKET,FD_READ|FD_WRITE|FD_CLOSE);這樣,當有FD_READ,FD_WRITE或者FD_CLOSE網絡事件時,窗口hWnd將會收到WM_SOCKET消息,消息參數的lParam標志了是什么事件發生,MFC的C
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 變電所電氣施工合同范例
- 醫院供應室合同范例
- 代買合同范例
- 公司股轉讓合同范例5篇
- 公司股購買合同范例
- 買車防坑合同范例
- 南京婚慶酒店合同范例
- 南瓜養殖合同范例
- 上汽大眾汽車經銷合同范例
- 單位房產贈與子女合同范例
- 非線性彈性本構關系全量型增量型③彈塑性本構課件
- 涉嫌虛假訴訟立案監督申請書
- 通用高考英語答題卡模板word模板
- 外文文獻 A SP的網站新聞管理系統的設計與實現 中英文版
- 中國教育簡史全書ppt完整版課件最全電子教案正本書教學教程
- 中學生心理健康診斷測驗-MHT量表
- 年輕干部教育管理監督調研情況報告
- 三級安全管理標準化評定標準
- 血氣分析報告解讀PPT課件(PPT 33頁)
- 簡譜視唱15942
- 民宿設計要點--ppt課件
評論
0/150
提交評論