首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 网页制作-> 心得技巧
Java的网络编程:用Java实现Web服务器-JSP教程,Java技巧及代码
作者:网友供稿 点击:590
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 
超文本传输协议(http)是位于tcp/ip 协议的应用层,是最广为人知的协议,也是互连网中最核心的协议之一,同样,http 也是基于 c/s 或 b/s 模型实现的。事实上,我们使用的浏览器如netscape 或ie 是实现http 协议中的客户端,而一些常用的web 服务器软件如apache、iis 和iplanet web server 等是实现http 协议中的服务器端。web 页由服务端资源定位,传输到浏览器,经过浏览器的解释后,被客户所看到。

web 的工作基于客户机/服务器计算模型,由web 浏览器(客户机)和web服务器(服务器)构成,两者之间采用超文本传送协议(http)进行通信。http协议是web浏览器和web服务器之间的应用层协议,是通用的、无状态的、面向对象的协议。

一个完整的http协议会话过程包括四个步骤:

◆ 连接,web浏览器与web服务器建立连接,打开一个称为socket(套接字)的虚拟文件,此文件的建立标志着连接建立成功;

◆ 请求,web浏览器通过socket向web服务器提交请求。http的请求一般是get或post命令(post用于form参数的传递);

◆ 应答,web浏览器提交请求后,通过http协议传送给web服务器。web服务器接到后,进行事务处理,处理结果又通过http传回给web浏览器,从而在web浏览器上显示出所请求的页面;

◆ 关闭连接,应答结束后web浏览器与web服务器必须断开,以保证其它web浏览器能够与web服务器建立连接。



java实现web服务器功能的程序设计


编程思路

根据上述http协议的会话过程,本实例中实现了get请求的web服务器程序的方法,方法如下:

通过创建serversocket 类对象,侦听用户指定的端口(为8080),等待并接受客户机请求到端口。创建与socket相关联的输入流和输出流,然后读取客户机的请求信息。若请求类型是get,则从请求信息中获取所访问的html 文件名;如果html 文件存在,则打开html 文件,把http 头信息和html 文件内容通过socket 传回给web浏览器,然后关闭文件,否则发送错误信息给web 浏览器。最后关闭与相应web 浏览器连接的socket。

用java编写web服务器httpserver.java文件的源代码如下:

