ssd8Exercise1.docx

上传人:b****0 文档编号:18353054 上传时间:2023-08-16 格式:DOCX 页数:21 大小:20.36KB
下载 相关 举报
ssd8Exercise1.docx_第1页
第1页 / 共21页
ssd8Exercise1.docx_第2页
第2页 / 共21页
ssd8Exercise1.docx_第3页
第3页 / 共21页
ssd8Exercise1.docx_第4页
第4页 / 共21页
ssd8Exercise1.docx_第5页
第5页 / 共21页
ssd8Exercise1.docx_第6页
第6页 / 共21页
ssd8Exercise1.docx_第7页
第7页 / 共21页
ssd8Exercise1.docx_第8页
第8页 / 共21页
ssd8Exercise1.docx_第9页
第9页 / 共21页
ssd8Exercise1.docx_第10页
第10页 / 共21页
ssd8Exercise1.docx_第11页
第11页 / 共21页
ssd8Exercise1.docx_第12页
第12页 / 共21页
ssd8Exercise1.docx_第13页
第13页 / 共21页
ssd8Exercise1.docx_第14页
第14页 / 共21页
ssd8Exercise1.docx_第15页
第15页 / 共21页
ssd8Exercise1.docx_第16页
第16页 / 共21页
ssd8Exercise1.docx_第17页
第17页 / 共21页
ssd8Exercise1.docx_第18页
第18页 / 共21页
ssd8Exercise1.docx_第19页
第19页 / 共21页
ssd8Exercise1.docx_第20页
第20页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

ssd8Exercise1.docx

《ssd8Exercise1.docx》由会员分享,可在线阅读,更多相关《ssd8Exercise1.docx(21页珍藏版)》请在冰点文库上搜索。

ssd8Exercise1.docx

ssd8Exercise1

Server.java:

//导包

import.*;

importjava.io.*;

importjava.util.*;

