week5: XML Intro What/Why/How & Continue from w4
จากใน week 4 เราสามารถที่จะทำการส่งไฟล์ ระหว่าง client และ server ได้ โดยใช้ TCP Socket ในการส่งไฟล์และทำการ Checksum โดยใช้ MD5 เพื่อตรวจสอบความถูกต้องของไฟล์ว่า ไฟล์ที่ได้รับจาก Sender มีความถูกต้องหรือไม่ คราวนี้เราจะมาเพิ่ม ความสามารถของโปรแกรมต่อ โดยมีเงื่อนไขเพิ่มเติมดังนี้
Continue from w4
XML - What/Why/How
วันจันทร์ที่ 4 กันยายน พ.ศ. 2560
My Hand Write DATA
Java
Send Large File in Java
จากเดิมเราทำการส่งไฟล์โดยส่งไปทีละ 1 Byte
และทางฝั่ง Reciever ก็รับทีละ 1 Byte
โดยเริ่มต้นเราจะใช้ไฟล์ในการส่งขนาด 151 MB
ผลลัพธ์ คือ สามารถส่งไฟล์ขนาดใหญ่ได้ โดยใช้เวลา 18 นาที 1 วินาที โดยวัดจากฝั่ง Sender
แต่ปัญหาคือ
เพื่อความชัดเจนในการทดสอบเราจะทำการเพิ่มขนาดไฟล์ให้ใหญ่ขึ้น
ผลลัพธ์ สามารถส่งไฟล์ได้ เวลาที่ใช้ 1 นาที 52 วินาที
Read File Only Once
ให้ทำการส่งไฟล์และคำนวนหา Checksum ภายในการเปิดอ่านไฟล์เพียงครั้งเดียว
จากเดิมเราจะทำการเปิดไฟล์อ่าน 2 รอบ ในรอบแรกคือการอ่านไฟล์เพื่อทำการส่งไปให้ Receiver และ ครั้งที่ 2 เพื่อทำการคำนวนหา MD5 Checksum
โดยเราแก้ไขให้สามารถอ่านไฟล์ในครั้งเดียวโดย ขั้นแรกเราเปลี่ยน Library ที่ใช้ในการหา MD5 Checksum
ในส่วนของ code และ method ที่ใช้หลังจากเปลี่ยน library แล้วจะใช้ตามรูปนี้
แต่ผลลัพธ์ที่ได้หลังจากเปลี่ยนให้เปิดไฟล์อ่านเพียงครั้งเดียวคือ
Read & Write , Same File Name
จากเดิมไฟล์ที่ส่งกับไฟล์ที่ได้รับ จะมีคนละชื่อกันเนื่องจาก Receiver เป็นคนระบุชื่อไฟล์เอง
เพื่อให้ชื่อไฟล์ที่ Receiver ได้รับมีชื่อเดียวกับ Sender
ผลลัพธ์ที่ได้
ในส่วนถัดไปจะเป็นการส่งไฟล์ขนาดใหญ่และการเปิดไฟล์อ่านเพียงครั้งเดียวในภาษา C++
C++ Send Large File
เราจะทำการส่งไฟล์ 2 ไฟล์คือไฟล์ 4kpic.jpg เเละ ไฟล์ anime.mp4
ไฟล์ 4kpic.jpg จะมีขนาด 9.1 MB
ไฟล์ anime.mp4 จะมีขนาดใหญ่กว่าคือ 247.2 MB
จะทำการทดสอบส่งไฟล์ทั้ง 2 ขนาด
Slide link
Java Reference
C++ Reference
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 แล้วจะใช้ตามรูปนี้
- MessageDigest.getInstance("MD5"); คือการสร้าง instance ที่จะใช้เก็บ data ที่จะหา checksum โดยเราระบุให้ใช้ MD5 algorithm
- md.update(buf); นำ array byte มาอัพเดทให้ instance ที่สร้างในข้อที่ 1 เราสามารถเรียกใช้ method นี้ได้หลายครั้ง จนกว่าข้อมูลใน File input Stream จะหมด
- md.digest(); ทำการ คำนวนหา MD5 แล้ว return ออกมาเป็น byte array
- 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
- สร้าง File Stream ขึ้นมา
- เปิดไฟล์ที่จะส่ง
- ดูว่าเปิดไฟล์ได้ไหม
- ทำการขอขนาดที่สามารถเก็บไฟล์ไว้ได้
- เเปลงไฟล์เป็น String
- หาขนาดของไฟล์
- เก็บชื่อเเละขนาดของไฟล์ไว้เเล้วส่งไปก่อน ( ไฟล์ที่ส่งไปจึงชื่อเหมือนไฟล์ต้นเเบบ )
- เริ่มส่งไฟล์
- เเสดงค่า Percent
- ทำการคำนวณค่า md5
- ปิดไฟล์ เเละ Socket
Read File Only Once Server
- รอการเชื่อมต่อ
- รับค่าชื่อเเละขนาดไฟล์มาวิเคราะห์
- สร้าง buffer
- สร้าง File Stream ขึ้นมา
- สร้างไฟล์เพื่อรอการรับข้อมูล
- เริ่มรับข้อมูล
- เเสดงค่า Percent
- ลบ buffer หลังจากเขียนข้อมูลในไฟล์เเล้ว
- เเปลงค่าไฟล์เป็น string
- ทำการคำนวณค่า md5
- ปิด Socket
Transfer Program + MD5 Checksum
การส่งเเละรับไฟล์ทั้งสองฝั่ง
Source Code (Github)
- c++ : https://github.com/pipo07pipo/CppFileTransfer
- java : https://github.com/soulquiz/javaFastFileTransfer
Java Reference
- http://docs.oracle.com/javase/8/docs/api/java/security/MessageDigest.html
- http://www.baeldung.com/java-md5
- https://docs.oracle.com/javase/7/docs/api/java/io/FileInputStream.html
- https://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html
- https://docs.oracle.com/javase/7/docs/api/javax/xml/bind/DatatypeConverter.html
- http://www.zedwood.com/article/cpp-md5-function
- http://www.cplusplus.com/reference
- http://www.rohitab.com/discuss/topic/27051-send-file-through-sockets/
- https://www.tutorialspoint.com/cplusplus
XML Reference
ความคิดเห็น
แสดงความคิดเห็น