版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
多线程Web服务器1实验目的: 用JAVA语言开发一个多线程的WEB服务器,它能并行服务于多个请求。发送网页文件,让网页文件能够通过在URL中制定端口号来被浏览器使用。2实验代码及截图classConnectionThreadextendsThread{ Socketclient;intcounter; publicConnectionThread(Socketcl,intc){ client=cl; counter=c; } publicvoidrun()//线程体 { try{ StringdestIP=client.getInetAddress().toString();//客户机IP地址 intdestport=client.getPort();//客户机端口号 System.out.println("Connection"+counter+":connectedto"+destIP+"onport"+destport+"."); PrintStreamoutstream=newPrintStream(client.getOutputStream()); DataInputStreaminstream=newDataInputStream(client.getInputStream()); Stringinline=instream.readLine();//读取Web浏览器提交的请求信息 System.out.println("Received:"+inline); if(getrequest(inline)){//如果是GET请求 Stringfilename=getfilename(inline); Filefile=newFile(filename); if(file.exists()){//若文件存在,则将文件送给Web浏览器 System.out.println(filename+"requested."); outstream.println("HTTP/1.0200OK"); outstream.println("MIME_version:1.0"); outstream.println("Content_Type:text/html"); intlen=(int)file.length(); outstream.println("Content_Length:"+len); outstream.println(""); sendfile(outstream,file);//发送文件 outstream.flush(); }else{//文件不存在时 Stringnotfound="<html><head><title>NotFound</title></head><body><h1>Error404-filenotfound</h1></body></html>"; outstream.println("HTTP/1.0404nofound"); while(true){ client=server.accept();//接受客户机的连接请求 newConnectionThread(client,i).start(); i++; } }catch(Exceptione){ System.out.println(e);}}}3实验软硬件环境eclipseWindowsxpIE浏览器 4实验步骤(1)连接:Web浏览器与Web服务器建立连接,打开一个称为socket(套接字)的虚拟文件,此文件的建立标志着连接建立成功。(2)请求:Web浏览器通过socket向Web服务器提交请求。HTTP的请求一般是GET或POST命令(POST用于FORM参数的传递)。GET命令的格式为:GET路径/文件名HTTP/1.1文件名指出所访问的文件,HTTP/1.1指出Web浏览器使用的HTTP版本。(3)应答:Web浏览器提交请求后,通过HTTP协议传送给Web服务器。Web服务器接到后,进行事务处理,处理结果又通过HTTP传回给Web浏览器,从而在Web浏览器上显示出所请求的页面。为了告知Web浏览器传送内容的类型,Web服务器首先传送一些HTTP头信息,然后传送具体内容(即HTTP体信息),HTTP头信息和HTTP体信息之间用一个空行分开。(4)关闭连接:当应答结束后,Web浏览器与Web服务器必须断开,以保证其它Web浏览器能够与Web服务器建立连接。5实验心得Java中实现多线程有两种途径:继承Thread类或者实现Runnable接口。此处使用了接口的方式生成线程,因为接口可以实现多继承,况且Runnable只有一个run方法,很适合继承。在使用Thread的时候只需继承Thread,并且new一个实例出来,调用start()方法即可以启动一个线程。在本次试验中,通过用java语言开发一个多线程的web服务器,能并行服务于多个请求,来掌握套接字编程技术,了解并运用http协议的作用原理,实现多线程web服务器设计。6参考文献:,1计算机网络:自顶向下方法(原书第4版)/(美)库罗斯(Kurose,J.F.)等著;陈鸣译--北京:机械工业出版社,2008.122java从入门到精通:李钟尉,马文强,陈丹丹等编著;--清华大学出版社,2008.93实验指导书邮件客户机1实验目的: 为发送者提供一个图形界面,其中包含:发送电子邮件地址、接受者电子邮件地址、邮件主题和本身。开发一个Internet上的使用STMP协议的网络服务器的邮件客户端,在WindowsXP,Windows7系统下,使用JAVA语言开发,并最终运行该程序。2实验部分代码及截图:在发件人框中填写相应的信息,点击发送按钮即可向目标邮箱发送邮件。publicclassMailMessage{ publicstaticvoidmain(String[]args){ EventQueue.invokeLater(newRunnable(){ publicvoidrun(){ try{ SendFrameframe=newSendFrame(); frame.setVisible(true); }catch(Exceptione){ e.printStackTrace();} /** *Createtheframe. */ publicSendFrame(){ thisFrame=this; setTitle("JavaMailclient"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100,100,450,328); contentPane=newJPanel(); contentPane.setBorder(newEmptyBorder(5,5,5,5)); setContentPane(contentPane); contentPane.setLayout(null); JLabellblFrom=newJLabel("from:"); lblFrom.setBounds(10,10,54,22); contentPane.add(lblFrom); JLabellblTo=newJLabel("To:"); lblTo.setBounds(10,42,42,22); contentPane.add(lblTo); JLabellblSubject=newJLabel("Subject:"); lblSubject.setBounds(10,74,54,22); contentPane.add(lblSubject); txt_From=newJTextField(); txt_From.setEditable(false); txt_From.setText("1025674623@"); txt_From.setBounds(49,11,383,21); contentPane.add(txt_From); txt_From.setColumns(10); txt_To=newJTextField(); txt_To.setText("1025674623@"); txt_To.setColumns(10); txt_To.setBounds(49,42,383,21); contentPane.add(txt_To); text_Subject=newJTextField(); text_Subject.setText("作业2:邮件客户机"); text_Subject.setColumns(10); text_Subject.setBounds(66,73,366,21); contentPane.add(text_Subject); JLabellblMassage=newJLabel("Massage:"); lblMassage.setBounds(10,101,64,15); contentPane.add(lblMassage); JButtonbtnQuit=newJButton("Quit"); btnQuit.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEvente){ thisFrame.dispose(); } }); btnQuit.setBounds(295,271,137,23); contentPane.add(btnQuit); JScrollPanescrollPane=newJScrollPane(); scrollPane.setBounds(10,229,422,-101); contentPane.add(scrollPane); Panelpanel=newPanel(); panel.setBounds(10,115,422,156); contentPane.add(panel); panel.setLayout(null); ScrollPanescrollPane_1=newScrollPane(); scrollPane_1.setBounds(0,0,422,156); panel.add(scrollPane_1); finalTextAreaSend_TextArea=newTextArea(); Send_TextArea.setText("你好!这是一封测试邮件"); Send_TextArea.setBounds(0,0,440,170); scrollPane_1.add(Send_TextArea); JButtonbtnSend=newJButton("Send"); btnSend.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEvente){ Stringtxtfrom=txt_From.getText(); Stringtxtto=txt_To.getText(); Stringtxtsubject=text_Subject.getText(); Stringsendtextarea=Send_TextArea.getText(); try{ MailMessagemessage=newMailMessage(); message.setFrom(txtfrom);//发件人 message.setTo(txtto);//收件人 Stringserver="";//邮件服务器 message.setSubject(txtsubject);//邮件主题 message.setContent(sendtextarea);//邮件内容 message.setDatafrom(txtfrom);//发件人,在邮件的发件人栏目中显示 message.setDatato(txtto);//收件人,在邮件的收件人栏目中显示 message.setUser("1025674623");//登陆邮箱的用户名 message.setPassword("zjr*******(保密)");//登陆邮箱的密码 SendFramesmtp=newSendFrame(server,25); booleanflag; flag=smtp.sendMail(message,server); if(flag){ JOptionPane.showMessageDialog(null,"信息已成功发送!","提示",JOptionPane.INFORMATION_MESSAGE); } else{ JOptionPane.showMessageDialog(null,"邮件发送失败!","提示",JOptionPane.INFORMATION_MESSAGE); } //System.out.println("iuhfihulaeihba"); }catch(UnknownHostExceptione1){ //TODOAuto-generatedcatchblock e1.printStackTrace(); }catch(IOExceptione1){ //TODOAuto-generatedcatchblock e1.printStackTrace(); } // JOptionPane.showMessageDialog(null,"信息已成功发送!","提示",JOptionPane.INFORMATION_MESSAGE);// System.out.println(txtfrom+"\n"+txtto+"\n"+txtsubject+"\n"+sendtextarea); } }); btnSend.setBounds(10,271,144,23); contentPane.add(btnSend); JButtonbtnClear=newJButton("Clear"); btnClear.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEvente){ txt_To.setText(""); text_Subject.setText(""); Send_TextArea.setText(""); JOptionPane.showMessageDialog(null,"信息删除成功!","提示",JOptionPane.INFORMATION_MESSAGE); } }); btnClear.setBounds(149,271,150,23); contentPane.add(btnClear); } privatebooleandebug=true; BASE64Encoderencode=newBASE64Encoder();//用于加密后发送用户名和密码 privateSocketsocket; publicSendFrame(Stringserver,intport)throwsUnknownHostException,IOException{ try{ socket=newSocket(server,25); }catch(SocketExceptione){// System.out.println(e.getMessage()); }catch(Exceptione){ e.printStackTrace(); }finally{// System.out.println("已经建立连接!"); } } //注册到邮件服务器 publicvoidhelo(Stringserver,BufferedReaderin,BufferedWriterout)throwsIOException{ intresult; result=getResult(in); //连接上邮件服务后,服务器给出220应答 if(result!=220){ thrownewIOException("连接服务器失败"); } result=sendServer("HELO"+server,in,out); //HELO命令成功后返回250 if(result!=250) { thrownewIOException("注册邮件服务器失败!"); } } privateintsendServer(Stringstr,BufferedReaderin,BufferedWriterout)throwsIOException{ out.write(str); out.newLine(); out.flush(); if(debug) {// System.out.println("已发送命令:"+str); } returngetResult(in); } publicintgetResult(BufferedReaderin){ Stringline=""; try{ line=in.readLine(); if(debug){// System.out.println("服务器返回状态:"+line); } }catch(Exceptione){ e.printStackTrace(); } //从服务器返回消息中读出状态码,将其转换成整数返回 StringTokenizerst=newStringTokenizer(line,""); returnInteger.parseInt(st.nextToken()); } publicvoidauthLogin(MailMessagemessage,BufferedReaderin,BufferedWriterout)throwsIOException{ intresult; result=sendServer("AUTHLOGIN",in,out); if(result!=334){ thrownewIOException("用户验证失败!"); } result=sendServer(encode.encode(message.getUser().getBytes()),in,out); if(result!=334){ thrownewIOException("用户名错误!"); } result=sendServer(encode.encode(message.getPassword().getBytes()),in,out); if(result!=235){ thrownewIOException("验证失败!"); } } //开始发送消息,邮件源地址 publicvoidmailfrom(Stringsource,BufferedReaderin,BufferedWriterout)throwsIOException{ intresult; result=sendServer("MAILFROM:<"+source+">",in,out); if(result!=250){ thrownewIOException("指定源地址错误"); } } //设置邮件收件人 publicvoidrcpt(Stringtouchman,BufferedReaderin,BufferedWriterout)throwsIOException{ intresult; result=sendServer("RCPTTO:<"+touchman+">",in,out); if(result!=250){ thrownewIOException("指定目的地址错误!"); } } //邮件体 //退出 publicvoidquit(BufferedReaderin,BufferedWriterout)throwsIOException{ intresult; result=sendServer("QUIT",in,out); } //发送邮件主程序 publicbooleansendMail(MailMessagemessage,Stringserver){ try{ BufferedReaderin=newBufferedReader(newInputStreamReader(socket.getInputStream())); BufferedWriterout=newBufferedWriter(newOutputStreamWriter(socket.getOutputStream())); helo(server,in,out);//HELO命令 authLogin(message,in,ou
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 茶叶研学旅行课程设计
- 2024年心理咨询师题库实验班
- 2025年度个人企业股权转让与经营管理合同4篇
- 2004年四川资阳中考满分作文《考试》2
- 2025年度特色餐饮店厨师团队承包与市场拓展合同3篇
- 2025年度人工智能辅助医疗诊断系统开发合同6篇
- 2025年度厨具安全检测与维修保养服务合同范本3篇
- 2025年度个人反担保协议范本:高新技术企业投资领域专用3篇
- 二零二五年度新型生物识别门禁系统采购合同4篇
- 顺酐吸收塔课程设计
- GB/T 3953-2024电工圆铜线
- 粮油储藏技术规范课件
- 人教版小学数学一年级上册20以内口算天天练试题全套
- 技术服务补充协议范本
- 促进自然分娩资料课件
- 人际风格的类型
- 医院科室宣传方案
- 药物外渗和渗出的预防和处理
- 高压变频器培训教材
- 立式气液分离器计算
- 发电机停电故障应急预案
评论
0/150
提交评论