week4: send file & checksum

    จากใน week 3 เราสามารถที่จะส่งข้อความหากันระหว่าง client และ server โดยใช้ socket ใน TCP เป็นช่องทางในการสื่อสารได้แล้ว และเพิ่มให้สามารถ ส่งภาษาไทย ข้าม OS และ ข้าม Programming Language ได้สำเร็จเช่น คราวนี้เราจะมาเพิ่มความสามารถของโปรแกรมต่อ โดยมีเงื่อนไขเพิ่มเติมดังนี้

  • send file (text, pdf, multimedia)
  • checksum
  • find API document for functions/methods used in your program

Send file in Java
    ในการส่งไฟล์หากันระหว่างโปรแกรมนั้น คือการที่ให้ Sender ทำการเปิดไฟล์และอ่านข้อมูลในไฟล์ออกมา แล้วส่งข้อมูลที่อ่านได้ออกไปหา Reciever ผ่าน socket Reciever ก็จะต้องทำการสร้างไฟล์หรือเปิดไฟล์ขึ้นมาเพื่อที่จะทำการเขียนไฟล์ที่ได้รับจาก socket เมื่อ Reciever ได้รับข้อมูลและเขียนไฟล์เสร็จแล้วก็จะเสร็จเสร็จการส่งไฟล์
    ซึ่งใน Java จะมี Library ชื่อ FileInputSteam และ FileOutputSteam ที่จะช่วยเราในการอ่านไฟล์และเขียนไฟล์

  • เริ่มจากฝั่ง Sender (array byte buffer)
    1. คือการสร้าง Object ของไฟล์ ใน Path ที่เราระบุไว้ อย่างในตัวอย่างนี้คือรูปชื่อ Capture.PNG
    2. สร้าง FileInputSteam เพื่อจะทำการอ่านไฟล์
    3. สร้าง Buffer ขึ้นมาขนาดเท่ากับ จำนวน data byte
    4. อ่านไฟล์แล้วเก็บ data เอาไว้ใน buffer
    5. ส่ง data ที่อยู่ใน buffer ออกไปหา Reciever ด้วย Socket outputSteam
    6. แสดงข้อความเพื่อบอกว่าการส่งไฟล์เสร็จสิ้น
  • ฝั่ง Reciever (array byte buffer)
    1. สร้าง Object ของไฟล์ ใน Path ที่เราระบุไว้ อย่างในตัวอย่างนี้คือรูปชื่อ Write.PNG
    2. สร้าง FileOutputSteam เพื่อจะทำการเขียนไฟล์
    3. ตรวจสอบว่าไฟล์ที่มีชื่อใน Path มีอยู่แล้วหรือไม่ ถ้ายังไม่มีให้สร้างไฟล์นั้นขึ้นใหม่
    4. สร้าง Buffer ขึ้นมาขนาดเท่ากับ จำนวน data byte
    5. อ่าน data จากใน Socket ที่ Sender ส่งมาและ เก็บเอาไว้ใน Buffer
    6. เขียน data ที่อยู่ใน Buffer ลงในไฟล์
    7. เป็นการการันตีให้แน่ใจว่าข้อมูลใน Buffer จะถูกเขียนลงไฟล์ทั้งหมด
    8. ปิด FileOutputSteam เพื่อสิ้นสุดการเขียน
    9. แสดงข้อความเพื่อบอกว่าการเขียนไฟล์เสร็จสิ้น
Result (send file with array byte buffer)
  • สามารถส่งไฟล์ txt กับ รูปภาพขนาดเล็กได้ 
  • แต่ไม่สามารถส่งไฟล์ที่มีขนาดใหญ่ได้ เนื่องจาก buffer มีขนาดจำกัด 
  • ไฟล์ที่ส่งกับไฟล์ที่รับมามี md5 checksum ที่ไม่ตรงกันและไม่สามารถเปิดไฟล์ได้ 
Solution
  • เราจึงเปลี่ยนรูปแบบการส่งข้อมูล จากการอ่าน file เก็บไว้ใน buffer เป็นการอ่านค่าจากไฟล์ทีละ byte แล้วส่งออกไปผ่านทาง socket จาก Sender ไปหา Reciever แทน
  • เริ่มจากฝั่ง Sender (1-byte)
    1. สร้าง Object ของไฟล์ ใน Path ที่เราระบุไว้ อย่างในตัวอย่างนี้คือรูปชื่อ Capture.PNG
    2. สร้าง FileInputSteam เพื่อจะทำการอ่านไฟล์
    3. วน loop เพื่ออ่าน data จากไฟล์ มาทีละ byte แล้วส่ง ออกไปหา Reciever  ด้วย Socket outputSteam เมื่ออ่านไฟล์จนครบ fis.read() จะ return -1 และออกจาก loop while 
    4. แสดงข้อความเพื่อบอกว่าการส่งไฟล์เสร็จสิ้น
  • ฝั่ง Reciever (1-byte)
    1. สร้าง Object ของไฟล์ ใน Path ที่เราระบุไว้ อย่างในตัวอย่างนี้คือรูปชื่อ Write.PNG
    2. สร้าง FileOutputSteam เพื่อจะทำการเขียนไฟล์
    3. ตรวจสอบว่าไฟล์ที่มีชื่อใน Path มีอยู่แล้วหรือไม่ ถ้ายังไม่มีให้สร้างไฟล์นั้นขึ้นใหม่
    4. วนลูป while เพื่ออ่าน byte data จาก Socket ทีละ byte จนครบ in.read() จะ return -1 แล้วออกจาก loop while
    5. เขียน data ลงในไฟล์ 
    6. เป็นการการันตีให้แน่ใจว่าข้อมูลจะถูกเขียนลงไฟล์ทั้งหมด
    7. ปิด FileOutputSteam เพื่อสิ้นสุดการเขียน
    8. แสดงข้อความเพื่อบอกว่าการเขียนไฟล์เสร็จสิ้น
