Java编程利用socket多线程访问服务器文件代码示例
这篇文章将向大家展示Java编程利用socket多线程访问服务器文件代码示例,如果您想先了解Java多线程socket编程的基础知识,可以看下这篇文章:Java多线程编程实现socket通信示例代码。
接下来进入正文,我们看看利用socket多线程访问服务器代码:
ServerMain.java
packagecom.ysk.webServer;
importjava.io.File;
importjava.io.IOException;
importjava.net.ServerSocket;
importjava.net.Socket;
publicclassServerMain{
staticbooleanstart=true;
publicstaticvoidmain(String[]args){
//1.声明所用的对象
//ServerSocket
//Socket
//BufferedReader
//PrintStream因为这个流是用来按照http相应规则返回数据给浏览器的,
//http响应规则中可能既要写字符又要写字节所以使用这个流
try{
//2赋值,为trycatch语句块外面的变量赋值
ServerSocketserverSocket=newServerSocket(7878);
while(true){
while(start){
System.out.println("服务端已启动,等待客户端连接。。");
Socketsocket=serverSocket.accept();
System.out.println("客户端已连接");
Threadthread=newServerThread(socket);
thread.start();
}
//3处理请求,即从socket中拿出浏览器按照http协议封装好的请求(字符串)
//关心请求行
//按照空格拆分字符串,拆出来的第一部分是请求方式
//拆出来的第二部分是资源路径
//4处理响应
//如果请求方式是GET即代表没有请求体
//从请求行中寻找到要访问的文件
//从本地目录下查找(不是遍历整个文件系统
//代表着我们要定义一个目录位置,此位置为数据仓库,
//专门来存放客户端可能会访问的数据
//咱们暂定这个目录为“项目/files”)
//看看是否有此文件,对于/资源特殊处理,代表
//如果有文件,利用输出流,把数据拼成http响应格式的数据,
//返回给客户端(数据找到了,响应码200)
//如果没有文件,返还error.html文件(代表比较友好的提示方式),
//也得按照http响应格式返还error.html
}
//如果是post方式,暂不处理
}catch(Exceptione){
}
}
//关闭资源
//什么时候关服务器,什么时候关客户端
}
ServerThread.java
packagecom.ysk.webServer;
importjava.io.BufferedReader;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.IOException;
importjava.io.InputStreamReader;
importjava.io.PrintStream;
importjava.net.Socket;
publicclassServerThreadextendsThread{
//和本线程相关的Socket
Socketsocket=null;
BufferedReaderin=null;
BufferedReaderinerror=null;
PrintStreamout=null;
staticbooleanresult=false;
staticStringfilepath="";
publicServerThread(Socketsocket){
this.socket=socket;
}
@Override
publicvoidrun(){
try{
in=newBufferedReader(newInputStreamReader(socket.getInputStream()));
Stringtemp=in.readLine();
if(temp!=null){
ServerMain.start=false;
Stringmethod=temp.split("")[0];
System.out.println(method);
Stringfilename=temp.split("")[1].replaceAll("/","");
System.out.println(filename);
Stringpath="files";
findFile(path,filename);
System.out.println("result:"+result);
if(result){
//找到文件,以字节方式去读
Stringresource=filepath+filename;
getResource(resource);
}else{
//返回error.html
Stringresource="files\\error.html";
getResource(resource);
}
}
}catch(Exceptione){
}finally{
try{
if(out!=null)
out.close();
if(inerror!=null)
inerror.close();
if(in!=null)
in.close();
if(socket!=null)
socket.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
//通过流去读文件
privatevoidgetResource(Stringresource){
try{
FileInputStreamfileInputStream=newFileInputStream(resource);
out=newPrintStream(socket.getOutputStream(),true);
out.println("HTTP/1.1200ok");
out.println();
intinttemp;
while((inttemp=fileInputStream.read())!=-1){
out.write(inttemp);
}
out.flush();
fileInputStream.close();
ServerMain.start=true;
result=false;
}catch(Exceptione){
}
}
//查找文件
privatestaticvoidfindFile(Stringpath,Stringfilename)throwsIOException{
Filefile=newFile(path);
File[]tempList=file.listFiles();
System.out.println("该目录下对象个数:"+tempList.length);
for(inti=0;i
总结
以上就是本文关于Java编程利用socket多线程访问服务器文件代码示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:Java网络编程基础篇之单向通信、Java多线程编程安全退出线程方法介绍等,有什么问题,欢迎大家留言交流讨论,感谢朋友们对毛票票网站的支持!