//httpserver.java
import java.net.*;
import java.io.*;
import java.util.*;
import java.lang.*;
public class httpserver{
public static void main(string args[]) {
int port;
serversocket server_socket;
//读取服务器端口号
try {
port = integer.parseint(args[0]);
}
catch (exception e) {
port = 8080;
}
try {
//监听服务器端口,等待连接请求
server_socket = new serversocket(port);
system.out.println("httpserver running on port " +
server_socket.getlocalport());
//显示启动信息
while(true) {
socket socket = server_socket.accept();
system.out.println("new connection accepted " +
socket.getinetaddress() +
":" + socket.getport());
//创建分线程
try {
httprequesthandler request =
new httprequesthandler(socket);
thread thread = new thread(request);
//启动线程
thread.start();
}
catch(exception e) {
system.out.println(e);
}
}
}
catch (ioexception e) {
system.out.println(e);
}
}
}
class httprequesthandler implements runnable
{
final static string crlf = "\r\n";
socket socket;
inputstream input;
outputstream output;
bufferedreader br;
// 构造方法
public httprequesthandler(socket socket) throws exception
{
this.socket = socket;
this.input = socket.getinputstream();
this.output = socket.getoutputstream();
this.br =
new bufferedreader(new inputstreamreader(socket.getinputstream()));
}
// 实现runnable 接口的run()方法
public void run()
{
try {
processrequest();
}
catch(exception e) {
system.out.println(e);
}
}
private void processrequest() throws exception
{
while(true) {
//读取并显示web 浏览器提交的请求信息
string headerline = br.readline();
system.out.println("the client request is "+headerline);
if(headerline.equals(crlf) || headerline.equals("")) break;
stringtokenizer s = new stringtokenizer(headerline);
string temp = s.nexttoken();
if(temp.equals("get")) {
string filename = s.nexttoken();
filename = "." + filename ;
// 打开所请求的文件
fileinputstream fis = null ;
boolean fileexists = true ;
try
{
fis = new fileinputstream( filename ) ;
}
catch ( filenotfoundexception e )
{
fileexists = false ;
}
// 完成回应消息
string serverline = "server: a simple java httpserver";
string statusline = null;
string contenttypeline = null;
string entitybody = null;
string contentlengthline = "error";
if ( fileexists )
{
statusline = "http/1.0 200 ok" + crlf ;
contenttypeline = "content-type: " +
contenttype( filename ) + crlf ;
contentlengthline = "content-length: "
+ (new integer(fis.available())).tostring()
+ crlf;
}
else
{
statusline = "http/1.0 404 not found" + crlf ;
contenttypeline = "text/html" ;
entitybody = "<html>" +
"<head><title>404 not found</title></head>" +
"<body>404 not found"
+"<br>usage:http://yourhostname:port/"
+"filename.html</body></html>" ;
}
// 发送到服务器信息
output.write(statusline.getbytes());
output.write(serverline.getbytes());
output.write(contenttypeline.getbytes());
output.write(contentlengthline.getbytes());
output.write(crlf.getbytes());
// 发送信息内容
if (fileexists)
{
sendbytes(fis, output) ;
fis.close();
}
else
{
output.write(entitybody.getbytes());
}
}
}
//关闭套接字和流
try {
output.close();
br.close();
socket.close();
}
catch(exception e) {}
}
private static void sendbytes(fileinputstream fis, outputstream os)
throws exception
{
// 创建一个 1k buffer
byte[] buffer = new byte[1024] ;
int bytes = 0 ;
// 将文件输出到套接字输出流中
while ((bytes = fis.read(buffer)) != -1 )
{
os.write(buffer, 0, bytes);
}
}
private static string contenttype(string filename)
{
if (filename.endswith(".htm") || filename.endswith(".html"))
{
return "text/html";
}

return "filename";
}
}



编程技巧说明

◆ 主线程设计

主线程的设计就是在主线程httpserver 类中实现了服务器端口的侦听,服务器接受一个客户端请求之后创建一个线程实例处理请求,代码如下:

