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多线程编程安全退出线程方法介绍等,有什么问题,欢迎大家留言交流讨论,感谢朋友们对毛票票网站的支持!