




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
互聯網技術及應用實踐
實驗報告報告名稱:路由器配置及應用路由追蹤的實1報告名稱:路由器配置及應用EMAIL的客戶端程序開發一個簡單的WEB服務器學生姓名:學號:指導教師:實驗一路由器配置及應用實驗原理/24/24172,16.3.0.^^1PCIRouterl:F0Roirtei2:S0=PC2]1SO=172.l6.2.lFO=17216.3.22實驗步驟/24/24172,16.3.0.^^1PCIRouterl:F0Roirtei2:S0=PC2]1SO=172.l6.2.lFO=17216.3.22第一步:在路由器Routerl上配置快速以太網口的IP地址Router1#configureterminalRouter1(config)#interfaceFastEthernet0/0!進入以太網0口配置狀態或Router1(config)#interfaceFastEthernet1/0Router1(config-if)#ipaddress!為以太網0口配置地址Router1(config-if)#noshutdown!打開以太網0口Router1(config-if)#end第二步:在路由器Router1上配置廣域網口的IP地址和時鐘頻率(假設Router1為DCE端)Router1#conRouter1(config)#interfaceserial2/0!進入廣域網0口配置狀態或Router1(config)#interfaceserial1/2Router1(config-if)#ipaddress!為廣域網0口配置地址Router1(config-if)#clockrate64000!DCE端需設置端口時鐘頻率Router1(config-if)#noshutdown!打開廣域網0口Router1(config-if)#end驗證測試:驗證路由器接口配置狀態。Router1#showipinterfacebrief!顯示IP端口狀態簡況InterfaceIP-AddressOK?MethodStatusProtocolFastEthernet0/0/24YESmanualupupFastEthernet0/1noaddressYESunsetadministrativelydowndownSerial2/0/24YESmanualupupSerial3/0noaddressYESunsetadministrativelydowndownNull0noaddressYESup第三步:為Router1添加靜態路由Router1#conRouter1(config)#iproute!添加靜態路由Router1(config)#endRouter1#showiproute!顯示路由表Codes:C-connected,S-static,R-RIPO-OSPF,IA-OSPFinterarea
E1-OSPFexternaltype1,E2-OSPFexternaltype2Gatewayoflastresortisnotset/24issubnetted,3subnetsCisdirectlyconnected,FastEthernet0Cisdirectlyconnected,Serial0S[1/0]viaRouter1#wr!保存所作的修改第四步:在路由器Router2(R2624)上配置快速以太網口的IP地址Router2#conRouter2(config)#interfacefastethernet0/0或Router2(config)#interfacefastethernet1/0Router2(config-if)#ipaddressRouter2(config-if)#noshutdownRouter2(config-if)#end第五步:在路由器Router2(R2624)上配置廣域網口的IP地址Router2#confRouter2(config)#interfaceserial2/0或Router2(config)#interfaceserial1/2Router2(config-if)#ipaddressRouter2(config-if)#noshutdownRouter2(config-if)#endRouter2#showipinterfacebriefInterfaceIP-AddressOK?MethodStatusProtocolFastEthernet0/0YESmanualupupFastEthernet0/1unassignedYESunsetadministrativelydowndownSerial2/0YESmanualupupSerial3/0unassignedYESunsetadministrativelydowndown圖下圖:JITelnc-t1&05HoutopAttconFEnter*confIffur-atIoncovnmands.oneperline-EndwltliCNTLZZ.<oonfi*r>#intcrfacc:serial1Z2KoutevHCconfig—iF255.^55=255aWxUnknowncorniiiand-nflulzei'ACcnnF±g—±£>ltipaddress172_1&255_255-255_OTOC\o"1-5"\h\zTtiULit(icunfig—if>#novjiiRoutCconfAttendBouterAttConfijrnredfiuomconso1cJsyconsoleEtiAtlDOWNDOUNDOUNDOUHUPffliulitc=i'Aitshui'j:Lpintei'facebrief1ntei'fEtiAtlDOWNDOUNDOUNDOUHUP1Z2172.16-2.2/24¥ESserial1^3noaddressVESF-astEthernet1ZW1=3a2Z24VESrastEtlieimeC1X1noaddressYESNr_i110noaddrezsaYESRout:E=i'il-itt圖1.1
第六步:測試兩臺路由器之間的連通性Router2#pingTypeescapesequencetoabort.Sending5,100-byteICMPEchoesto,timeoutis2seconds:Successrateis100percent(5/5),round-tripmin/avg/max=1/1/4ms如下圖:politepftttpingServing5,100-b^teIGHPEchoesto,timeoutis2seconds:<pressCtrL*Ctobrealt>SuccessrateIsIBE)percenttb/5>,pound-tpipmin/aug/nax=37/37/38msrcuitet'A#_圖1.2第七步:為Router2(R2624)添加靜態路由Router2#conConfiguringfromterminal,memory,ornetwork[terminal]?Enterconfigurationcommands,oneperline.EndwithCNTL/Z.Router2(config)#iprouteRouter2(config)#endRouter2#showiprouteCodes:C-connected,S-static,R-RIPO-OSPF,IA-OSPFinterarea[1/0]viaisdirectlyconnected,Serial0isdirectlyconnected,FastEthernet0E1-OSPFexternaltype1,E2-OSPFexternaltype2Gatewayoflastresortisnotset/24issubnetted,[1/0]viaisdirectlyconnected,Serial0isdirectlyconnected,FastEthernet0Telnet05Routerfl<confroutft2日5.2鼠.25S.0lRnutei'ACennfig'ttenidpoutzei'AttConficfuii'cdf]?onccneo1cbyconsolesliouiprout:cCodes=C-connected,S-static,R-RIP0-OSPF.IA-OSPFinterareaHl一OSFFNSSAexternaltype1,H2-OSPFNSSAexternaltype2El-OSPFexternaltjjpe1,E2-OSFFexternaltype2*-candidatedefaultGatewayoflastresortisnosetS172,16.1.0/24CS172,16.1.0/24C172,16.2.0/24C172,16.2.2/32C172,16.3.0/24C172-16.3.2/32[1/0]yiaisdirectlyconnected,.islocalliost.isdirectlyconnected.islocalhost,serial1/2FastEthernet1/0Rnutei'Attui*Euildiricfconfiyuu^at:ion.?[OKIRuuterfl圖1.3第八步:用ping命令對PCI,PC2進行連通性檢測如下圖:_5Telnet192.1S8.C172.1&=3_2/32i&localhost=Buildingconfiguratlon..-pK]KQuterfittpingSending5,100-byteICMPEchoesto,timeoutis2seconds:<pressCti'l+Ctobt'eak>ESuizcesspmJteiis1B0peFeentCE/Ei,rnund—tripninZaugrymasi:=3^X27Z37ms:RDutei^A#圖1.4注意事項:(1)如果兩臺路由器經過串口直接相連,則必須在時鐘一端設置時鐘頻率(DCE)。(2)PC機必須配置默認網關。
實驗二路由追蹤實驗目的:熟悉掌握路由器實現路由追蹤,熟悉ICMP協議實驗環境:MicrosoftVisualC++6.0實驗原理:路由追蹤是從源主機向目的主機發送一連串的IP數據報,數據包中封裝的是無法交付的UDP數據報。源主機先向目的主機發送一個回應請求報文(類型8),TTL設置為1,第一個路由器收到后將TTL設為1第一個路由器收到后將TTL減1,這樣TTL變為0,分組被廢除,同時路由器向源主機發送一個TTL超時報文(類型為11),報文的IP報頭中的源IP地址就是第一個路由器的地址,源主機可以通過對該報文進行分析,得到第一個路由器的地址,接著發送TTL等于2的報文得到第二個路由器的地址,再發送TTL等于3的報文,如此下去直到收到目的主機的回應應答報文(類型為0)或不可到達報文(類型為3),或者到了最大跳數(要檢測路由器個數的最大值)。這樣,源主機達到了自己的目的,因為這些路由器和最后的目的主機發送的ICMP報文正好給源主機想知道的路由信息一一到達目的主機所經過的路由器的IP地址,以及到達其中每一個路由器的往返時間。源代碼如下:#defineWIN32_LEAN_AND_MEAN#include<winsock2.h>要WinSock2的支持#include<ws2tcpip.h>別設置時用到#include<stdio.h>#include<stdlib.h>#defineICMP_ECHO8ICMP報文類型#defineICMP_ECHOREPLY0ICMP報文類型#defineICMP_TIMEOUT11#defineICMP_MIN8ICMPpacket(header)#defineMAXPACKET1024size#defineDEICMP_PACKSIZE44PACKETSIZEcharlpdest[16];址DWORDcStartTickCount;//使用原始套接字需〃進行IPPROTO_IP級〃發送Ping請求時的〃接收Ping//使用原始套接字需〃進行IPPROTO_IP級〃發送Ping請求時的〃接收Ping回復時的//ICMP超時報文類型//Minimum8-byte//MaxICMPpacket//DefautICMP//用來存放目的IP地//用來存放發送包的//ICMP頭部定義,被封裝在IP包中(BYTEi_type;〃報文類型BYTEi_code;〃代碼USHORTi_cksum;//校驗和USHORTi_id;//標識符USHORTi_seq;〃序號}IcmpHeader;//初始化ICMP頭部voidFillICMPData(char*icmp_data,intdatasize)(IcmpHeader*icmp_hdr=NULL;char*datapart二NULL;icmp_hdr=(IcmpHeader*)icmp_data;icmp_hdr->i_type=ICMP_ECHO;//requestanICMPechoicmp_hdr->i_code=0;icmp_hdr->i_id=(USHORT)GetCurrentProcessId();icmp_hdr->i_cksum=0;icmp_hdr->i_seq=0;datapart=icmp_data+sizeof(IcmpHeader);memset(datapart,'E',datasize-sizeof(IcmpHeader));}〃校驗和函數USHORTchecksum(USHORT*buffer,intsize)(unsignedlongcksum=0;while(size>1)(cksum+=*buffer++;size-=sizeof(USHORT);}if(size)cksum+=*(UCHAR*)buffer;cksum=(cksum>>16)+(cksum&0xffff);cksum+=(cksum>>16);return(USHORT)(~cksum);;}intDecodeIPHeader(char*buf,intbytes,structsockaddr_in*from)(IcmpHeader*icmphdr二NULL;DWORDtick;staticinticmpcount=1;unsignedshortiphdrlen;〃判斷接收操作是否超時if(!buf)(printf("%2d:***.***.***.***Requesttimedout.\n”,icmpcount++);return1;}tick二GetTickCount();iphdrlen=(buf[0]&0x0f)*4;icmphdr=(IcmpHeader*)(buf+iphdrlen);if(bytes<iphdrlen+ICMP_MIN)(printf("Toofewbytesfrom%s\n”,inet_ntoa(from->sin_addr));return0;}〃判斷接收的ICMP報文是否為超時報文if(icmphdr->i_type==ICMP_TIMEOUT&&icmphdr->i_code==0)(printf("%2d:%-15s%4dms\n”,icmpcount++,inet_ntoa(from->sin_addr),tick-cStartTickCount);return0;}〃判斷接收的ICMP報文是否為回復報文elseif(icmphdr->i_type==ICMP_ECHOREPLY&&icmphdr->i_id==GetCurrentProcessId())(printf("%2d:%-15s%4dms\n”,icmpcount++,inet_ntoa(from->sin_addr),tick-cStartTickCount);printf("Tracecomplete!\n〃);return1;}〃其他類型,表示不可達else(printf("%2d:Destinationhostisunreachable!\n”,icmpcount++);return1;}}intmain()(WSADATAwsaData;SOCKETsockRaw=INVALID_SOCKET;structsockaddr_indest,from;inti,bread,fromlen=sizeof(from),timeout=1000,ret;structhostent*hp二NULL;char*icmp_data=NULL,*recvbuf二NULL;USHORTseq_no=0;printf("DestinationAddress(IP/Hostname):");scanf("%s",lpdest);if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)(printf("WSAStartup()failed:%d\n”,GetLastError());return-1;}〃創建套接字sockRaw二WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAPPED);if(sockRaw==INVALID_SOCKET)(printf("WSASocket()failed:%d\n",WSAGetLastError());return-1;}〃對鎖定套接字設置超時bread二setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(timeout));if(bread==SOCKET_ERROR)(printf("setsockopt(SO_RCVTIMEO)failed:%d\n”,WSAGetLastError());return-1;}timeout=1000;bread二setsockopt(sockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout,sizeof(timeout));if(bread==SOCKET_ERROR)(printf("setsockopt(SO_SNDTIMEO)failed:%d\n”,WSAGetLastError());return-1;}〃解析目標地址,將主機名轉化為IP地址memset(&dest,0,sizeof(dest));dest.sin_family=AF_INET;if((dest.sin_addr.S_un.S_addr=inet_addr(lpdest))==INADDR_NONE)(if((hp=gethostbyname(lpdest))!=NULL)(memcpy(&(dest.sin_addr.S_un.S_addr),hp->h_addr_list[0],hp->h_length);dest.sin_family=hp->h_addrtype;printf(〃dest.sin_addr=%s\n〃,inet_ntoa(dest.sin_addr));}else(printf("gethostbyname()failed:%d\n”,WSAGetLastError());return-1;}}//CreatetheICMPpakceticmp_data=(char*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,MAX_PACKET);recvbuf=(char*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,MAX_PACKET);if(!icmp_data)(printf("HeapAlloc()failed:%d\n",GetLastError());return-1;}memset(icmp_data,0,MAX_PACKET);FillICMPData(icmp_data,DEICMP_PACKSIZE);printf("HopIPAddressTimeelapsed\n");〃開始發送/接收ICMP報文for(i=1;i<=255;i++)(intbwrote;〃設置IP包的生存期ret二setsockopt(sockRaw,IPPROTO_IP,IP_TTL,(char*)&i,sizeof(int));if(ret==SOCKET_ERROR)(printf("setsockopt(IP_TTL)failed:%d\n”,WSAGetLastError());}((IcmpHeader*)icmp_data)->i_cksum=0;((IcmpHeader*)icmp_data)->i_seq=seq_no++;//SequencenumberofICMPpackets((IcmpHeader*)icmp_data)->i_cksum=checksum((USHORT*)icmp_data,DEICMP_PACKSIZE);〃發送ICMP包請求查詢cStartTickCount二GetTickCount();bwrote二sendto(sockRaw,icmp_data,DEICMP_PACKSIZE,0,(structsockaddr*)&dest,sizeof(dest));if(bwrote==SOCKET_ERROR)(if(WSAGetLastError()==WSAETIMEDOUT)(printf("timedout\n");continue;}printf("sendto()failed:%d\n”,WSAGetLastError());return-1;}if(bwrote<DEICMP_PACKSIZE)(printf("Wrote%dbytes\n”,bwrote);}〃接收ICMP回復包bread二recvfrom(sockRaw,recvbuf,MAX_PACKET,0,(structsockaddr*)&from,&fromlen);if(bread==SOCKET_ERROR)(if(WSAGetLastError()==WSAETIMEDOUT)(DecodeIPHeader(NULL,0,NULL);continue;}printf("recvfrom()failed:%d\n",WSAGetLastError());return-1;}if(DecodeIPHeader(recvbuf,bread,&from))break;Sleep(1000);}system(〃pause〃);if(sockRaw!=INVALID_SOCKET)closesocket(sockRaw);HeapFree(GetProcessHeap(),0,recvbuf);HeapFree(GetProcessHeap(),0,icmp_data);WSACleanup();return0;}實驗結果如圖:通過最多30個躍點跟蹤至l]baidu-con[123_125_114.144]的£吉由;14ms5ms2ms22ms2ms35ms325ms2&ms69ms17441ms58ms69ns4919ms25ms32ns1&78ms103ms55ms4729ms33ms24ms98823ms23ms31ms02?10請求超此1122ms16ns17ns44跟蹤完成凸實驗三EMAIL的客戶端程序代碼如下:usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Windows;usingSystem.Windows.Controls;usingSystem.Windows.Data;usingSystem.Windows.Documents;usingSystem.Windows.Input;usingSystem.Windows.Media;usingSystem.Windows.Media.Imaging;usingSystem.Windows.Navigation;usingSystem.Windows.Shapes;usingSystem.Net.Mail;usingSystem.Net.Sockets;usingSystem.IO;namespacemail(///<summary>///MainWindow.xaml的交互邏輯///</summary>publicpartialclassMainWindow:Window(TcpClientserver;//接服務器stringsendstring;//用于存儲POP3服務命令參數byte[]bufferstring;//用于存儲POP3服務命令參數字節數NetworkStreamnetworkstream;//接服務器與服務器進行數據交互StreamReaderstreamreader;//讀取信息數據publicMainWindow()(InitializeComponent();}privatevoidsendMail_Click(objectsender,RoutedEventArgse)(//SmtpClientSmtpClient(〃〃);client=newSmtpClientSmtpClient(〃〃);client=newclient.Port=25;MailMessagemail=newMailMessage();mail.From=newMailAddress(〃liuweituan1989@163.com〃,"我是1234");//加上自定義的發件人顯示名稱mail.To.Add(newMailAddress("120172167@"));mail.Subject="TestSmtpClient";mail.Body="Thismessageisfortesting.";client.DeliveryMethod=SmtpDeliveryMethod.Network;client.UseDefaultCredentials=true;//啟用身份認證mail.Priority=MailPriority.Normal;//郵件優先級//mail.Attachments.Add(newAttachment(礦F:\我的文檔\消息.txt"));〃附件//mail.Body=newSystem.IO.StreamReader(礦F:\我的文檔\ttt.txt",Encoding.Default).ReadToEnd();從文本文件中讀取郵件內容mail.BodyEncoding=System.Text.Encoding.UTF8;client.Credentials=newSystem.Net.NetworkCredential("liuweituan1989@163.com","19891217421X");//如果是匿名發送則不需要這一句(這里將賬號和密碼用x和*代替了)//client.Send(mail);client.SendCompleted+=newSendCompletedEventHandler(SendCompletedCallback);//回調函數stringuserState="測試";client.SendAsync(mail,userState);}privatestaticvoidSendCompletedCallback(objectsender,System.ComponentModel.AsyncCompletedEventArgse)(if(e.Cancelled)〃郵件發送被取消(}if(e.Error!=null)//郵件發送失敗(}else//發送成功(}}privatevoidShowinfo()(richTextBox1.Document.Blocks.Clear();try(stringstrResult=〃〃;sendstring="RETR"+this.textBox4.Text+〃\r\n〃;//存儲從服務器獲得一條信息的命令bufferstring=Encoding.ASCII.GetBytes(sendstring.ToCharArray());networkstream.Write(bufferstring,0,bufferstring.Length);strResult=streamreader.ReadLine();if(strResult[0]!='-')(//不斷地讀取郵件內容,只到結束標志:英文句號while(strResult!=〃.〃)(this.richTextBox1.AppendText(strResult+〃\r\n〃);strResult=streamreader.ReadLine();}}else(this.richTextBox1.AppendText(〃\r\n〃+"郵件錯誤〃+〃\r\n〃);}}catch(Exceptioney)MessageBox.Show(ey.Message);}}privatevoidgetMail_Click(objectsender,RoutedEventArgse)(Showinfo();}privatevoidlogin_Click(objectsender,RoutedEventArgse)(server=newTcpClient(this.textBox1.Text,110);//實例TcpClient類對象聯接服務器networkstream=server.GetStream();//實例NetworkStream類對象接收返回發送的數據streamreader=newStreamReader(networkstream);//實例StreamReader類對象讀取數據try(sendstring="USER"+this.textBox2.Text+"\r\n";//存儲用戶名bufferstring=Encoding.GetEncoding("gb2312”).GetBytes(sendstring.ToCharArray());networkstream.Write(bufferstring,0,bufferstring.Length);//將用戶名發送到服務器richTextBox1.AppendText(streamreader.ReadLine()+"\r\n");//將用用戶顯示在richTextBox控件中sendstring="PASS"+this.textBox3.Text+"\r\n";//存儲用戶密碼bufferstring=Encoding.GetEncoding("gb2312").GetBytes(sendstring.ToCharArray());networkstream.Write(bufferstring,0,bufferstring.Length);//將用戶密碼發送到服務器richTextBox1.AppendText(streamreader.ReadLine()+"\r\n");sendstring="STAT"+"\r\n";//儲存從服務器獲得所有信息序號和字節數命令bufferstring=Encoding.GetEncoding(〃gb2312〃).GetBytes(sendstring.ToCharArray());networkstream.Write(bufferstring,0,bufferstring.Length);//從服務器獲得所有信息序號和字節數stringstrResult=streamreader.ReadLine();//讀取從服務器返回的數據if(strResult.IndexOf('-')==-1)(richTextBox1.AppendText(strResult+"\r\n");sendstring="LIST"+"\r\n";//存儲從服務器中獲得信息列表和大小的命令bufferstring=Encoding.GetEncoding("gb2312”).GetBytes(sendstring.ToCharArray());networkstream.Write(bufferstring,0,bufferstring.Length);stringstrInfo=streamreader.ReadLine();string]]str=strInfo.Split('');richTextBox1.AppendText("郵件數量:"+str[1]+"\r\n");richTextBox1.AppendText(str[1]+":封郵件總容量為〃+str[2]+〃\r\n〃);MessageBox.Show(this.textBox2.Text+"用戶您好?。?!");}else(MessageBox.Show("讀取信息有誤,請重新登錄");}}catch(Exceptioney)(MessageBox.Show(ey.Message);}}2.實驗結果:1AQ網易免費郎■LUQ1AQ網易免費郎■LUQrndil.163.Luin應用中心皿收件藉MailSend…xwangweLneu(S163tom一(g|設置|蠅媵||退出i收信才與信幟迪日陣t卜i收信才與信幟迪日陣t卜郅單已宣S?m口餉犢?SH:61笙|回其綁卜|拄最卜[|「捐搦哉1,S&掘I,宦客,MailSendT?rtJ昔[*岌牛J...:Testformail<wangweL^eu:?163-com>-^A-wargwei_neu<wangwei_neu@'l&i.ccm>ST間:2O14$:D1月M日23:41i密盅PThisTiessageisfortestingfronrerHeLlaIanfrailtiru!實驗四簡單的WEB服務器開發1.實驗目的了解web服務器的實現原理,并編程實現一個簡單的web服務器。開發環境Windowsxp操作系統Java語言編程實驗原理WWW是以Internet作為傳輸媒介的一個應用系統,WWW網上最基本的傳輸單位是Web網頁。WWW的工作基于客戶機/服務器計算模型,由Web瀏覽器(客戶機)和Web服務器(服務器)構成,兩者之間采用超文本傳送協議(HTTP)進行通信。HTTP協議是基于TCP/IP協議之上的協議,是Web瀏覽器和Web服務器之間的應用層協議,是通用的、無狀態的、面向對象的協議。HTTP協議的作用原理包括四個步驟:連接,請求,應答,關閉應答。根據上述HTTP協議的作用原理,實現GET請求的Web服務器程序的方法如下:創建ServerSocket類對象,監聽端口8080。這是為了區別于HTTP的標準TCP/IP端口80而取的;等待、接受客戶機連接到端口8080,得到與客戶機連接的socket;創建與socket字相關聯的輸入流instream和輸出流outstream;從與socket關聯的輸入流instream中讀取一行客戶機提交的請求信息,請求信息的格式為:GET路徑/文件名HTTP/1.0從請求信息中獲取請求類型。如果請求類型是GET,則從請求信息中獲取所訪問的HTML文件名。沒有HTML文件名時,則以index.html作為文件名;如果HTML文件存在,則打開HTML文件,把HTTP頭信息和HTML文件內容通過socket傳回給Web瀏覽器,然后關閉文件。否則發送錯誤信息給Web瀏覽器;關閉與相應Web瀏覽器連接的socket字。套接字,與本地簞nd]"將套接字w與遠地主機相連可以總結出Web服務器的設計流程并作出其設計流程圖,如圖4-1所示。Q服務器方姑褪客套接字,與本地簞nd]"將套接字w與遠地主機相連可以總結出Web服務器的設計流程并作出其設計流程圖,如圖4-1所示。Q服務器方姑褪客p方m塞皿巨七0關閉套接字姑closesockstQ,關閉套接字與將束TCF對話騷霹E娜翳件字,recvO/sendt\在登接字ns上潮寫數旺直爭院成交換曙皿心計臼在套接字上寫/讀數據,直勤數據交換完成4.主要代碼如下在Java工程中建立包webserver和類HttpServer、Request、Response,在對應框中輸入以下程序代碼:HttpServer.javapackagewebserver;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.util.Properties;importjava.io.IOException;importjava.util.Enumeration;.ServerSocket;.Socket;importjava.io.InputStream;importjava.io.OutputStream;importjava.io.PrintStream;publicclassHttpServer(privateintiPort=8080;//defaultportpublicstaticStringBasic_Root=System.getProperty("user.dir");publicstaticStringWEB_ROOT=System.getProperty("user.dir")+File.separator+"webroot";publicstaticintcount=0;publicHttpServer()(System.out.println("歡迎使用Web服務器,本服務器只支持靜態網頁。");System.out.println("檢查配置文件及網頁文件夾...");getConfig();start();}publicstaticvoidmain(String[]args)(HttpServerhttpserver=newHttpServer();}privatevoidgetConfig()(FilefileCon=newFile(Basic_Root,"config.ini");FilefileDir=newFile(WEB_ROOT);FilefileWeb=newFile(WEB_ROOT,"index.htm");if(!fileCon.exists())(System.out.println("配置文件Config.ini損壞,重建中...");reBuildConfig(fileCon);if(!fileDir.exists())(System.out.println("網頁存放文件夾不存在,重建中...");fileDir.mkdir();System.out.print(〃完成!請在");System.out.println(WEB_ROOT+〃中放置網頁文件...");System.out.println("Web服務器將重新初始化...");getConfig();}if(!fileWeb.exists())(reBuildWeb(fileWeb);}Propertiespps=newProperties。;try(pps.load(newFileInputStreamCconfig.ini"));Enumerationenumer=pertyNames();StringstrKey=(String)enumer.nextElement();StringstrValue=pps.getProperty(strKey);if(strValue.equals(〃〃)!=true)(WEB_ROOT=strValue;}System.out.println("網頁文件的存放路徑為:"+WEB_ROOT);strKey=(String)enumer.nextElement();strValue=pps.getProperty(strKey);if(strValue.equals(〃〃)!=true)(iPort=Integer.parselnt(strValue);}System.out.println("Web服務器訪問端口為:〃+iPort);System.out.println("您可以修改Config.ini文件重新設定以上配置〃);System.out.println("啟動檢查完成,服務器初始化中...");}catch(IOExceptionex)(ex.printStackTrace();}}publicvoidstart()(System.out.println("Web服務器啟動中...");ServerSocketserverSocket;try(serverSocket=newServerSocket(iPort);System.out.println("Web啟動完成!");System.out.println("您現在可以在瀏覽器中訪問http://localhost:8080/,以測試服務器是否運行");while(true)(Socketsocket=null;InputStreaminput=null;OutputStreamoutput=null;System.out.println(〃等待連接...");socket=serverSocket.accept();System.out.println(socket.getInetAddress().toString()+〃請求連接");input二socket.getInputStream();output二socket.getOutputStream();System.out.println("服務器開始處理第〃+(++count)+〃次連接〃);〃開始處理并分析請求信息Requestrequest=newRequest(input);request.parse();〃開始發送請求資源Responseresponse=newResponse(output);response.setRequest(request);response.sendStaticResource();//關系連接socket.close();System.out.println(〃連接已關閉!");}}catch(Exceptionex)(ex.printStackTrace();System.out.println(〃3〃);//continue;}privatevoidreBuildConfig(Filefile)(try(file.createNewFile();FileOutputStreamfos=newFileOutputStream(file);PrintStreamsp=newPrintStream(fos);sp.println(〃WEB_ROOT=〃);sp.println(〃PORT二〃);sp.close();System.out.println("配置文件Config.ini創建成功,您可以修改WEB_ROOT的值改變網頁文件的存放路徑,修改PORT的值改變訪問端口!");}catch(IOExceptionex)(ex.printStackTrace();System.out.println("重建配置文件Config.ini失敗");System.out.println("服務器將使用默認配置...");}}privatevoidreBuildWeb(Filefile)(try(file.createNewFile();FileOutputStreamfos=newFileOutputStream(file);PrintStreamsp=newPrintStream(fos);sp.println(〃<html>〃);sp.println(〃<head>〃);sp.println("<title>簡單Web服務器</title>〃);sp.println(〃</head>〃);sp.println(〃<body>〃);sp.println("<divalign=〃+〃center〃+〃>服務器已經成功運行</div>");sp.println(〃</body>〃);sp.println(〃</html>〃);sp.close();}catch(Exceptionex)(ex.printStackTrace();}}}Request.javapackagewebserver;importjava.io.InputStream;publicclassRequest(publicRequest()(}privateInputStreaminput;privateStringuri;publicRequest(InputStreaminput)(this.input=input;}publicvoidparse()//取得請求信息(StringBufferrequest=newStringBuffer(2048);inti;byte[]buffer=newbyte[2048];try(i=input.read(buffer);}catch(Exceptionex)(ex.printStackTrace();i=-1;}for(intj=0;j<i;j++)(request.append((char)buffer[j]);}System.out.println(request.toString());uri=parseUri(request.toString());System.out.println(〃用戶請求:〃+this.getUri());privateStringparseUri(StringrequestSt
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 聘任專家協議書
- 教師赴企業培訓協議書
- 美簽互換協議書
- 租賃期權協議書
- 紫光展銳協議書
- 生產線外包合同協議書
- 貓咪售后協議書
- 職場體驗協議書
- 校區合伙人合同協議書
- 藥品進貨協議書
- 安徽省合肥一中2025屆高三5月回歸教材讀本
- 2024年江蘇省無錫市中考歷史真題(解析版)
- 雙方房屋使用協議書
- 投資理財保本協議書
- 2025年廣東省深圳市中考道德與法治 總復習責任意識檢測卷(含答案)
- 地西半球的國家 復習課課件-2024-2025學年七年級地理下學期(人教版2024)
- 2025法語DELFA1級考試試卷
- 2025年黃山旅游發展股份有限公司春季招聘75人筆試參考題庫附帶答案詳解
- 2025年中考時事政治題及答案
- 2025-2030全球及中國發電機租賃行業市場現狀供需分析及市場深度研究發展前景及規劃可行性分析研究報告
- 第10課 相親相愛一家人 課件-2024-2025學年道德與法治一年級下冊統編版
評論
0/150
提交評論