Java编程利用socket多线程访问服务器文件代码示例

 更新时间:2017年10月24日 11:21:18   作者:ysk_xh_521  
这篇文章主要介绍了Java编程利用socket多线程访问服务器文件代码示例,具有一定参考价值,需要的朋友可以了解下。

这篇文章将向大家展示Java编程利用socket多线程访问服务器文件代码示例,如果您想先了解Java多线程socket编程的基础知识,可以看下这篇文章:Java多线程编程实现socket通信示例代码

接下来进入正文,我们看看利用socket多线程访问服务器代码:

ServerMain.java

package com.ysk.webServer;
import java.io.File;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerMain {
  static boolean start = true;
  public static void main(String[] args) {
    // 1.声明所用的对象
    // ServerSocket
    // Socket
    // BufferedReader
    // PrintStream 因为这个流是用来按照http相应规则返回数据给浏览器的,
    // http响应规则中可能既要写字符又要写字节 所以使用这个流
    try {
      // 2 赋值,为try catch语句块外面的变量赋值
      ServerSocket serverSocket = new ServerSocket(7878);
      while (true) {
        while (start) {
          System.out.println("服务端已启动,等待客户端连接。。");
          Socket socket = serverSocket.accept();
          System.out.println("客户端已连接");
          Thread thread = new ServerThread(socket);
          thread.start();
        }
        // 3 处理请求,即从socket中拿出浏览器按照http协议封装好的请求(字符串)
        // 关心请求行
        // 按照空格拆分字符串,拆出来的第一部分是请求方式
        // 拆出来的第二部分是资源路径
        // 4 处理响应
        // 如果 请求方式 是GET即代表没有请求体
        // 从请求行中寻找到要访问的文件
        // 从本地目录下查找(不是遍历整个文件系统
        // 代表着我们要定义一个目录位置,此位置为数据仓库,
        // 专门来存放客户端可能会访问的数据
        // 咱们暂定这个目录为“项目/files”)
        // 看看是否有此文件,对于/ 资源特殊处理,代表
        // 如果有文件,利用输出流,把数据拼成http响应格式的数据,
        // 返回给客户端(数据找到了,响应码200)
        // 如果没有文件,返还error.html文件(代表比较友好的提示方式),
        // 也得按照http响应格式返还error.html
      }
      // 如果是post方式,暂不处理
    } catch (Exception e) {
    }
  }
  // 关闭资源
  // 什么时候关服务器,什么时候关客户端
}

ServerThread.java

