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

    จากใน week 4 เราสามารถที่จะทำการส่งไฟล์ ระหว่าง client และ server ได้ โดยใช้ TCP Socket ในการส่งไฟล์และทำการ Checksum โดยใช้ MD5 เพื่อตรวจสอบความถูกต้องของไฟล์ว่า ไฟล์ที่ได้รับจาก Sender มีความถูกต้องหรือไม่ คราวนี้เราจะมาเพิ่ม ความสามารถของโปรแกรมต่อ โดยมีเงื่อนไขเพิ่มเติมดังนี้

Continue from w4
  • send large file
  • read file only once
    และจะอธิบายเพื่อทำความรู้จักกับ XML และจะนำตัวอย่างข้อมูลที่ได้ทำการร่างไว้ใน Week 4 มาเขียนให้อยู่ในรูป XML  

XML - What/Why/How

  • using sample data about singer/albums/songs


วันจันทร์ที่ 4 กันยายน พ.ศ. 2560

My Hand Write DATA


XML What ?



  • XML ย่อมาจาก Extensible Markup Language
  • XML is a markup language much like HTML
  • XML is a W3C (World Wide Web Consortium) Recommendation

XML Why ?

  •  XML มีโครงสร้างที่ประกอบด้วยแท็กเปิด และแท็กปิด <> เช่นเดียวกับภาษา HTML
  • แตกต่างกันที่HTML ถูกออกแบบมาเพื่อการแสดงผล แต่ XML นั้นถูกออกแบบมาเพื่อเก็บข้อมูล โดยเก็บทั้งข้อมูลและโครงสร้างของข้อมูลนั้นๆไว้ด้วยกัน
  • ภาษา XML สามารถสร้างแท็กรวมทั้งกำหนดโครงสร้างของข้อมูลได้เอง ซึ่ง HTML ทำไม่ได้เพราะภาษา HTML ถูกกำหนดแท็กตายตัวโดย W3C
XML How ?

  • XML เป็นส่วนเสริมของ HTML เพราะตัว XML ไม่สามารถแสดงผลได้ในตัวเอง หากต้องการแสดงผลที่ถูกต้อง จะต้องมีการใช้ร่วมกับภาษาอื่น เช่น HTML, PHP หรือภาษาอื่น ๆ ที่สนับสนุน  XML จะมีนามสกุลเป็น .XML สามารถสร้างขึ้นจากโปรแกรมประเภท Text Editor ใดก็ได้
My Data to XML







Java

Send Large File in Java

    จากเดิมเราทำการส่งไฟล์โดยส่งไปทีละ 1 Byte


และทางฝั่ง Reciever ก็รับทีละ 1 Byte


โดยเริ่มต้นเราจะใช้ไฟล์ในการส่งขนาด 151 MB


ผลลัพธ์ คือ สามารถส่งไฟล์ขนาดใหญ่ได้ โดยใช้เวลา 18 นาที 1 วินาที โดยวัดจากฝั่ง Sender 



แต่ปัญหาคือ 

  • สามารถส่งไฟล์ขนาดใหญ่ได้ แต่ใช้เวลาในการส่งมากเกินไป
  • จากตัวอย่างไฟล์ขนาด 151 MB ใช้เวลา 18 นาที 
จะแก้ไขโดย
  • ปรับขนาด Buffer Size ในการส่งให้มากขึ้น
  • จากส่งทีละ 1 Byte เป็นส่งทีละ 1460 Byte 

Code 


และฝั่ง Reciever 


หลังจากนี้จะทำการทดสอบโดยใช้ไฟล์ขนาด 151 MB อันเดิม 

ผลลัพธ์ 
  • สามารถส่งไฟล์ได้ และ ยังทำเวลาที่ใช้ในการส่งดียิ่งขึ้น
  • จาก 18 นาที 1 วินาที เหลือแค่ 3 วินาที 





เพื่อความชัดเจนในการทดสอบเราจะทำการเพิ่มขนาดไฟล์ให้ใหญ่ขึ้น

  • ไฟล์ที่ใช้ในการส่ง ขนาด 1.56 GB 





ผลลัพธ์ สามารถส่งไฟล์ได้ เวลาที่ใช้ 1 นาที 52 วินาที 





Read File Only Once 
    ให้ทำการส่งไฟล์และคำนวนหา Checksum ภายในการเปิดอ่านไฟล์เพียงครั้งเดียว

 จากเดิมเราจะทำการเปิดไฟล์อ่าน 2 รอบ ในรอบแรกคือการอ่านไฟล์เพื่อทำการส่งไปให้ Receiver และ ครั้งที่ 2 เพื่อทำการคำนวนหา MD5 Checksum




โดยเราแก้ไขให้สามารถอ่านไฟล์ในครั้งเดียวโดย ขั้นแรกเราเปลี่ยน Library ที่ใช้ในการหา MD5 Checksum
  • เปลี่ยนจาก Apache Common Codec 
  • เป็น Class java.security.MessageDigest  ที่มีอยู่แล้วใน java 

ที่ต้องเปลี่ยนเนื่องจาก Apache ตอนเรียกใช้ method หา md5 จะอ่าน data ใน File input Steam หมดก่อน ทำให้ไม่มีข้อมูลที่ใช้ในการส่ง 





