package number;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.lang.Thread;
import java.util.StringTokenizer;
public class TCPServer {
public static void main(String[] args) {
int port;
ServerSocket ss;
try{
port=Integer.parseInt(args[0]);
}catch(Exception e){
port=8080;
}
try{
//监听服务器端口,等待连接请求
ss=new ServerSocket(port);
System.out.println("TCPServer running on port:"+ss.getLocalPort());
//显示启动信息
while(true){
Socket socket=ss.accept();
System.out.println("New connection accepted"+socket.getInetAddress()+":"+socket.getPort());
//创建分线程
try{
httpRequestHandle request=new httpRequestHandle(socket);
Thread thread = new Thread(request);
//启动线程
thread.start();
}catch(Exception e){
System.out.println(e);
}
}
}catch(Exception e){
System.out.println(e);
}
}
}
class httpRequestHandle implements Runnable {
final static String CRLF="\r\n";
Socket socket;
InputStream input;
OutputStream output;
BufferedReader br;
//构造方法
public httpRequestHandle(Socket socket)throws Exception{
this.socket=socket;
this.input=socket.getInputStream();
this.output=socket.getOutputStream();
this.br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
}
//实现Runnale接口的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) {
System.out.println(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";
}
}
分享到:
相关推荐
基于HTTP协议的web服务器,NetBean下开发
通过本实验,使学生能够进一步理解 HTTP 协议的技术细节以及 WEB 服务器的实现原理
Java Socket编程实现的简单多线程WEB服务器
无论你是经验丰富的网络开发人员、Java程序员新手,还是只希望对Java网络编程稍有些了解的人,都会发现《Java编程(第三版)》将成为你的书库中一个重要的部分。一旦开始使用Java网络API,只要你能想到它就能够做...
实验的目的: 1) 掌握Java Socket编程应用; 2) 阅读HTTP协议相关规范; 3) 基于Java Socket构建简单的HTTP的客户端和服务器; 4) 构建支持并发的HTTP服务器。
用java语言实现了最简单的web服务器,供大家参考!
《Java网络编程》(第3版)有很多示例,包含了几千行可以实际工作的代码(所有代码都可以在线获得),实现了功能完整的网络客户端和服务器。无论是希望编写特殊用途的Web服务器、安全的在线订单接收程序、简单的组播...
bupt Java网络编程大作业 支持Markdown的静态Web服务器
Java自己写的简单web文件服务器,有详细注释,实现简单的文件服务器交互功能,实现TCP多线程连接和UDP传输文件,适合Java网络编程初学者参考
《Java网络编程》第三版会为你介绍Java网络API的最新特性。本书讨论了JDK1.4和1.5(现在已命名为J2SE5)中所做的所有修改和增补。本书内容全面,涵盖了从网络基础知识到远程方法调用(RMI)等各方面的内容,书中章节...
本书第1-3章介绍了网络进程通信的主要技术。其中,第1章介绍网络进程通信的基础类...本书可作为高校计算机应用、网络信息、电子商务技术等专业级学生及研究生的教材,也可以作为Java网络编程爱好者的自学参考书。
JavaWweb开发入门,主要介绍了WEB开发相关的知识、常见的web服务器、Java Web应用等
无论你是经验丰富的网络开发人员、Java程序员新手,还是只希望对Java网络编程稍有些了解的人,都会发现《Java编程(第三版)》将成为你的书库中一个重要的部分。一旦开始使用Java网络API,只要你能想到它就能够做...
《Java网络编程(第三版)》会为你介绍Java网络API的最新特性。...无论是希望编写特殊用途的Web服务器、安全的在线订单接收程序、简单的组播代理还是电子邮件客户端,都会找到可供学习和借用的代码。
该压缩包是计算机网络课程的实验——多线程Web服务器的设计与实现,里面内容很全,也有文档描述怎样操作,代码的注释很清晰,傻瓜式的,有java编程基础的一看就会
本书主要描述java web 以及服务器的开发。内容覆盖XML、EJB、JDBC、JNDC等设计理论
web服务器编程代码 包括源代码 HttpServer.java;Request.java;Response.java
第5章 Java Servlet中的网络编程 5. 1 Java套接字网络编程 5. 1. 1 InetAddress类 5. 1. 2 Socket类 5. 1. 3 给手机发送网上短信息 5. 2 Java网络编程中的高层类 5. 2. 1 URL类 5. 2. 2 URLConnection类 第6...
《Java WebSocket编程 开发、部署和保护动态Web应用》一书由Java WebSocket编程权威专家撰写,提供了实际的开发策略和详尽的示例应用。本书诠释了如何设计客户端/服务器应用、与全双工消息通信协作、建立连接、创建...