- 浏览: 220542 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
kandari:
很全,收藏
oracle相关知识 -
若见三生石:
,辛苦楼主!感谢为大伙敏捷开发做出贡献!
Oracle中的二进制、八进制、十进制、十六进制相互转换函数 -
若见三生石:
你好,要定义的类和类型怎么写呢?
Oracle中的二进制、八进制、十进制、十六进制相互转换函数 -
greatwqs:
...
PLSQL操作文件 -
sun17921:
var areaCode ={11:"北京" ...
身份证验证JS
WWW是以Internet作为传输媒介的一个应用系统,WWW网上最基本的传输单位是Web网页。WWW的工作基于客户机/服务器计算模型,由Web 浏览器(客户机)和Web服务器(服务器)构成,两者之间采用超文本传送协议(HTTP)进行通信。HTTP协议是基于TCP/IP协议之上的协议,是Web浏览器和Web服务器之间的应用层协议,是通用的、无状态的、面向对象的协议。HTTP协议的作用原理包括四个步骤:
(1) 连接:Web浏览器与Web服务器建立连接,打开一个称为socket(套接字)的虚拟文件,此文件的建立标志着连接建立成功。
(2) 请求:Web浏览器通过socket向Web服务器提交请求。HTTP的请求一般是GET或POST命令(POST用于FORM参数的传递)。GET命令的格式为:
GET 路径/文件名 HTTP/1.0
文件名指出所访问的文件,HTTP/1.0指出Web浏览器使用的HTTP版本。
(3) 应答:Web浏览器提交请求后,通过HTTP协议传送给Web服务器。Web服务器接到后,进行事务处理,处理结果又通过HTTP传回给Web浏览器,从而在Web浏览器上显示出所请求的页面。
例:假设客户机与www.mycompany.com:8080/mydir/index.html建立了连接,就会发送GET命令:GET /mydir/index.html HTTP/1.0。主机名为www.mycompany.com的Web服务器从它的文档空间中搜索子目录mydir的文件index.html。如果找到该文件,Web服务器把该文件内容传送给相应的Web浏览器。
为了告知 Web浏览器传送内容的类型,Web服务器首先传送一些HTTP头信息,然后传送具体内容(即HTTP体信息),HTTP头信息和HTTP体信息之间用一个空行分开。
常用的HTTP头信息有:
① HTTP 1.0 200 OK
这是Web服务器应答的第一行,列出服务器正在运行的HTTP版本号和应答代码。代码"200 OK"表示请求完成。
② MIME_Version:1.0
它指示MIME类型的版本。
③ content_type:类型
这个头信息非常重要,它指示HTTP体信息的MIME类型。如:content_type:text/html指示传送的数据是HTML文档。
④ content_length:长度值
它指示HTTP体信息的长度(字节)。
(4) 关闭连接:当应答结束后,Web浏览器与Web服务器必须断开,以保证其它Web浏览器能够与Web服务器建立连接。
二、Java实现Web服务器功能的程序设计
根据上述HTTP协议的作用原理,实现GET请求的Web服务器程序的方法如下:
(1) 创建ServerSocket类对象,监听端口8080。这是为了区别于HTTP的标准TCP/IP端口80而取的;
(2) 等待、接受客户机连接到端口8080,得到与客户机连接的socket;
(3) 创建与socket字相关联的输入流instream和输出流outstream;
(4) 从与socket关联的输入流instream中读取一行客户机提交的请求信息,请求信息的格式为:GET 路径/文件名 HTTP/1.0
(5) 从请求信息中获取请求类型。如果请求类型是GET,则从请求信息中获取所访问的HTML文件名。没有HTML文件名时,则以index.html作为文件名;
(6) 如果HTML文件存在,则打开HTML文件,把HTTP头信息和HTML文件内容通过socket传回给Web浏览器,然后关闭文件。否则发送错误信息给Web浏览器;
(7) 关闭与相应Web浏览器连接的socket字。
下面的程序是根据上述方法编写的、可实现多线程的Web服务器,以保证多个客户机能同时与该Web服务器连接。
程序1:WebServer.java文件
// WebServer.java 用JAVA编写Web服务器
import java.io.*; import java.net.*; public class WebServer { public static void main(String args[]) { int i=1, PORT=8080; ServerSocket server=null; Socket client=null; try { server=new ServerSocket(PORT); System.out.println("Web Server is listening on port "+server.getLocalPort()); for (;;) { client=server.accept(); // 接受客户机的连接请求 new ConnectionThread(client,i).start(); i++; } } catch (Exception e) {System.out.println(e);} } } /* ConnnectionThread类完成与一个Web浏览器的通信 */ class ConnectionThread extends Thread { Socket client; // 连接Web浏览器的socket字 int counter; // 计数器 public ConnectionThread(Socket cl,int c) { client=cl; counter=c; } public void run() // 线程体 { try { String destIP=client.getInetAddress().toString(); // 客户机IP地址 int destport=client.getPort(); // 客户机端口号 System.out.println("Connection "+counter+":connected to "+destIP+" on port "+destport+"."); PrintStream outstream=new PrintStream(client.getOutputStream()); DataInputStream instream=new DataInputStream(client.getInputStream()); String inline=instream.readLine(); // 读取Web浏览器提交的请求信息 System.out.println("Received:"+inline); if (getrequest(inline)) { // 如果是GET请求 String filename=getfilename(inline); File file=new File(filename); if (file.exists()) { // 若文件存在,则将文件送给Web浏览器 System.out.println(filename+" requested."); outstream.println("HTTP/1.0 200 OK"); outstream.println("MIME_version:1.0"); outstream.println("Content_Type:text/html"); int len=(int)file.length(); outstream.println("Content_Length:"+len); outstream.println(""); sendfile(outstream,file); // 发送文件 outstream.flush(); } else { // 文件不存在时 String notfound="<html><head><title>Not Found</title></head> <body><h1>Error 404-file not found</h1></body></html>"; outstream.println("HTTP/1.0 404 no found"); outstream.println("Content_Type:text/html"); outstream.println("Content_Length:"+notfound.length()+2); outstream.println(""); outstream.println(notfound); outstream.flush(); } } long m1=1; while (m1<11100000) {m1++;} // 延时 client.close(); } catch (IOException e) { System.out.println("Exception:"+e); } } /* 获取请求类型是否为"GET" */ boolean getrequest(String s) { if (s.length()>0) { if (s.substring(0,3).equalsIgnoreCase("GET")) return true; } return false; } /* 获取要访问的文件名 */ String getfilename(String s) { String f=s.substring(s.indexOf(' ')+1); f=f.substring(0,f.indexOf(' ')); try { if (f.charAt(0)=='/') f=f.substring(1); } catch (StringIndexOutOfBoundsException e) { System.out.println("Exception:"+e); } if (f.equals("")) f="index.html"; return f; } /*把指定文件发送给Web浏览器 */ void sendfile(PrintStream outs,File file) { try { DataInputStream in=new DataInputStream(new FileInputStream(file)); int len=(int)file.length(); byte buf[]=new byte[len]; in.readFully(buf); outs.write(buf,0,len); outs.flush(); in.close(); } catch (Exception e) { System.out.println("Error retrieving file."); System.exit(1); } } }
程序中的ConnectionThread线程子类用来分析一个Web浏览器提交的请求,并将应答信息传回给Web浏览器。其中,getrequest()方法用来检测客户的请求是否为"GET";getfilename(s)方法是从客户请求信息s中获取要访问的HTML文件名;sendfile()方法把指定文件内容通过socket传回给Web浏览器。
对上述程序的getrequest()方法和相关部分作修改,也能对POST请求进行处理。
三、运行实例
为了测试上述程序的正确性,将编译后的WebServer.class、ConnectionThread.class和下面的index.html文件置于网络的某台主机的同一目录中(如:主机NT40SRV的C:\JWEB目录)。
程序2:index.html文件
<HTML> <HEAD> <META HTTP-EQUIV="Content-Type" content="text/html; charset=gb_2312-80"> <TITLE>Java Web服务器</TITLE> </HEAD> <BODY> <h3>这是用JAVA写出的WEB服务器主页</h3> 1998年8月28日 <hr> </BODY> </HTML>
首先在该主机上用java命令运行WebServer.class:
C:\jweb>java webserver
然后在客户机运行浏览器软件,在URL处输入WebServer程序所属的URL地址(如:http://nt40srv:8080/index.html),就在浏览器窗口显示出指定的HTML文档。
注意,不能缺省端口号8080,如缺省,则运行该主机的正常WEB服务器。
说明,不具备网络条件的可在安装了Windows 95的单机上进行测试,方法是用localhost或127.0.0.1代替URL地址的域名部分,即URL地址为http://localhost:8080。
评论
这句怎么有错啊?
发表评论
-
spring事件驱动
2014-03-07 00:53 584http://jinnianshilongnian.ite ... -
Java NIO API
2012-02-23 08:52 904http://www.blogjava.net/1985198 ... -
Threadlocal提供一个独立的变量副本
2012-02-21 14:15 1156ThreadLocal是解决线程安全问题一个很好的思 ... -
MD5 Base64
2012-02-03 11:09 1096哈希函数:MD5,SHA 是没有密钥的,相当与指纹的概念,因此 ... -
HTTP详细描述
2012-02-01 09:00 793原文:http://www.cnblogs.com ... -
include与jsp:include区别
2012-02-01 08:58 898一:执行时间上: <%@ include fi ... -
Java深复制与浅复制&Clone
2011-07-21 09:42 803http://zzqrj.iteye.com/blog/572 ... -
session与cookie
2010-04-23 14:32 726一、cookie机制和session机制的区别 具体来说 ... -
OGNL“valueStack”
2009-12-30 16:21 958详细例子:http://www.iteye.com/wiki/ ... -
servlet单实例多线程
2009-12-23 22:36 2007一,servlet容器如何同时处理多个请求。 Servlet ... -
JDBC事务、JTA事务
2009-12-23 22:27 1443一般情况下,J2EE应用服务器支持JDBC事务、JTA事务、容 ... -
forword的redirect属性
2009-12-23 20:57 1750Forward高, Redirect低, 因为Redirec ... -
JDBC连接数据库
2009-12-23 18:21 763使用JDBC连接数据库的步骤如下: (1)首先要在应用程序中 ... -
final和static
2009-12-23 18:05 1138一、final 根据程序上下 ... -
log4j详述
2009-12-18 10:09 665http://www.iteye.com/topic/3780 ... -
java文件上传(Cos和FileUpload和SmartUpload)
2009-12-15 21:28 3480SmartUpload上传专题:http://thousa ... -
IS08583报文协议(理论)
2009-12-12 17:11 1229单纯的讲IS08583 ... -
Socket上的实时交流
2009-12-12 14:59 1494第一步 充分理解Socket 1.什么是socket ... -
socket理论
2009-12-12 14:22 8921.什么是socket 所谓socket ... -
JKD1.5的多线程启动socket实例
2009-12-11 10:17 1058import java.io.*; import java. ...
相关推荐
java socket使用加密协议传输对象
java socket通信自定义消息协议,socket以字节码的方式通信传递,客户端与服务器端分别进行转换与解析的过程实现简单的消息协议。
java socket 实现SMTP协议 发送邮件.docx
java socket教程java socket教程java socket教程
JAVA Socket教程 Java网络编程之传输控制协议 Socket套接字—Java套接字编程
java socket client 断线重连的简单实现 有什么意见可以提哦
Java Socket 聊天通信演示代码 Java Socket 聊天通信演示代码
javac Server.java java.exe Server 查看说明 可以简单得到http请求头 便于分析http
Java Socket 编程基于 TCP/IP 协议,使用 Socket 类来实现网络通信。 Socket 类是 Java 语言中用于实现网络通信的类,提供了许多方法来实现网络通信。 在 Java 中,Socket 编程的原理是基于客户端/服务器架构的。...
java socket 学习资料java socket 学习资料java socket 学习资料java socket 学习资料java socket 学习资料
采用JAVA的socket实现http协议,模拟浏览器访问服务端。
java 用socket 下载http 网页, 供参考, 其精髓是socket和http头部报文
java socket源码解析 java socket源码解析 java socket源码解析 java socket源码解析
1. 纯Java实现的HTTP下载客户端,不借助任何第三方库 2. 可以任意类型文件下载 3. 基于JAVA Socket编程 4. 演示了SwingUI如何通过Model更新View 5. 下载以后双击Jar就可以运行
Java Socket编程.pdf Java Socket编程.pdf Java Socket编程.pdf
Java Socket编程 PC端程序 用来传输文件 包括服务器、客户端
1. 满足具有Socket客户端需求的基本应用. 2. 满足具有Socket服务端的基本应用. 具备并发能力, 能满足可设定个数客户端连接. 参考个人博客: http://blog.csdn.net/ostrichmyself/article/details/6618349
用JAVA实现的文件上传,控制台输入,保存到数据库