ในส่วนของ code และ method ที่ใช้หลังจากเปลี่ยน library แล้วจะใช้ตามรูปนี้




  1. MessageDigest.getInstance("MD5"); คือการสร้าง instance ที่จะใช้เก็บ data ที่จะหา checksum โดยเราระบุให้ใช้ MD5 algorithm
  2. md.update(buf); นำ array byte มาอัพเดทให้ instance ที่สร้างในข้อที่ 1 เราสามารถเรียกใช้ method นี้ได้หลายครั้ง จนกว่าข้อมูลใน File input Stream จะหมด
  3. md.digest(); ทำการ คำนวนหา MD5 แล้ว return ออกมาเป็น byte array 
  4. DatatypeConverter.printHexBinary(digest).toUpperCase(); แปลง byte array ให้เป็น String และ ให้ String เป็น อักษรตัวใหญ่ 

ส่วนของการนำไปใช้จริง 
    ฝั่ง Sender 




    ฝั่ง Receiver 



ไฟล์ที่จะใช้ในการทดสอบ ขนาด 1.56 GB


ผลลัพธ์ คือ สามารถส่งไฟล์ และ คำนวนหา MD5 Checksum ได้ในการเปิดอ่านไฟล์เพียงครั้งเดียว 

 

แต่ผลลัพธ์ที่ได้หลังจากเปลี่ยนให้เปิดไฟล์อ่านเพียงครั้งเดียวคือ 

  • เวลาที่ใช้ในการส่งทำได้ดีขึ้นเมื่อเทียบกับการเปิดไฟล์อ่าน 2 ครั้ง
  • จากเวลาที่ใช้ 1 นาที 52 วินาที เหลือแค่ 28 วินาที 


 Read & Write , Same File Name 

  • ให้ชื่อของไฟล์ที่ได้รับจาก Sender ต้องมีชื่อเดิมเหมือนกับไฟล์ต้นฉบับ 



จากเดิมไฟล์ที่ส่งกับไฟล์ที่ได้รับ จะมีคนละชื่อกันเนื่องจาก Receiver เป็นคนระบุชื่อไฟล์เอง




เพื่อให้ชื่อไฟล์ที่ Receiver ได้รับมีชื่อเดียวกับ Sender

  • Sender จะต้องส่งชื่อไฟล์ที่จะส่งมาให้ก่อน เพื่อให้ Receiver ทำการเปิดไฟล์และพร้อมรับข้อมูล





ผลลัพธ์ที่ได้
  • ไฟล์ที่ Receiver ได้รับมีชื่อเดียวกันกับที่ Sender ส่งมา








ในส่วนถัดไปจะเป็นการส่งไฟล์ขนาดใหญ่และการเปิดไฟล์อ่านเพียงครั้งเดียวในภาษา C++



C++ Send Large File




เราจะทำการส่งไฟล์ 2 ไฟล์คือไฟล์ 4kpic.jpg เเละ ไฟล์ anime.mp4



ไฟล์ 4kpic.jpg จะมีขนาด 9.1 MB



ไฟล์ anime.mp4 จะมีขนาดใหญ่กว่าคือ 247.2 MB

จะทำการทดสอบส่งไฟล์ทั้ง 2 ขนาด


สามารถส่งไฟล์ 4kpic.jpg ได้สำเร็จ


สามารถส่งไฟล์ anime ได้สำเร็จเเต่ใช้เวลานานกว่า เพราะ ไฟล์มีขนาดใหญ่กว่า

ทำการ check md5 ว่าไฟล์ที่ส่งมามีค่า md5 เหมือนไฟล์ต้นเเบบไหม


md5 ของ 4pic.jpg ที่ Client (ไฟล์ต้นเเบบ)


md5 ของ 4pic.jpg ที่ Server (ไฟล์ที่ถูกส่งมา)


md5 ของ anime.mp4 ที่ Client (ไฟล์ต้นเเบบ)


md5 ของ anime.mp4 ที่ Server (ไฟล์ที่ถูกส่งมา)

Read File Only Once Client


  1. สร้าง File Stream ขึ้นมา
  2. เปิดไฟล์ที่จะส่ง
  3. ดูว่าเปิดไฟล์ได้ไหม
  4. ทำการขอขนาดที่สามารถเก็บไฟล์ไว้ได้
  5. เเปลงไฟล์เป็น String
  6. หาขนาดของไฟล์
  7. เก็บชื่อเเละขนาดของไฟล์ไว้เเล้วส่งไปก่อน ( ไฟล์ที่ส่งไปจึงชื่อเหมือนไฟล์ต้นเเบบ )
  8. เริ่มส่งไฟล์
  9. เเสดงค่า Percent
  10. ทำการคำนวณค่า md5
  11. ปิดไฟล์ เเละ Socket

Read File Only Once Server


  1. รอการเชื่อมต่อ
  2. รับค่าชื่อเเละขนาดไฟล์มาวิเคราะห์
  3. สร้าง buffer
  4. สร้าง File Stream ขึ้นมา
  5. สร้างไฟล์เพื่อรอการรับข้อมูล
  6. เริ่มรับข้อมูล
  7. เเสดงค่า Percent
  8. ลบ buffer หลังจากเขียนข้อมูลในไฟล์เเล้ว
  9. เเปลงค่าไฟล์เป็น string
  10. ทำการคำนวณค่า md5
  11. ปิด Socket

Transfer Program + MD5 Checksum


การส่งเเละรับไฟล์ทั้งสองฝั่ง

Slide link
Source Code (Github)
C++ Reference

XML Reference


ความคิดเห็น

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

week 1: connect and send data between program

week6: XML Schema & XML Parser