




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
互联网技术及应用实践
实验报告报告名称:路由器配置及应用路由追踪的实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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 创业项目分析报告
- 人教版八年级下册生物知识点总结
- 园工专业毕业论文
- 韩国语专业毕业论文
- 书本封面设计课件
- 脑梗死生理病理
- (高清版)DB11∕T2326-2024油气管道高后果区识别与管理规范
- (高清版)DB11∕T2263-2024拟新增耕地土壤环境质量调查技术规范
- 2025年硅力敏传感器合作协议书
- 铋-铬及稀土金属离子掺杂发光材料合成与光谱特性研究
- 广告牌的制作安装及售后服务方案
- 2024年建筑幕墙工程检测理论考试题库(精练300题)
- 《铁路轨道维护》课件-更换接头夹板作业
- 2025届广东省广州市实验中学高三第一次调研测试数学试卷含解析
- 2024护理分级新标准
- 《5G时代万物皆智联》演讲课件
- 造型的表现力 课件 2024-2025学年人教版初中美术八年级上册
- 生态学专业英语词汇
- 胸腔闭式引流护理-中华护理学会团体标准
- 《公安机关人民警察内务条令》知识题库
- 中东及非洲战术高频无线电行业现状及发展机遇分析2024-2030
评论
0/150
提交评论