《2023年计算机网络原理实验报告.docx》由会员分享,可在线阅读,更多相关《2023年计算机网络原理实验报告.docx(17页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、多线程Web服务器1实验目的:用JAVA语言开发一个多线程的WEB服务器,它能并行服务于多个请求。发送网页文献, 让网页文献可以通过在URL中制定端标语来被浏览器使用。2实验代码及截图 且 http:/localhost:8081/index.htmZ收藏卖 骨乱6.11 e 6.9且http-WWW. ba id u4首页)http:/localhost:8081/index.htm145646-456口 收藏夹 一:且6,11 8. 6.9乱http-www.baidu 苜爽/凉交通大学 好音Internet Explorer无法显示该网页Internet Explorer无法显示该网页您
2、可以尝试以下操作:诊断连接问题I9更多信息class C on n ection T h r e ad e x ten d s Thread Socket c 1 ie n t;i n t cou n te r ;提示1_区一信息已成功发送!确定publ i c class Ma i IMes s a g e publ i c s t a t ic v oid m a i n ( S tr i ng args) o Eve ntQucu e .invokcLa t er(n e w Run nab le() o pu b li c v oi d r un() t ry 9。 Send F ra
3、me frame = new SendFrame ();ggfr a me.s e tVis i b 1 e(true);g。 catch (Exc e ption e ) e.printS t ackTra c e() ;/*。* Create th e f r ame.叫pub 1 ic Se n d Frame() 0。t h i s F ram e = t h is;ase t T i tl e ( Ja v a M a il c lie n t );s ctDcfault C1 o scOpcr a t i o n (JF r ame .EXI T_ON_CLOSE);selB o
4、un d s (100, 100, 4 5 0,328);c on t e n t Pane = new J P ane 1 ();oo c o n t e n(P a ne. s e tBo r der ( n e w Emp t y B order( 5 ,5,5 , 5);wsetCo n te n t Pan e(c o n t ent P ane);con t en t Pane. setL a y oul( n ull);3 J Label IblFrom = new J Label (from:);MblFrom. s e tBounds( 1 0, 1 0,54, 22);oc
5、 o n t e n tPa n e .add(lblF r om);0odLab e I IblTo = new JLabel(T o:); 1 bl T o .setB o u n d s (I 0 , 4 2,42,22);con t entP a ne.add ( IblTo);。J Labe 1 lb 1 Subject = n e w J Lab el (* S ub j ec t : 11 ); d b IS u bjec t . s etB o und s ( 1 0,74, 54, 2 2);aocontentP a n e . a dd(lblS u b j ect);t
6、xt_F r om = new J TextField();8tx t _Fr o m.sc t E d i t abl e (f a 1 s e );Mx(_Fro m.setText();4xt_From.setB o u n d s (49, 11,38 3,21 ):content Pane.add (txl_F r o m);。 tx t _Fro m. s et C olum n s (10);txt_ T o = n e w JTex t F i e ld();t xt_To. set Te x t( M);stx t _To. s e (Column s (10);3t xt_
7、To. set Bounds (4 9 , 4 2, 3 83, 21);c o nten t Pane, a dd (t x t _To);8 t e xt_Subject = new JT e xtFie 1 d();ot e xt_Subj e ct. selText(作业 2:邮件客户机)e x t _Sub j ect.setColumns( 10);ootext_Subj e ct. se t Bou n ds(66,73, 3 66,21); contentPa n e . a dd(tex t _S ubjecl);s J Label IblMassage = new JL a
8、 bel (Mass age:);olblMass a ge.setBo u nd s (10, 1 01, 6 4 , 15); contentP a ne.a d d (IblMass age);0000gj B utton btnQu i t = new JBu t t on(Q u it);b t nQuit. a d d Act i o nL i st e n e r (new Ac t io n Lis t ener() op u b lie vo i d actio n Pcrfo r med ( A ct i on E vent c)(4hisF r ame. d i spo
9、s e();,);0btnQ u i t . s e tBounds(2 9 5,271, 137, 23);con t en t Pane.ad d (bin Q uit);0o JScr o 1 1 Pa n e scroll P ane = new JScr o 1 1 Pane();s crollPane. s e tB o u n ds ( 1 0, 229, 4 2 2, - 1 0 1 );contentPa n e .add(s c r o UPa n c);3P a ne 1 pane 1 = n ew Pa n el();。pa n e L set Bound s (10,
10、 1 1 5,4 22, 156);c o n t entPane.ad d (p a n e 1 ); p a n e 1 . s etLay o ut( n ull);S c r ollPane s c ro 1 1 P a n e_ 1= new S c r oIlP a n e ();。 scroll Pane _ 1 . s etBounds( 0,0,422, 156);o p a nel.add(sc r o 1 IPa n e_ 1 );gf i n a 1 T ex t A r e a Se n d_Tex t Area= new TextArea();n d_Tex t A
11、r e a.s e iText (你好!这是一封测试邮件)。 S end_T ext Area.setBo u n d s(0, 0,4 40,1 70);s c r o IIP a ne_l. a dd( S cnd_Tcx t Area);J B utton b tnS e nd = n e w JButton(Scn d );btnSe n d.add Ac t i o n L istener (new ActionList e ner() p u b 1 i c vo i d ac t io n Perfo r m ed (Act i on E vent e ) oStri n g t
12、xt f rom = txt_From. getText();。 t r i ng t x tto=txt_To. g etTex t ();aStr i n g txtsubje c t=text_Subject.gei T ext();g S tri ng sendte x ta r ea=Send_TextArea. g etText();g try (g Ma i IM e ssa g e mes s age=ncw Mai 1 Messagc();8。 mess age.setFrom(txt f rom);/ / 发件人3 g m e ss a ge.setTo( txtto) /
13、 收件人a。Str ing se r ver= ;邮件服务器 $ m t p.q q . c o m。 g messa g e. selSubject (ixtsub j ect);邮件主题。m e ss a ge.setConte n t(sendtextar ea); 邮件内容3 messa g e.s e tDatafr o m(t x tf r o m ); 发件人,在邮件的发件人栏目中显示。 a。 messa g e.setDat a t o( t xlto);收件人,在邮件的收件人栏目中显示。m e ssage.setUse r ( ) ;/登陆邮箱的用户名me s sage, s
14、 e t P a ssw o r d (zjr* (保密);登陆邮箱的密码“S endFrame smtp=n e w Se n dF r ame(server,25);。boolea n flag;03。f 1 a g=smtp.s e n dMail(mess a ge, ser v er);a g if(fl a g) 尔。J 0 ptionPa n c.s h o w M e s s ag e D ialo g (nu 1 1,信息己成功发送!”,提醒”,JO p t ionP a n e.IN F 0 RM A T10 N_M E SSAGE);3g O g ei s e 。 JOp
15、tion P a n e _s h owMe s sagcDia 1 o g (nu 1 1,邮件发送失败!”,提醒,JO p tion Pane. I NFOR MAT I ON.MESS A GE); a / / S y st e m.o u t. p r i ntln( iu h f ihula e ih b a );。 cat c h (UnknownHos t Ex c eption el ) TODO Auto-g e n c r atcd c atch block1. pr i ntStac k Tra c e();8。 c a tc h (IO Exception e 1 )
16、。/ TOD O A ut o g e n era t e d ca t ch bio c k g e 1 .printStackTr a c e ();/ / 时0 p tionPane. s howM e ssageDialog (null,信息己成功发送!,提醒,J O p tio n Pane. IN F 0 RMATION_M ESSAGE);/ A Sy s t e m . out.p r in t 1 n (t x t from+n+ t xtto+ n+ t x t s u bject+ n+sendte x tar e a);g“);t nSend.s e tB o un d
17、 s (10,271, 144, 23);contcn I P anc. a d d(btnScnd);s J Butto n btnC 1 ca r = n e w JBu 11 o nCClcar );bmCIear. ad d Actio n Lis t en e r(n e w Ac t ionLislene r () 。 apu b lie v oi d ac t io n Perf o rm e d(A c tio n Event e) 。tx t _To. setTextC*);t e xt_Su b j e ct. setT e xt(n );g S end_T e xtAr
18、e a .selText ();, dO p tio n Pane.showMessageDi a lo g ( n u 1 1,”信息删除成功!”, “提醒”,J0 p tio n P a ne. INFO RMATION.MES S AGE);00 |。);b t nCle a r. s e (Bou n ds(149 271, 1 50,23);。c on t eniPane.ad d (b t nClear);Jpr i vate b oolean debug=true;a BASE 64Encode r e n co d e =new B ASE64 E n code r (); 用
19、于加密后发送用户名和 密码。p rivate Socket s o eke t ;p u blic Sen d Fram e (S tring ser v e r,int port) t h rows Unkno w n IIoslE x cept i on, lOExc e pt i on 0 try s o ck e t=new Soc k e t (serv e r,25 );o cat c h(S o c ketE xception e)/ System, o ut. pri n t 1 n(e.getM e ssag e ();o c a tch( E x ce p t i on e
20、)e.pr i n t S t a c kTrace (); finally / Sy s tem.out.p r intln( 已经建立连接!)a )。/注册到邮件服务器。public vo i d helo(S t r i ng serve r ,B u ffered Read er i n ,B u ff e r ed Writer o ut) throws IO E xcep t ion( o int resu 1 t; re s u lt=getRes u k(in);。连接上邮件服务后,服务器给出2 2。应答i f (result! = 2 2 0 )t h row n ew 10
21、 E x ception(连接服务器失败); 。 r es u lt= s endServer( HELO + serv e r,in,o u t);s /HELO命令成功后返回25 0o if(result! = 2 50)a 。 throw n ew IO E x c eption (注册邮件服务器失败!”);)。 private i nt s e ndServ e r( S tr i n g str, B uf f e r e d Reader i n, B u f f e r e d Wri ter out) th r ow s I O Ex c c p tio n ou t .wr
22、i te(str):s o ut.ncwLinc ();o out.flushO;。 i f(debug),(/ Sy s tem.ou t .println(已发送命令:+ s tr);)ret u r n ge t Res u lt(in); public int ge t R e suit (BufferedRe a d e r i n)o St r in g 1 inc= iry(line=in.readLi n e ();i f (deb u g )/ / System.out. p rintl n (服务器返回状态:4-line);。)catch(E x c eption e )
23、a e. p r i nt S ta c kTr a c e (); o/ /从服务器返回消息中读出状态码,将其转换成整数返I可。 S t ri n g T o k e n i zer s t=new S t ri n gTok e ni z er( 1 i ne,);,retu r n I n t e g e r . p arsel n t (st.nextT o ken();)0。p ubli c vo i d au t h Lo g in (Ma ilMes s ag e m e ssa g e,Buffe r edRea d er in, B uf f ere d Writ e r o
24、 ut) throws I OE x c e pti o n int resul t ;o r e s u 1 t=se n dScrvcr(AUTH LOGIN, i n, o ut);if(res u 1 t !=334)thr o w new IO E xce p t i o n (用户验证失败!):0 )。 re s u lt=s e n dSe r ver (e n c o de. encode(message.g e t U ser().get B yt e s (), i n,ou t ):s i f ( r e s ul t !=33 4 ) 。 th row new I 0
25、Excepti o n(用户名错误厂);res u It = se n d S e rver(en c od e ,encode(m e ss a g e.ge t P a ssword() .geiByles(),in,out);i f (re s u lt!= 2 3 5 )(。 th r o w new IOEx c epti o n (验证失败!);)I/开始发送消息,邮件源地址p ublic v o id m a i 1 f r o m ( S tri n g sour c e.Bu f fered R eader in, B u ff e r cdW r ite r out) t
26、hrows 10 Excepti o n s in t res u It;r e sult=sendSer v er(M A IL FROM:, i n ,out):i f ( res ult!=25O) 。 thro w new lOExc e ption(指定源地址错误);3) 。/设立邮件收件人p u blic void r c pt(Slrin g to u chman,B u f f eredR e ade r in, B u fferedWr i t er ou t ) throws I OExc e p t ion3 i nt re s u 1 t ;3 r e sul t =
27、s cndS e r v er(RC P T T 0:,in, out);i f(re sul t ! = 25 0 )t hr o w new IOEx c e p t ion(指定目的地址错误!);/邮件体pub 1 ic Con nectionThread(S o cket cl,int c) 。die n t = cl;。 c o unt e r = c;0 0o public void run() / 线程体 - try 00。 St r i n g de s tl P=clien t . ge t Inet Addre s s() . t oString(); /客户机工P地址。i
28、nt d e stp o r t = c 1 i e nt.g e t P o rt(); / 客户机端标语。Syst e m . o ut. pr i ntln( Conn e c t ion +co u nter+ :c o nne c ted t o +destIP+ on p or t H +des t port + .); o P rintStr e am out s tream= n ew P rintStr e am( c 1 i en t .get 0 u tputSt r eam();。Da t aln p utStr e am in s tream=new Dat aInp
29、u t Stream(cli ent.ge t I n putStream();。 o Str i n g in I ine=in s tream. r eadL i ne();/ / 读取Web浏览器提交的请求信息。 Sy stem, ou t . p r in t 1 n ( Re c e i v e d : + i n line);O 00 o。if ( g e t re q ues t (i n line) / / 假如是GET请求St r i ng f ilename= g e t f ilen a me(in 1 in e );退出pu b lie voi d q u i t(B
30、u ffe r e d Reader in,B u fferedW ri t er o u t) th r ows I OE x c e p tio n 。 i nt result;re s ult=sen d S e r v er( Q UIT,i n , out);Id发送邮件主程序p u b 1 ic boo 1 ean s e ndMa i l(MailMessage messag e ,String server) , try o Buffe r edR e ad e r in = new B u f feredReader( n ew I n p u t StreamRea d e
31、r(s o cket.ge t I n put S tre a m();。 B u ffered Wr i ter o u t=new Bu f fere d W r ite r (ne w O u t put S tr e amWriter(soc k e t .gc t Outpu t S tream ();h e 1 o ( s erver, i n,out);/H E LO 命令 a uth Login (me s sag e .in, out) ;/AUTH LOG IN 命令 mailfr o m(mess a ge. g e(F r om(), i n. o ul);/MAIL
32、F ROM rep t (m e ssage. g e tTo (), in, out);/RC PT3 data(messag e . g etDataf r om () ,mes sage .gelData t o(),message. g etSubje c t(),m es s age. g etC o n te n t ( ) ,in, o u t );/D ATAqu i t(in,ou t );/QUIT3 c a tch(Exc e ptio n e)e .pr i ntS t a c k T race();r etu r n f a Ise;r e tu r n t r ue
33、;。程序实现与服务器之间建立连接,根据服务器端发送的响应来完毕建立连接的过程,然后根 据服务器发送回的响应信息,根据相应的模式,发送相应的信息,从而建立起与邮件服务器 端的连接以发送邮件。3实验软硬件环境E s 1 i p seW I NDOWS xp4实验环节(1)创建和解析内容:Mes sage类是创建和解析邮件核心A P I ,它的实例对象代 表一封邮件。(2)发送邮件:T ran s port类是发送邮件的核心A PI,它的实例对象实现了某个邮件发送 协议的邮件发送对象,例如SMTP协议。(3)接受邮件的:S t。re类是接受邮件的核心API,它的是实例实现了邮件接受协 议的邮件接受对
34、象,例如POP 3协议。5实验心得通过本次实验我加深对网络通信协议、网络编程接口等基本概念、基本原理的理解,大体了 解了各种应用各种网络通信协议和网络编程接口编写网络应用程序的方法,拓宽了知识领域, 锻炼了实践技能。比如邮件服务器按通讯协议可以划分为两种类型:1. STMP服务器。是Simple Mail Transfer Protcol的简写,用于替用户发送邮件和接受外面发送给本地用户的邮件。是遵循SMTP协议的发送邮件服务器,,基于TC P服务的应用层协议。2. POP3服务器。是Post Office Protoc o 1的简写,用于替用户帮助用户读取SMTP服务器接受进来的该用户的邮件
35、。它定义了邮件客户端软件与POP3服务器的通 讯规则。不同的邮箱也许相应不同的服务器,应当选择不同的协议,否则会报错。6参考文献:1计算机网络:自顶向下方法(原书第4版)/(美)库罗斯(Ku rose, J.F.) 等著;陈鸣译-一北京:机械工业出版社,2 0 23. 1 22 java从入门到精通:李钟尉,马文强,陈丹丹 等编著;-清华大学出版社,202 3.9 3实验指导书。F i 1 e f il e =new F i 1 e(fil e name);。讦(f i le. exists() / /若文献存在,则将文献送给W e b 浏览器。Sy stem. out. println(fi
36、lenam e + r e q u e sted .);。* ou t stream .pri n tl n ( * HTT P/ 1 .0 2 00 OK);。outstr e a m.pr i n t In (MIME_ v er s i o n: 1. 0 。 outs t ream.pr i n t 1 n (Cont e n t_Type: te x t / h tm1);。3 oooint len=( i nt) f ile.l e ngth();。 outs t ream.printin (Conten t _Le n g t h: +1 en); o o outstr e am
37、. p r intln (); s e n dfile(out sire am,file) ; / 发送文献0 。 out s tre a m. f lu s h ();。o el s e II文献不存在时。St r ing notfou n d =N o tFou n dError 404- f ile not found;。o o u t s tream. p ri n tin (HTTP/1.0 40 4 n o found);o o u tst r e am.pr i ntln( Conte nt_Typ e :t e xt / h t ml);。oo ou t st r earn .
38、pri n tln( C on t e n t_Length: + notfoun d .length ()+2);o u t s t ream, p rintln();。 o u t s t r eam.printl n (n o tf o und);。outstream.flush ();0 0 0 00000long ml=l;。while (ml0)。if ( s . su b strin g(0,3). eq u a Islgnor e Ca s e(GET)r e t u rn tr u e;retur n f als e;/*获取要访问的文献名*/Strin g g e tfil
39、ename ( String s) 0。String f= s .subs t r i ng( s . i n d exOf ( )+1 );。f=f. su b s t r i ng(0?f. i n d e xO f (); try i f (f. c ha r At(0) =/) 。f =f .subs t r ing(l);。 c a tch ( S trin g I n d e x OutOf Bou n dsE x ception e) Sy s tem. ou t .p r i n tln( Except i on: +e);) 0i f (f. e qual s () f =i
40、 n d ex. h tml ;。re t u r n f;)/火把指定文献发送给Web浏览器*/void sen d file(Prin t S t ream outs. File f i le) try (。Datal n putStream in = new D atalnputS t ream(n e w Filein put S tn e am(fi 1 e);。 i n t 1 e n=(i n t)fi 1 e.length();os b y te b u f = n e w b yt e 1 e n ;。 i n.readFul 1 y( b uf );outs, write(
41、bu千,0,len);o u ts. fl u s h ();。3 i n.close ();。 c a t c h (Ex c eption e ) o。0 Sys t em. out. printl n (Er r or retr i e v in g f i le.)。 System.exi t ( 1 ); 0 )p u b 1 i c c lass webseve r public s t at i c vo i d mai n (S t ring args) 。/ TODO Auto g e nera t ed meth o d stubi nt i=l, P0RT=8 0 8 1
42、 ;Server S o c k e t s er v er= n ul 1 ;。S o cket die n t=nul 1 ;。try (。 server=new S erverS ocket(PORT);。 Sy s tem.o u t. pri n t 1 n(Web S e rver i s list e n i n g onport +s e rve r .ge t Lo c alPor t ();0 0。 whi 1 e (tr u e) 00。cl i e nt=se r ve r . accept ();/ 接受客户机的连接请求。 new Con n ectionTh r e
43、 a d(c 1 i e nti) .start();。i+;)0 c atch ( E x c eption e ) 。 System .o u t. prin t 1 n( e );)3实验软硬件环境eel i p seWindows xpIE浏览器4实验环节(1)连接:Web浏览器与Web服务器建立连接,打开一个称为socket (套接字)的虚拟文献,此文献 的建立标志着连接建立成功。(2)请求:Web浏览器通过sock e t向We b服务器提交请求。HTTP的请求一般是GET或P OST命 令(POST用于FORM参数的传递)。GET命令的格式为:GE T 途径/文献名HTTP/ 1
44、. 1文献名指出所访问的文献,HTTP/1. 1指出Web浏览器使用的HTTP版本。(3 )应答:Web浏览器提交请求后,通过HTTP协议传送给W e b服务器。Web服务器接到后,进行事 务解决,解决结果又通过HTTP传回给Web浏览器,从而在Web浏览器上显示出所请求的页 面。为了告知Neb浏览器传送内容的类型,Web服务器一方面传送一些HTTP头信息,然 后传送具体内容(即HTTP体信息),HTTP头信息和HTT P体信息之间用一个空行分开。(4)关闭连接:当应答结束后,Web浏览器与Web服务器必须断开,以保证其它Web浏览器可以与Web 服务器建立连接。5实验心得Ja v a中实现多
45、线程有两种途径:继承Th r ea d类或者实现Runn a ble接口。此处使用 了接口的方式生成线程,由于接口可以实现多继承,况且Runnable只有一个ru n方法,很适 合继承。在使用Th r e a d的时候只需继承Thread,并且new 一个实例出来,调用s t ar t ()方法即可以启动一个线程。在本次实验中,通过用j a va语言开发一个多线程的web服务器,能并行服务于多个 请求,来掌握套接字编程技术,了解并运用ht t p协议的作用原理,实现多线程web服务器设计。6参考文献:,1计算机网络:自顶向下方法(原书第4版)/(美)库罗斯(Kurose,工卜.)等著;陈鸣译一北京:机械工业出版社,2 023.12 2java从入门到精通:李钟尉,马文强,陈丹丹 等编著;一清华大学出版社,202 3. 93实验指导书邮件客户机1实验目的:。为发送者提供一个图形界面,其中包含:发送电子邮件地址、接受者电子邮件地址、邮件主 题和自身。开发一个In tern e t上的使用S T MP协议的网络服务器的邮件客户端,在W i n dowsXP, Windows7系统下,使用J AVA语言开发,并最终运营该程序。2实验部分代
限制150内