Skip to content

เขียนโปรแกรมเครือข่าย 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 ครับ

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

Published on Categories เครือข่ายTags

About wannaphong

วรรณพงษ์ ภัททิยไพบูลย์ ผู้ดูแลเว็บ wannaphong.com และผู้เขียนบทความบล็อกนี้ นักศึกษาชั้นปีที่ 1 สาขาวิทยาการคอมพิวเตอร์และสารสนเทศ คณะวิทยาศาสตร์ประยุกต์และวิศวกรรมศาสตร์ มหาวิทยาลัยขอนแก่น วิทยาเขตหนองคาย

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องที่ต้องการถูกทำเครื่องหมาย *