21 เมษายน 2558

Published 4/21/2558 by with 0 comment

เขียนโปรแกรมเครือข่าย Socket ใน Python : ตอนที่ 3 รับส่งไฟล์ทางเครือข่าย

หลังจากบทความที่แล้ว ผมพาผู้อ่านไปเขียนโปรแกรมส่งข้อความผ่านเครือข่ายด้วย Socket ใน Python กันมาแล้วครับ แล้วห่างหายกันไปนานกับบทความชุดนี้ บทความนี้จะพาผู้อ่านไปเขียนโปรแกรมรับส่งไฟล์ทางเครือข่ายด้วย Socket ใน Python กันครับ

ในการเปิดไฟล์ที่เป็นไฟล์ไบต์ใน Python จะใช้คำสั่ง

[python]
open(file,mode)
[/python]

โดย mode คือ โหมดในการเปิดไฟล์จะคล้าย ๆ กับการเปิดไฟล์ text ใน Python แต่เพียงเติม b เข้าไป เช่น 'rb' อ่านไฟล์ และ 'wb' เขียนไฟล์ เป็นต้น

ในการเข้าข้อมูลผ่านเครือข่าย อาจจะทำให้การรับส่งข้อมูลไบต์มีปัญหาได้ เพราะเครื่องรับหรือเครื่องส่งข้อมูล อาจมีการเข้ารหัสและถอดรหัสข้อมูลไบต์ไม่เหมือนกัน เราจึงต้องใช้ไลบรารี base64 ในการเข้ารหัสและถอดรหัสข้อมูลไบต์ครับ

เรามาเขียนโปรแกรมกันเลยครับ
ไฟล์ server.py

[python]
import socket
import base64

HOST = ''
PORT = 8081 #กำหนดค่าพอร์ตในการสื่อสาร
ADDR = (HOST,PORT) #รวม host กับค่าพอร์ตเข้าเป็น tuple เดียวกัน
BUFSIZE = 1024 #ขนาดบัฟเฟอร์ข้อมูล

serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #สร้าง object ในการเชื่อมต่อ socket

serv.bind(ADDR) #เชื่อมต่อ
serv.listen(5) #5 เป็นจำนวนสูงสุดของการเชื่อมต่อคิวที่เราจะอนุญาต

print('listening ...')

while True:
conn, addr = serv.accept() #ยอมรับการเชื่อมต่อ
print('client connected ... ', addr) #แสดงรายละเอียด IP ที่เชื่อมต่อเข้ามา
myfile = open('2.py', 'wb') #เปิดไฟล์และเขียนไฟล์

while True:
data = conn.recv(BUFSIZE) #ดึงข้อมูลที่ส่งมา
if not data: break #หากไม่ใช่ข้อมูลให้หลุดออกจากการลูป
data = base64.b64decode(data) #ถอดรหัส base64
myfile.write(data) #เข้าข้อมูลลงไฟล์
print('writing file ....')

myfile.close() #ปิดไฟล์
print('finished writing file')
conn.close() #ปิดการเชื่อมต่อ
print('client disconnected')
break #ออกจากการลูป
[/python]

ไฟล์ client.py

[python]
import socket
import base64

HOST = 'localhost' #กำหนดค่า host ที่เชื่อมต่อ
PORT = 8081 #กำหนดค่าพอร์ตในการสื่อสาร
ADDR = (HOST,PORT) #รวม host กับค่าพอร์ตเข้าเป็น tuple เดียวกัน
BUFSIZE = 1024 #ขนาดบัฟเฟอร์ข้อมูล
file = "server.py" #ไฟล์ที่ต้องการส่ง

bytes1 = open(file,'rb').read() #อ่านไฟล์ไบต์
bytes1 = base64.b64encode(bytes1) #เข้ารหัส base64

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #สร้าง object ในการเชื่อมต่อ socket
client.connect(ADDR) #เชื่อมต่อ

client.send(bytes1) #ส่งข้อมูล

client.close() #ปิดการเชื่อมต่อ
[/python]

เวลาใช้งานให้รันไฟล์ server.py ก่อนครับ เพื่อรอรับข้อมูล แล้วจึงรันไฟล์ client.py ครับ

ติดตามบทความต่อไปนะครับ
ขอบคุณครับ

0 ความคิดเห็น:

แสดงความคิดเห็น

แสดงความคิดเห็นได้ครับ :)