ssd8Exercise1.docx
- 文档编号:30499546
- 上传时间:2023-08-16
- 格式:DOCX
- 页数:21
- 大小:20.36KB
ssd8Exercise1.docx
《ssd8Exercise1.docx》由会员分享,可在线阅读,更多相关《ssd8Exercise1.docx(21页珍藏版)》请在冰豆网上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ssd8Exercise1