一 前言
本文是《JDFS:一款分布式文件管理實用程序》系列博客的第二篇,在上一篇博客中,筆者向讀者展示了JDFS的核心功能部分,包括:服務端與客戶端部分的上傳、下載功能的實現,epoll的運用,線程池的運用等。當然目前JDFS還僅僅支持上傳、下載功能,還不具備分布式文件管理的功能,這些都會在后續(xù)的開發(fā)過程中加進來。在寫博客的過程中,筆者發(fā)現最好是每完成一個小的功能就及時用博客記錄下來,如果等功能全部實現完成后再寫博客的話,一方面由于功能點比較多,博客寫起來會比較費力;另一方面由于時間間隔太長,有些有價值的細節(jié)恐怕會忘記。所以最好是增量式寫博客,每實現一個關鍵點的功能,及時用博客記錄下來。本文是在該系列博客第一篇的基礎上做了部分更新升級以及解決一些小bug.當然主要針對的是上傳部分的功能。如果讀者對這篇博客的背景不是太了解的話,請先移步筆者的上一篇博客:點擊我 。
根據上一篇博客我們知道,JDFS的服務端主程序在epoll里面先recv客戶端的數據,然后解析頭部,根據請求類型,把作業(yè)交給線程池來執(zhí)行。對于查詢、下載部分的功能這是沒有問題的,因為查詢、下載部分客服端只是發(fā)送一個頭部過來,服務端接收后解析的過程不會太占用多少時間。而如果是上傳功能的話,服務端recv到的數據不僅包含頭部而且包含客服端期望上傳的文件實體的數據,而筆者的本意是讓線程池來接收數據的,所以這個代碼的實現與筆者的期望是矛盾的。本文首先就會對這一點進行更新改進,使得查詢、上傳、下載都可以并行的被線程池來執(zhí)行。
另外在上一篇博客中,上傳部分的功能代碼比較粗糙,這次也進行了一些更新改進。在筆者測試上傳功能的時候,發(fā)現了一些偶爾出現而且不容易重現的bug,而下載功能目前為止在筆者的測試過程當中還沒有遇到過bug。所以從代碼實現以及測試的過程來看,上傳部分的功能要比下載部分復雜、更難調試。具體代碼實現請移步筆者的github鏈接:點擊我。
PS: 本篇博客是博客園用戶“cs小學生”的原創(chuàng)作品,轉載請注明原作者和原文鏈接,謝謝。
二 上傳功能演示
在上一篇博客中,筆者展示了上傳功能的截圖,但那個只有一個客戶端在向服務端上傳文件,在這里再補充一個同時有兩個客服端向服務端上傳文件的截圖。
在此次的上傳中(使用shell腳本來提交),兩個客服端分別同時向服務端上傳不同的文件:CRLS-en.pdf和CRLS-e.pdf. 圖左半邊是服務端打印的一些信息,我們可以清晰的看到服務端交叉的接收CRLS-e.pdf和CRLS-en.pdf。圖右半邊是客服端打印的一些消息,我們也可以清晰的看到客服端也是交叉上傳兩個文件。服務端最后三次接收是:CRLS-e.pdf、CRLS-en.pdf、CRLS-en.pdf,客服端最后三次上傳的是CRLS-en.pdf、CRLS-e.pdf、CRLS-en.pdf,可見客服端上傳和服務端接收的文件的次序并不是一致的。但是從圖中我們也可以很容易的發(fā)現:對于同一個文件,服務端接收的次序和客服端發(fā)送的次序是一致的。
下圖是服務端接收完成后的截圖:
延伸閱讀
- ssh框架 2016-09-30
- 阿里移動安全 [無線安全]玩轉無線電——不安全的藍牙鎖 2017-07-26
- 消息隊列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 論文筆記【圖片目標分割】 2017-07-26
- 詞向量-LRWE模型-更好地識別反義詞同義詞 2017-07-26
- 從棧不平衡問題 理解 calling convention 2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明 2017-07-26
- Swift實現JSON轉Model - HandyJSON使用講解 2017-07-26
- 阿里移動安全 Android端惡意鎖屏勒索應用分析 2017-07-26
- 集合結合數據結構來看看(二) 2017-07-26