import java.net.*;
import java.io.*;
import java.util.*;
import java.lang.*;
public class httpserver{
public static void main(string args[]) {
port;
serversocket server_socket;
//读取服务器端口号
try {
port = integer.parseint(args[0]);
}
catch (exception e) {
port = 8080;
}
try {
//监听服务器端口,等待连接请求
server_socket = new serversocket(port);
system.out.println("httpserver running on port "
+server_socket.getlocalport());
..........
..........



◆ 连接处理分线程设计

在分线程httprequesthandler 类中实现了http 协议的处理,这个类实现了runnable 接口,代码如下:

class httprequesthandler implements runnable
{
final static string crlf = "\r\n";
socket socket;
inputstream input;
outputstream output;
bufferedreader br;
// 构造方法
public httprequesthandler(socket socket) throws exception
{
this.socket = socket;
//得到输入输出流
this.input = socket.getinputstream();
this.output = socket.getoutputstream();
this.br =
new bufferedreader(new inputstreamreader(socket.getinputstream()));
}

// 实现runnable 接口的run()方法
public void run()
{
try {
processrequest();
}
catch(exception e) {
system.out.println(e);
}
}



◆ 构建processrequest()方法来处理信息的接收和发送

作为实现runnable 接口的主要内容,在run()方法中调用processrequest()方法来处理客户请求内容的接收和服务器返回信息的发送,代码如下:

private void processrequest() throws exception
{
while(true) {
//读取并显示web 浏览器提交的请求信息
string headerline = br.readline();
system.out.println("the client request is "+ headerline);
if(headerline.equals(crlf) || headerline.equals("")) break;
//根据请求字符串中的空格拆分客户请求
stringtokenizer s = new stringtokenizer(headerline);
string temp = s.nexttoken();
if(temp.equals("get")) {
string filename = s.nexttoken();
filename = "." + filename ;
.............
.............



在processrequest()方法中得到客户端请求后,利用一个stringtokenizer 类完成了字符串的拆分,这个类可以实现根据字符串中指定的分隔符(缺省为空格)将字符串拆分成为字串的功能。利用nexttoken()方法依次得到这些字串;sendbytes()方法完成信息内容的发送,contenttype()方法用于判断文件的类型。

显示web页面

显示 web 页面的index.html 文件代码如下:

<html>
<head>
<meta http-equiv="content-language" content="zh-cn">
<meta name="generator" content="microsoft frontpage 5.0">
<meta http-equiv="content-type" content="text/html; charset=gb2312">
<title>java web 服务器</title>
</head>
<body>
<p>********* <font color="#ff0000">欢迎你的到来!</font>*********</p>
<p>这是一个用 java 语言实现的 web 服务器</p>
<hr>
</body>
</html>




运行实例


为了测试上述程序的正确性,将编译后的httpserver.class、httprequesthandler.class和上面的index.html文件置于网络的某台主机的同一目录中。

首先运行服务器程序 java httpserver 8080,服务器程序运行后显示端口信息“httpserver runing on port 8080”, 然后在浏览器的地址栏中输入http://localhost:8080/index.html,就可以正确显示网页,同时在显示“httpserver runing on port 8080 ”窗口中服务器会出现一些信息。
文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·Java 调用存储过程-JSP教程,Java技巧及代码
·JSP中文乱码问题的解决.-JSP教程,Java技巧及代码
·Java的网络编程:用Java实现Web服务器-JSP教程,Java技巧及代码
·asp.net连接Access数据库-.NET教程,Asp.Net开发
·VC++.NET 2005 几个比较难缠的问题及其解决方法-.NET教程,.NET Framework
·DropDownList 控件 DataTextField 和 DataValueField 分开绑定-ASP教程,数据库相关
·.Net PetShop 4.0的分布式数据库设计-.NET教程,.NET Framework
·用Asp.net实现新闻分页-.NET教程,Asp.Net开发
·在.NET 2.0 中发送Email-.NET教程,E-mail专题
·逆变桥功率开关管门极关断箝位电路
最新文章
·经典收藏:网页页面常用的特殊符号_心得技巧教程
·用html和css写出漂亮正规的blog_心得技巧教程
·用photoshop优化美眉照片的眼部特写_photoshop教程
·网站页面的均衡规划与选择_心得技巧教程
·关闭远程差分压缩给windows vista拷贝提速_windows vista
·谈google广告的单价与点击-smart_网赚技巧
·用photoshop消除照片中的杂色条纹_photoshop教程
·一个网友观点:两年以来使用div排版的经验_心得技巧教程
·开始使用google adsense_google推广
·google官方讲解noindex、nofollow、noarchive及nosnippet等meta标签用法_google推广
相关主题
  • java的前世今生_java认证
  • java的“精华”就在“面向对象思想”_java认证
  • Java的文件操作--2(Zip文件释放)-JSP教程,Java技巧及代码
  • Java的文件操作--1-JSP教程,Java技巧及代码
  • Java的中文编程与配置心得-JSP教程,Java技巧及代码
  • 西部数码虚拟主机

    友情链接
    CNNIC 西部数码
    万网 自助建站
    虚拟主机 asp空间
    域名注册 域名
    域名申请 主页空间
    论坛空间 网站空间
    国际域名 虚拟空间
    空间租用 DDOS防火墙
    成都主机托管 四川主机托管
    主机租用 服务器租用
    网站目录 自助建站
    虚拟主机 网址大全
    软件下载
    自助链接
    虚拟主机资讯 特价虚拟主机
    版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
    关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
    发表评论 打印  刷新     关闭