publicclassServer{//服务器端

//定义端口

staticprivateintPORT=8000;

//回车换行

staticprivateStringCRLF="\r\n";

//数组大小常量

staticprivateintbuffer_size=99999;

//服务器资源路径

staticFileroot;

/*

获取文件路径,考虑到了各种情况

*/

privatestaticStringgetFileURI(Stringuri){

if(uri.startsWith("")){

returnuri.substring(uri.indexOf('/',8)+1);

}elseif(uri.startsWith("/")){

returnuri.substring

(1);

}elseif(uri.startsWith("")){

returnuri.substring(uri.indexOf('/',8)+1);

}elsereturnuri;

}

//创建一个标准的http协议响应格式

privatestaticStringmakeResponse(intnum,Stringmsg,Stringheader){

return"HTTP/1.0"+""+num+""+msg+CRLF+header+CRLF;

}

//创建MIME类型格式

privatestaticStringgetMIME(Stringtype,intlen){

Stringmm=

"Server:

SimpleServer/1.0"+CRLF+

"Content-type:

"+type+CRLF+

"Content-length:

"+len+CRLF;

returnmm;

}

//出错提示信息

privatestaticStringerror(intcode,Stringmsg){

//构造html页面

Stringhtml_page=""+""+CRLF+

"

"+code+""+msg+"

"+""+""+CRLF;

//把MIME格式加到输出形式里

Stringmh=getMIME("text/html",html_page.length());

//把响应的加入到输出形式里

Stringhr=makeResponse(code,msg,mh);

//返回整个输出形式

returnhr+html_page;

}

//根据文件名得到文件类型

privatestaticStringgetType(Stringfilename){

//判断是否以html/htm结束的文件,并返回string类型

if(filename.endsWith(".html")||filename.endsWith(".htm")){

return"text/html";

}elseif(filename.endsWith(".jpg")||filename.endsWith(".jpeg")){

//判断是否以jpg/jpeg结束的文件,并返回string类型

return"image/jpeg";

//默认text类型

}elsereturn"text";

}

//处理从客户端得到的get指令信息

privatestaticvoidhandleGet(BufferedOutputStreamoutToClient,Stringuri){

try{

Stringfilename=getFileURI(uri);

Filef=newFile(root,filename);

if(!

f.exists()){

outToClient.write((error(404,"Filenotfound")).getBytes());//文件不存在404错误

}else{

//存在时给出输出

Stringtype=getType(f.getName());

Stringheader=getMIME(type,(int)f.length());

Stringresponse=makeResponse(200,"OK",header);

outToClient.write(response.getBytes());

//建立一个输入流

FileInputStreamfstream=newFileInputStream(f);

//创建一个byte数组,用来存放写入的类容

byte[]buffer=newbyte[buffer_size];

//判断是否写完

while(fstream.read(buffer)!

=-1){

outToClient.write(buffer);

}

}

}catch(IOExceptione){

System.out.println(e);

}

}

//处理put指令

privatestaticvoidhandlePut(BufferedReaderinFromClient,

BufferedOutputStreamoutToClient,

Stringuri,intlen){

try{

Stringfilename=getFileURI(uri);

Filef=newFile(root,filename);

Stringreply;

if(f.exists()){

if(!

f.isFile()){

outToClient.write((error(403,"Forbidden")).getBytes());

return;

}else{

reply=error(200,"OK");}

}else{

reply=error(201,"Created");

}

FileOutputStreamfstream=newFileOutputStream(f);

fstream.write(inFromClient.toString().getBytes());

fstream.flush();

fstream.close();

outToClient.write(reply.getBytes());

}catch(IOExceptionioe){

System.out.println(3);

}

}

//main函数

publicstaticvoidmain(String[]args){

//创建一个服务器

ServerSocketserverSocket=null;

//字符数出流

BufferedOutputStreamoutToClient=null;

//字符输入流

BufferedReaderinFromClient=null;

//判断输入的参数是否正确并给出提示

if(args.length!

=1){

System.err.println("Usage:

Server");

return;

}

try{//根据参数,创建服务器资源地址

root=newFile(args[0]);

if(!

root.isDirectory()){//判断资源文件是否存在,或者是否是一个文件夹.

System.err.println

(root.getAbsolutePath()+"doesnotexistorisnotadirectory");

return;

}

}catch(Exceptione){

System.out.println("Exceptionhasoccured!

");

return;

}

//创建一个客户端实例

try{

serverSocket=newServerSocket(PORT);

}catch(Exceptione){

System.out.println("Exceptionhasoccured!

");

}

//服务器和客户端交互

while(true){

try{//客户端与服务器连接

Socketsocket=serverSocket.accept();

try{

//客户端输出流

outToClient=newBufferedOutputStream(socket.getOutputStream());

//服务器输入流

inFromClient=newBufferedReader(newInputStreamReader(socket.getInputStream()));

serverSocket.close();

//关闭

booleaninHeader=true;//循环控制

Stringheader=newString();

Stringtemp;

while(inHeader){

temp=inFromClient.readLine();//从客户端得到信息

if(temp==null)

break;

if(inHeader==true&&temp.length()==0)

inHeader=false;

if(inHeader==true){

header=header+"\n"+temp;

}

}

StringTokenizerst=newStringTokenizer(header);//一个单词一个单词读

Stringmethod=st.nextToken();

Stringuri=st.nextToken();

//判断是否是get/GET

if(method.equals("GET")||method.equals("get")){

{

handleGet(outToClient,uri);

}

}elseif(method.equals("PUT")||method.equals("put")){//PUT/put

intlen=-1;

while(st.hasMoreTokens()){

Stringline=st.nextToken();

if(line.startsWith("Content-Length:

")){

Stringlength=line.substring(line.indexOf("/")+1);

len=length.length();

break;

}

}

if(len>0){

handlePut(inFromClient,outToClient,uri,len);

}else{

//400错误请求

outToClient.write((error(400,"BadRequest.")).getBytes());

serverSocket.close();

}

}else{

serverSocket.close();

outToClient.write((error(501,"NotImplemented")).getBytes());

}

}catch(NoSuchElementExceptione){

System.out.println(e);

}

outToClient.flush();

socket.close();

outToClient.close();

}catch(Exceptione){

System.out.println("失去了和主机的连接。

");//断开连接

break;

}

}

}

}

client.java:

//导入所需要的包

import.*;

importjava.io.*;

//客户端程序

publicclassClient

{

//客户端端口号

privatestaticintPORT=80;

//静态常量用于给数组规定大小

privatestaticintbuffer_size=8192;

//回车换行

privatestaticStringCRLF="\r\n";

//从键盘标准输入到缓存

staticBufferedReaderkeyboard=newBufferedReader(newInputStreamReader(System.in));

//屏幕输出

staticPrintWriterscreen=newPrintWriter(System.out,true);

//主函数

publicstaticvoidmain(String[]args){

try{

//发给服务器的缓存

BufferedOutputStreamoutToServer=null;

//从服务器得到的

BufferedReaderinFromServer=null;

//声明一个有一定大小的数组

byte[]buffer=newbyte[buffer_size];

Stringheader=newString();

Stringbody=newString();

//判断是否正确输入参数

if(args.length!

=1){

System.err.println("Usage:

Client");

System.exit(0);

}

//建立一个客户实例

Socketsocket=newSocket("localhost",8000);

//向屏幕打印

screen.println(args[0]+"islisteningtoyourrequest:

");

//从服务器将客户端要的信息读入

inFromServer=newBufferedReader(newInputStreamReader(socket.getInputStream()));

//把信息写到服务器

outToServer=newBufferedOutputStream(socket.getOutputStream());

//读入键盘输入的信息

Stringrequest=keyboard.readLine();

//确保是以回车换行结束

request+=CRLF+CRLF;

//将键盘输入的信息传给byte数组

buffer=request.getBytes();

//在将此信息传个服务器

outToServer.write(buffer,0,request.length());

//强制写入到服务器

outToServer.flush();

booleaninHeader=true;

Stringtemp;

while(true){//循环控制

temp=inFromServer.readLine();//从服务器读出类容信息

if(temp==null)//判断是否读完

break;

if(inHeader==true&&temp.length()==0)

inHeader=false;

if(inHeader==true)

header=header+"\n"+temp;

else

body=body+"\n"+temp;

}

//打印信息头

screen.println("Header:

\n");

screen.print(header+"\n");

screen.flush();

//保存信息到指定文件

screen.println();

screen.print("Enterthenameofthefiletosave:

\n");

screen.flush();

Stringfilename=keyboard.readLine();

Filef=newFile("C:

\\DocumentsandSettings\\Administrator\\桌面\\"+filename);

FileOutputStreamoutfile=newFileOutputStream(f);

outfile.write(body.getBytes());//往文件写入信息容

screen.println(filename+"默认保存在了桌面上,请查看!

");

outfile.flush();

outfile.close();

socket.close();

outToServer.close();

inFromServer.close();//关闭流

}catch(Exceptione){//出现异常时,给出以下信息

screen.println("对不起,连接失败。

请尝试以下解决方案:

");

screen.println("************************************");

screen.println("**1.查看服务器是否已打开**");

screen.println("**2.查看服务器是否支持多线程服务**");

screen.println("**3.结束已运行的服务,重启服务器**");

screen.println("************************************");

}

}

}

ThreadedServer.java:

import.*;

importjava.io.*;

importjava.util.*;

//实现多线程runnable接口

classHandleimplementsRunnable{

staticprivateStringCRLF="\r\n";

staticprivateintbuffer_size=8192;

staticPrintWriterstdOut=newPrintWriter(System.out,true);

staticFileroot;

Socketsocket;

publicHandle(Sockets,Filer){

//构造方法初始化属性

this.socket=s;

this.root=r;

Threadt=newThread(this,"ServerThread");

t.start();

}

//得到请求的文件名

privatestaticStringgetUriFile(Stringuri){

if(uri.startsWith("")){

returnuri.substring(uri.indexOf('/',8)+1);

}elseif(uri.startsWith("/")){

returnuri.substring

(1);

}elseif(uri.startsWith("/")){

returnuri.substring

(1);

}elsereturnuri;

}

//创建一个标准的http协议响应格式

privatestaticStringmakeResponse(intcode,Stringmsg,Stringheader){

return"HTTP/1.0"+""+code+""+msg+CRLF+header+CRLF;

}

//创建MIME类型格式

privatestaticStringgetMIME(Stringtype,intlen){

Stringmm=

"Server:

SimpleServer/1.0"+CRLF+

"Content-type:

"+type+CRLF+

"Content-length:

"+len+CRLF;

returnmm;

}

//出错提示信息

privatestaticStringerror(intcode,Stringmsg){

//构造html页面

Stringhtml_page=""+""+CRLF+

"

"+code+""+msg+"

"+""+""+CRLF;

//把MIME格式加到输出形式里

Stringmh=getMIME("text/html",html_page.length());

//把响应的加入到输出形式里

Stringhr=makeResponse(code,msg,mh);

//返回整个输出形式

returnhr+html_page;

}

//根据文件名得到文件类型

privatestaticStringgetType(Stringfilename){

//判断是否以html/htm结束的文件,并返回string类型

if(filename.endsWith(".html")||filename.endsWith(".htm")){

return"text/html";

}elseif(filename.endsWith(".jpg")||filename.endsWith(".jpeg")){

//判断是否以jpg/jpeg结束的文件,并返回string类型

return"image/jpeg";

//默认text类型

}elsereturn"text/plain";

}

//处理从客户端得到的get指令信息

privatestaticvoidhandleGet(DataOutputStreamToClient,Stringuri){

try{

//文件不存在404错误

Stringfilename=getUriFile(uri);

Filef=newFile(root,filename);

if(!

f.isFile()){

ToClient.write((error(404,"Filenotfound")).getByt

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2