Result (send file with 1-byte)
  • สามารถ send file (text, pdf, multimedia) ได้ตามวัตถุประสงค์
















MD5 Checksum in Java
    checksum md5 เป็นระบบที่ใช้ตรวจสอบความถูกต้องของ file โดยทั่วไปก็จะเห็นได้จาก โปรแกรมที่เป็น Open Source ต่างๆ ที่จะมีตัวเลขที่เป็น checksum md5 แสดงเอาไว้ก่อนที่จะให้ทำการ download โปรแกรมที่ download มานั้นถ้ามี checksum md5 ตรงกับที่แจ้งไว้ก็จะมั่นใจเรื่องความสมบูรณ์ของไฟล์ได้

เราจะใช้ Library Apache Commons Codec 1.10 ในการการ MD5 Checksum ของไฟล์ที่เราจะใช้ส่งโดยจะหา MD5 ทั้งในส่วนของ Sender และ Receiever และนำมาเปรียบเทียบกันว่าตรงกันหรือไม่

Set Up
  1. Download Apache Commons Codec 1.10 จาก http://commons.apache.org/
  2. จะได้ไฟล์ตามนี้
  3. ทำการ Set Class Path in Java


Code



  1. สร้าง FileInputSteam เพื่อจะทำการอ่านไฟล์ จาก Path ที่เราระบุไว้ 
  2. คำนวนหา md5Hex ค่าออกมาเป็น String 
  3. ปิด FileInputSteam เพื่อสิ้นสุดการอ่าน
  4. แสดงค่า MD5 ที่คำนวนได้

Result MD5 










Java Summary
    เราสามารถที่จะส่งไฟล์หากัน ระหว่าง Client และ Server ได้ โดยส่งได้ทั้งไฟล์แบบ text, photo, pdf, docx และสามารถหาค่า MD5 Checksum เพื่อตอบสอบความสมบูรณ์ของไฟล์ที่ส่งและไฟล์ที่ได้รับ และนำ API Document มาช่วยในการอธิบายส่วนของ Code เพื่อให้สามารถทำความเข้าใจได้ดียิ่งขึ้น ซึ่งทั้งหมดนี้บรรลุวัตถุประสงค์ที่เราได้ระบุเอาไว้ในส่วนต้น

...................................................................................................................................................................


Send file in C++

C++ Client Behavior


  1. เปิดไฟล์
  2. หาขนาดของไฟล์
  3. ส่งขนาด Buffer
  4. ส่งข้อมูลไปทีละ Byte จะหมด
  5. ปิดไฟล์


C++ Server Behavior


  1. รอการเชื่อมต่อ
  2. ได้รับการเชื่อมต่อ
  3. นำ ชื่อไฟล์เเละขนาดไฟล์มาเก็บในตัวเเปร
  4. สร้างไฟล์ขึ้นมาใหม่
  5. เขียนข้อมูลลงไฟล์
  6. รีเซ็ต Buffer


File Transfer Experiment

  • นำไฟล์ Multimedia มาทำการส่งระหว่าง Host กับ Server
  • ตัวอย่างไฟล์ PDF , JPG
  • ทำการส่งไฟล์จาก Client Side ไปยัง Server Side

Experiment File


Experiment Result

  • ส่งไฟล์ JPG ไปยัง Client Side
  • ส่งไฟล์ PDF ไปยัง Server Side

Check MD5 Using C++ Program
  • ทำการตรวจสอบค่า md5 ของไฟล์ต้นทางเเละปลายทางว่ามีค่าเท่ากันไหม

Check MD5 Result

  • ค่า md5 ของไฟล์ JPG ที่ Client Side
  • ค่า md5 ของไฟล์ JPG ที่ Server Side
  • ค่า md5 ของไฟล์ PDF ที่ Client Side
  • ค่า md5 ของไฟล์ PDF ที่ Server Side

C++ Summary
  • สามารถส่งไฟล์ระหว่าง Host ได้
  • ไฟล์ที่ทำการส่งสามารถเปิดได้
  • ไฟล์ที่ทำการส่งมีค่า md5 ที่เหมือนกัน

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

week5: XML Intro What/Why/How & Continue from w4

week 1: connect and send data between program

week6: XML Schema & XML Parser