先说要求吧:
用Java语言开发一个多线程的Web服务器,能并行服务多个请求。
存在一个主线程,服务器使用该主线程监听来自客户机的连接请求。为每一次请求创建一个TCP连接(非持久连接),并用一个单独的线程来处理该连接。 在浏览器中测试该服务器,使用如下URL:
http://localhost:6789/index.html
如果index.html文件存在,则服务器将状态行以及文件内容发送给客户端,并在客户端的浏览器中显示(可以只考虑文本文件)
如果index.html文件不存在,则服务器返回带有错误信息的状态行和必要的文字说明,并在客户端的浏览器中显示这些信息。我的HTTL文档:index.html<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk">
<title>web服务器</title>
</head>
<body> 你好!这是一个web服务器。<br>
<form action="/index.html">
<br> 姓名:<input type="text" name="name" /><br>
密码:<input type="password" name="pass"></input><br>
<input type="submit"/>
</form>
</body>
</html> 我的程序:
package websocket;
import java.io.*;
import java.net.*;
import java.util.StringTokenizer;public class webSocket
{
public static void main(String[] args) throws Exception
{
String reqmessage;
String filename;
ServerSocket welcimeSocket = new ServerSocket(6789);
Socket serverSocket = welcimeSocket.accept();
BufferedReader inFromClient = new BufferedReader(new InputStreamReader(serverSocket.getInputStream()));
DataOutputStream outToClient = new DataOutputStream(serverSocket.getOutputStream());
reqmessage = inFromClient.readLine();
StringTokenizer tokenizerLine = new StringTokenizer(reqmessage);
if(tokenizerLine.nextToken().equals("GET"))
{
filename = tokenizerLine.nextToken();
if(filename.startsWith("/"))
{
filename = filename.substring(1);
}
File file = new File(filename);
if(file.exists())
{
int numOfBytes = (int) file.length();
FileInputStream inFile = new FileInputStream(filename);
byte fileInBytes[] = new byte[numOfBytes];
inFile.read(fileInBytes);
outToClient.writeBytes("HTTP/1.1 202 Accepted \r\n");
outToClient.writeBytes("\r\n");
outToClient.write(fileInBytes,0,numOfBytes);
serverSocket.close();
}
else
{
outToClient.writeBytes("HTTP/1.1 404 Not Found \r\n");
outToClient.writeBytes("\r\n");
serverSocket.close();
}
}
else
{
outToClient.writeBytes("HTTP/1.1 400 Bad Request \r\n");
outToClient.writeBytes("\r\n");
serverSocket.close();
}
}
}运行时没有问题的。但是要求里说了“如果index.html文件不存在,则服务器返回带有错误信息的状态行和必要的文字说明,并在客户端的浏览器中显示这些信息”,我不太懂让客户端的浏览器显示必要的文字说明,请大神指导。还有这里还有一个问题,就是我把outToClient.writeBytes("HTTP/1.1 202 Accepted \r\n");
outToClient.writeBytes("\r\n");给注释掉了,为什么输入正确的网址竟然还响应。按照计算机网络原理HTTP的响应报文的状态行不是没有的么?为什么他还显示正确的内容。注释后的程序:
package websocket;
import java.io.*;
import java.net.*;
import java.util.StringTokenizer;public class webSocket
{
public static void main(String[] args) throws Exception
{
String reqmessage;
String filename;
ServerSocket welcimeSocket = new ServerSocket(6789);
Socket serverSocket = welcimeSocket.accept();
BufferedReader inFromClient = new BufferedReader(new InputStreamReader(serverSocket.getInputStream()));
DataOutputStream outToClient = new DataOutputStream(serverSocket.getOutputStream());
reqmessage = inFromClient.readLine();
StringTokenizer tokenizerLine = new StringTokenizer(reqmessage);
if(tokenizerLine.nextToken().equals("GET"))
{
filename = tokenizerLine.nextToken();
if(filename.startsWith("/"))
{
filename = filename.substring(1);
}
File file = new File(filename);
if(file.exists())
{
int numOfBytes = (int) file.length();
FileInputStream inFile = new FileInputStream(filename);
byte fileInBytes[] = new byte[numOfBytes];
inFile.read(fileInBytes);
//outToClient.writeBytes("HTTP/1.1 202 Accepted \r\n");
//outToClient.writeBytes("\r\n");
outToClient.write(fileInBytes,0,numOfBytes);
serverSocket.close();
}
else
{
outToClient.writeBytes("HTTP/1.1 404 Not Found \r\n");
outToClient.writeBytes("\r\n");
serverSocket.close();
}
}
else
{
outToClient.writeBytes("HTTP/1.1 400 Bad Request \r\n");
outToClient.writeBytes("\r\n");
serverSocket.close();
}
}
}求大神指导,谢谢~~
用Java语言开发一个多线程的Web服务器,能并行服务多个请求。
存在一个主线程,服务器使用该主线程监听来自客户机的连接请求。为每一次请求创建一个TCP连接(非持久连接),并用一个单独的线程来处理该连接。 在浏览器中测试该服务器,使用如下URL:
http://localhost:6789/index.html
如果index.html文件存在,则服务器将状态行以及文件内容发送给客户端,并在客户端的浏览器中显示(可以只考虑文本文件)
如果index.html文件不存在,则服务器返回带有错误信息的状态行和必要的文字说明,并在客户端的浏览器中显示这些信息。我的HTTL文档:index.html<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk">
<title>web服务器</title>
</head>
<body> 你好!这是一个web服务器。<br>
<form action="/index.html">
<br> 姓名:<input type="text" name="name" /><br>
密码:<input type="password" name="pass"></input><br>
<input type="submit"/>
</form>
</body>
</html> 我的程序:
package websocket;
import java.io.*;
import java.net.*;
import java.util.StringTokenizer;public class webSocket
{
public static void main(String[] args) throws Exception
{
String reqmessage;
String filename;
ServerSocket welcimeSocket = new ServerSocket(6789);
Socket serverSocket = welcimeSocket.accept();
BufferedReader inFromClient = new BufferedReader(new InputStreamReader(serverSocket.getInputStream()));
DataOutputStream outToClient = new DataOutputStream(serverSocket.getOutputStream());
reqmessage = inFromClient.readLine();
StringTokenizer tokenizerLine = new StringTokenizer(reqmessage);
if(tokenizerLine.nextToken().equals("GET"))
{
filename = tokenizerLine.nextToken();
if(filename.startsWith("/"))
{
filename = filename.substring(1);
}
File file = new File(filename);
if(file.exists())
{
int numOfBytes = (int) file.length();
FileInputStream inFile = new FileInputStream(filename);
byte fileInBytes[] = new byte[numOfBytes];
inFile.read(fileInBytes);
outToClient.writeBytes("HTTP/1.1 202 Accepted \r\n");
outToClient.writeBytes("\r\n");
outToClient.write(fileInBytes,0,numOfBytes);
serverSocket.close();
}
else
{
outToClient.writeBytes("HTTP/1.1 404 Not Found \r\n");
outToClient.writeBytes("\r\n");
serverSocket.close();
}
}
else
{
outToClient.writeBytes("HTTP/1.1 400 Bad Request \r\n");
outToClient.writeBytes("\r\n");
serverSocket.close();
}
}
}运行时没有问题的。但是要求里说了“如果index.html文件不存在,则服务器返回带有错误信息的状态行和必要的文字说明,并在客户端的浏览器中显示这些信息”,我不太懂让客户端的浏览器显示必要的文字说明,请大神指导。还有这里还有一个问题,就是我把outToClient.writeBytes("HTTP/1.1 202 Accepted \r\n");
outToClient.writeBytes("\r\n");给注释掉了,为什么输入正确的网址竟然还响应。按照计算机网络原理HTTP的响应报文的状态行不是没有的么?为什么他还显示正确的内容。注释后的程序:
package websocket;
import java.io.*;
import java.net.*;
import java.util.StringTokenizer;public class webSocket
{
public static void main(String[] args) throws Exception
{
String reqmessage;
String filename;
ServerSocket welcimeSocket = new ServerSocket(6789);
Socket serverSocket = welcimeSocket.accept();
BufferedReader inFromClient = new BufferedReader(new InputStreamReader(serverSocket.getInputStream()));
DataOutputStream outToClient = new DataOutputStream(serverSocket.getOutputStream());
reqmessage = inFromClient.readLine();
StringTokenizer tokenizerLine = new StringTokenizer(reqmessage);
if(tokenizerLine.nextToken().equals("GET"))
{
filename = tokenizerLine.nextToken();
if(filename.startsWith("/"))
{
filename = filename.substring(1);
}
File file = new File(filename);
if(file.exists())
{
int numOfBytes = (int) file.length();
FileInputStream inFile = new FileInputStream(filename);
byte fileInBytes[] = new byte[numOfBytes];
inFile.read(fileInBytes);
//outToClient.writeBytes("HTTP/1.1 202 Accepted \r\n");
//outToClient.writeBytes("\r\n");
outToClient.write(fileInBytes,0,numOfBytes);
serverSocket.close();
}
else
{
outToClient.writeBytes("HTTP/1.1 404 Not Found \r\n");
outToClient.writeBytes("\r\n");
serverSocket.close();
}
}
else
{
outToClient.writeBytes("HTTP/1.1 400 Bad Request \r\n");
outToClient.writeBytes("\r\n");
serverSocket.close();
}
}
}求大神指导,谢谢~~
解决方案 »
- 安装myeclipse插件jad的问题
- 一个简单的lrc解析器与大家分享
- 菜鸟提问
- 急救...关于内部类方法改变外围类数据的问题。。能解决马上给分。。在线等
- 一个奇怪的现象:我在XP下装了 Jcreator 3.0 LE和J2sdk 1.4.2,没有进行路径设置也可以用!!?
- 关于静态类,为什么可以在接口中定义,如下
- 菜鸟弱问GUI 问题!和Jframe 有关
- java有什么课题可研究,博士论文。
- 谁有JBuilder的注册吗
- 请问网友,现在有人经常提的“事务处理”有能详细讲讲的吗。谢谢了
- JTree的自定义图标有时不显示
- 点击“文件”——“打开”或“保存”,出现一个“请选择文件“或”另存为”的框,不选择文件,然后直接关闭,会抛出空指针异常,这个怎么处理??
那你帮我看看怎样让浏览器显示出必要的文字说明么?假如index.html不存在,怎样让浏览器显示错误信息呢?