21 เมษายน 2558

Published เมษายน 21, 2558 by with 4 comments

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

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


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

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

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

เรามาเขียนโปรแกรมกันเลยครับ
ไฟล์ server.py
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 #ออกจากการลูป

ไฟล์ client.py
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() #ปิดการเชื่อมต่อ


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

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

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

  1. ได้ความรูเลยครับ

    ตอบลบ
  2. อยากทรายว่า ถ้าจะเขียนให้มันเชื่อมกับเเลนของเพื่อนอ่ะ ต้องเขียนยังไง สมมุติ เครื่องคอมเราต้องการเชื่อมต่อกับคอมเพื่อนอ่ะค่ะ เเลนต่างกัน

    ตอบลบ
    คำตอบ
    1. ไม่ระบุชื่อ12 ตุลาคม 2563 เวลา 14:35

      ที่ส่งไปลองดูครับ เเลนต่างกัน ยึดของเซอฟเวอร์เป็นหลักครับ เเค่อยู่ในวงเเลนเดียวกันเป็นใช้ได้ครับเลขหน้าเหมือน ต่างกันเเค่3 ตัวท้าย ถ้าผมตอบผิดยังไง น้อมรับคำติชมเเล้วก็ขอคำชี้เเนะด้วยนะครับ (นักศึกษา)

      ลบ
    2. ไม่ระบุชื่อ19 ตุลาคม 2563 เวลา 20:21

      เชื่อต่อผ่าน PUB IP แทนครับ

      ลบ

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