利用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);
            }
        }

    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值