package com.ysk.webServer;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
public class ServerThread extends Thread {
  // 和本线程相关的Socket
  Socket socket = null;
  BufferedReader in = null;
  BufferedReader inerror = null;
  PrintStream out = null;
  static boolean result = false;
  static String filepath = "";
  public ServerThread(Socket socket) {
    this.socket = socket;
  }
  @Override
  public void run() {
    try {
      in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
      String temp = in.readLine();
      if (temp != null) {
        ServerMain.start = false;
        String method = temp.split(" ")[0];
        System.out.println(method);
        String filename = temp.split(" ")[1].replaceAll("/", "");
        System.out.println(filename);
        String path = "files";
        findFile(path, filename);
        System.out.println("result:" + result);
        if (result) {
          // 找到文件,以字节方式去读
          String resource = filepath + filename;
          getResource(resource);
        } else {
          // 返回error.html
          String resource = "files\\error.html";
          getResource(resource);
        }
      }
    } catch (Exception e) {
    } finally {
      try {
        if (out != null)
          out.close();
        if (inerror != null)
          inerror.close();
        if (in != null)
          in.close();
        if (socket != null)
          socket.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }
//通过流去读文件
  private void getResource(String resource) {
    try {
      FileInputStream fileInputStream = new FileInputStream(resource);
      out = new PrintStream(socket.getOutputStream(), true);
      out.println("HTTP/1.1 200 ok");
      out.println();
      int inttemp;
      while ((inttemp = fileInputStream.read()) != -1) {
        out.write(inttemp);
      }
      out.flush();
      fileInputStream.close();
      ServerMain.start = true;
      result = false;
    } catch (Exception e) {
    }
  }
  // 查找文件
  private static void findFile(String path, String filename) throws IOException {
    File file = new File(path);
    File[] tempList = file.listFiles();
    System.out.println("该目录下对象个数:" + tempList.length);
    for (int i = 0; i < tempList.length; i++) {
      if (tempList[i].isFile() && filename.equals(tempList[i].getName())) {
        System.out.println("已找到该文件:" + filename);
        filepath = path + "\\";
        result = true;
      } else if (tempList[i].isDirectory()) {
        // 读取某个文件夹下的所有文件夹
        System.out.println("读取某个文件夹下的所有文件夹");
        findFile(tempList[i].getParent() + "\\" + tempList[i].getName(), filename);
      }
    }
  }
}

总结

以上就是本文关于Java编程利用socket多线程访问服务器文件代码示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:Java网络编程基础篇之单向通信Java多线程编程安全退出线程方法介绍等,有什么问题,欢迎大家留言交流讨论,感谢朋友们对脚本之家网站的支持!

相关文章

  • Spring bean 四种注入方式详解

    Spring bean 四种注入方式详解

    这篇文章主要介绍了Spring bean的实例化和IOC依赖注入详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-07-07
  • Java如何实现URL带请求参数(get/post)及得到get和post请求url和参数列表的方法

    Java如何实现URL带请求参数(get/post)及得到get和post请求url和参数列表的方法

    本文给大家介绍Java如何实现URL带请求参数(get/post)及得到get和post请求url和参数列表的方法,涉及到 java获取post请求参数的方法,感兴趣的朋友一起看看吧
    2015-10-10
  • java 如何将图片按照原尺寸比例存入word中

    java 如何将图片按照原尺寸比例存入word中

    这篇文章主要介绍了java 如何将图片按照原尺寸比例存入word中的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • JavaSE、JavaEE和JavaWeb三大工程目录详解

    JavaSE、JavaEE和JavaWeb三大工程目录详解

    这篇文章主要给大家介绍了关于JavaSE、JavaEE和JavaWeb三大工程目录的相关资料,很多对java不是很了解的同学在看到课程⼤纲的时候发现⾥⾯出现了JavaSE、JavaEE、JavaME、JavaWEB这些词,搞得⼀头雾⽔,需要的朋友可以参考下
    2023-07-07
  • JVM的垃圾回收机制真是通俗易懂

    JVM的垃圾回收机制真是通俗易懂

    这篇文章主要为大家详细介绍了JVM的垃圾回收机制,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • java开发MyBatis中常用plus实体类注解符详解

    java开发MyBatis中常用plus实体类注解符详解

    这篇文章主要为大家介绍了java开发MyBatis常用的plus实体类注解符示例应用详解有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-10-10
  • 并发编程之Java内存模型顺序一致性

    并发编程之Java内存模型顺序一致性

    这篇文章主要介绍了并发编程Java内存模型顺序一致性,顺序一致性内存模型是一个理论参考模型,处理器的内存模型和编程语言的内存模型都会以顺序一致性内存模型作为参照,下面我们一起进入文章看看学校内容,需要的朋友可以参考一下
    2021-11-11
  • idea之Recompile、Rebuild和Build之间的区别及说明

    idea之Recompile、Rebuild和Build之间的区别及说明

    这篇文章主要介绍了idea之Recompile、Rebuild和Build之间的区别及说明,具有很好的参考价值,希望对有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • Java设计模式之备忘录模式使用详解

    Java设计模式之备忘录模式使用详解

    这篇文章主要介绍了Java设计模式中备忘录模式的使用,备忘录设计模式也叫作快照模式,主要用于实现防丢失、撤销、恢复等功能,本文将通过示例为大家讲解备忘录模式的定义与使用,需要的同学可以参考一下
    2024-02-02
  • Java 十大排序算法之冒泡排序刨析

    Java 十大排序算法之冒泡排序刨析

    冒泡排序是一种简单的排序算法,它也是一种稳定排序算法。其实现原理是重复扫描待排序序列,并比较每一对相邻的元素,当该对元素顺序不正确时进行交换。一直重复这个过程,直到没有任何两个相邻元素可以交换,就表明完成了排序
    2021-11-11

最新评论