最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java編程利用socket多線程訪問服務(wù)器文件代碼示例

 更新時間:2017年10月24日 11:21:18   作者:ysk_xh_521  
這篇文章主要介紹了Java編程利用socket多線程訪問服務(wù)器文件代碼示例,具有一定參考價值,需要的朋友可以了解下。

這篇文章將向大家展示Java編程利用socket多線程訪問服務(wù)器文件代碼示例,如果您想先了解Java多線程socket編程的基礎(chǔ)知識,可以看下這篇文章:Java多線程編程實現(xiàn)socket通信示例代碼。

接下來進入正文,我們看看利用socket多線程訪問服務(wù)器代碼:

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相應(yīng)規(guī)則返回數(shù)據(jù)給瀏覽器的,
    // http響應(yīng)規(guī)則中可能既要寫字符又要寫字節(jié) 所以使用這個流
    try {
      // 2 賦值,為try catch語句塊外面的變量賦值
      ServerSocket serverSocket = new ServerSocket(7878);
      while (true) {
        while (start) {
          System.out.println("服務(wù)端已啟動,等待客戶端連接。。");
          Socket socket = serverSocket.accept();
          System.out.println("客戶端已連接");
          Thread thread = new ServerThread(socket);
          thread.start();
        }
        // 3 處理請求,即從socket中拿出瀏覽器按照http協(xié)議封裝好的請求(字符串)
        // 關(guān)心請求行
        // 按照空格拆分字符串,拆出來的第一部分是請求方式
        // 拆出來的第二部分是資源路徑
        // 4 處理響應(yīng)
        // 如果 請求方式 是GET即代表沒有請求體
        // 從請求行中尋找到要訪問的文件
        // 從本地目錄下查找(不是遍歷整個文件系統(tǒng)
        // 代表著我們要定義一個目錄位置,此位置為數(shù)據(jù)倉庫,
        // 專門來存放客戶端可能會訪問的數(shù)據(jù)
        // 咱們暫定這個目錄為“項目/files”)
        // 看看是否有此文件,對于/ 資源特殊處理,代表
        // 如果有文件,利用輸出流,把數(shù)據(jù)拼成http響應(yīng)格式的數(shù)據(jù),
        // 返回給客戶端(數(shù)據(jù)找到了,響應(yīng)碼200)
        // 如果沒有文件,返還error.html文件(代表比較友好的提示方式),
        // 也得按照http響應(yīng)格式返還error.html
      }
      // 如果是post方式,暫不處理
    } catch (Exception e) {
    }
  }
  // 關(guān)閉資源
  // 什么時候關(guān)服務(wù)器,什么時候關(guān)客戶端
}

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 {
  // 和本線程相關(guān)的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) {
          // 找到文件,以字節(jié)方式去讀
          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("該目錄下對象個數(shù):" + 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);
      }
    }
  }
}

總結(jié)

以上就是本文關(guān)于Java編程利用socket多線程訪問服務(wù)器文件代碼示例的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:Java網(wǎng)絡(luò)編程基礎(chǔ)篇之單向通信、Java多線程編程安全退出線程方法介紹等,有什么問題,歡迎大家留言交流討論,感謝朋友們對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • log4j的Appenders配置方法

    log4j的Appenders配置方法

    下面小編就為大家?guī)硪黄猯og4j的Appenders配置方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • spring本地事務(wù)失效的原因分析

    spring本地事務(wù)失效的原因分析

    這篇文章給大家介紹了spring本地事務(wù)失效的情況原因分析,給大家羅列了五種原因分析,通過代碼示例介紹的非常詳細(xì),具有一定的參考價值,需要的朋友可以參考下
    2023-10-10
  • java常見事件響應(yīng)方法實例匯總

    java常見事件響應(yīng)方法實例匯總

    這篇文章主要介紹了java常見事件響應(yīng)方法,對于初學(xué)者有很好的參考借鑒價值,分享給大家,需要的朋友可以參考下
    2014-08-08
  • spring boot ajax跨域的兩種方式

    spring boot ajax跨域的兩種方式

    java語言在多數(shù)時,會作為一個后端語言,為前端的php,node.js等提供API接口。這篇文章主要介紹了spring boot ajax跨域的兩種方式,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-05-05
  • Java并發(fā)源碼分析ConcurrentHashMap線程集合

    Java并發(fā)源碼分析ConcurrentHashMap線程集合

    這篇文章主要為大家介紹了Java并發(fā)源碼分析ConcurrentHashMap線程集合,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • Spring設(shè)計模式中代理模式詳細(xì)講解

    Spring設(shè)計模式中代理模式詳細(xì)講解

    如何實現(xiàn)在不修改源碼的基礎(chǔ)上實現(xiàn)代碼功能的增強呢?spring為我們提供了代理模式。所謂的代理模式通俗來說就是一個中介,它給某一個對象提供一個代理對象,并由代理對象控制原對象的引用,從而實現(xiàn)在不修改源碼的基礎(chǔ)上實現(xiàn)代碼功能的增強
    2023-01-01
  • mybatis plus怎么忽略映射字段

    mybatis plus怎么忽略映射字段

    這篇文章主要介紹了mybatis plus怎么忽略映射字段,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Springboot多環(huán)境開發(fā)及使用方法

    Springboot多環(huán)境開發(fā)及使用方法

    這篇文章主要介紹了Springboot多環(huán)境開發(fā)及多環(huán)境設(shè)置使用、多環(huán)境分組管理的相關(guān)知識,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • SpringBoot項目中使用AOP的方法

    SpringBoot項目中使用AOP的方法

    本篇文章主要介紹了SpringBoot項目中使用AOP的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • Mybatis Plus select 實現(xiàn)只查詢部分字段

    Mybatis Plus select 實現(xiàn)只查詢部分字段

    這篇文章主要介紹了Mybatis Plus select 實現(xiàn)只查詢部分字段的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評論

武穴市| 旬阳县| 湘阴县| 和龙市| 花莲市| 平邑县| 南华县| 南华县| 石棉县| 华容县| 北海市| 北海市| 五指山市| 肥乡县| 达拉特旗| 丽江市| 青川县| 泗阳县| 旬邑县| 桑日县| 华容县| 关岭| 黔西县| 南丰县| 江城| 英德市| 东宁县| 开阳县| 中西区| 百色市| 滨海县| 莱西市| 宜阳县| 海阳市| 明溪县| 嘉禾县| 拉孜县| 仁寿县| 随州市| 湘潭市| 铜陵市|