Socket Programming ใน Python คืออะไรและจะเชี่ยวชาญได้อย่างไร



เรียนรู้ว่า Socket Programming ใน Python คืออะไรพร้อมกับการสื่อสารไคลเอนต์เซิร์ฟเวอร์พร้อมกับการถ่ายโอนออบเจ็กต์ python โดยใช้ pickle และ sockets

อินเทอร์เน็ตกลายเป็น 'จิตวิญญาณแห่งการดำรงอยู่' อย่างปฏิเสธไม่ได้และกิจกรรมของอินเทอร์เน็ตนั้นมีลักษณะเป็น 'Connections' หรือ 'Networks' เครือข่ายเหล่านี้เกิดขึ้นได้โดยใช้หนึ่งในปัจจัยพื้นฐานที่สำคัญที่สุดของ ซ็อกเก็ต บทความนี้ครอบคลุมทุกพื้นที่ที่เกี่ยวข้องกับ Socket Programming ใน Python ซ็อกเก็ตช่วยให้คุณทำการเชื่อมต่อเหล่านี้ในขณะที่ ทำให้มันง่ายอย่างไม่ต้องสงสัย

มาดูหัวข้อทั้งหมดที่กล่าวถึงในบทความนี้โดยย่อ:





ทำไมต้องใช้ Sockets
Sockets ใน Python คืออะไร?
วิธีบรรลุการเขียนโปรแกรม Socket ใน Python
เซิร์ฟเวอร์คืออะไร?
ลูกค้าคืออะไร?
Echo ไคลเอนต์เซิร์ฟเวอร์
การสื่อสารหลายรายการ
การถ่ายโอนวัตถุ Python



ทำไมต้องใช้ Sockets

ซ็อกเก็ตเป็นกระดูกสันหลังของระบบเครือข่าย ทำให้การถ่ายโอนข้อมูลเป็นไปได้ระหว่างสองโปรแกรมหรืออุปกรณ์ต่างๆ ตัวอย่างเช่นเมื่อคุณเปิดเบราว์เซอร์คุณในฐานะไคลเอนต์กำลังสร้างการเชื่อมต่อกับเซิร์ฟเวอร์สำหรับการถ่ายโอนข้อมูล

ก่อนที่จะเจาะลึกลงไปในการสื่อสารนี้เรามาดูกันก่อนว่าซ็อกเก็ตเหล่านี้คืออะไรกันแน่

ซ็อกเก็ตคืออะไร?

โดยทั่วไปซ็อกเก็ตคืออุปกรณ์ปลายทางภายในที่สร้างขึ้นสำหรับการส่งและรับข้อมูล เครือข่ายเดียวจะมีสองซ็อกเก็ตหนึ่งซ็อกเก็ตสำหรับอุปกรณ์สื่อสารหรือโปรแกรมแต่ละตัว ซ็อกเก็ตเหล่านี้เป็นการรวมกันของที่อยู่ IP และพอร์ต อุปกรณ์เครื่องเดียวสามารถมีจำนวนซ็อกเก็ต 'n' ได้ตามหมายเลขพอร์ตที่กำลังใช้งาน มีพอร์ตที่แตกต่างกันสำหรับโปรโตคอลประเภทต่างๆ ดูภาพต่อไปนี้สำหรับข้อมูลเพิ่มเติมเกี่ยวกับหมายเลขพอร์ตทั่วไปและโปรโตคอลที่เกี่ยวข้อง:




พอร์ตทั่วไป -SocketProgramminginPython-Edureka

ตอนนี้คุณเข้าใจแนวคิดของซ็อกเก็ตแล้วตอนนี้เรามาดูโมดูล Socket ของ Python:

hashmap ใน java คืออะไร

วิธีบรรลุการเขียนโปรแกรม Socket ใน Python:

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

บางส่วนของวิธีการที่สำคัญมีดังนี้:

วิธีการคำอธิบาย

ซ็อกเก็ตซ็อกเก็ต ()

ใช้ในการสร้างซ็อกเก็ต (ต้องใช้ทั้งบนเซิร์ฟเวอร์และไคลเอนต์เพื่อสร้างซ็อกเก็ต)

socket.accept ()

ใช้เพื่อยอมรับการเชื่อมต่อ ส่งคืนค่าคู่ (conn, address) โดยที่ conn เป็นอ็อบเจ็กต์ซ็อกเก็ตใหม่สำหรับการส่งหรือรับข้อมูลและแอดเดรสคือที่อยู่ของซ็อกเก็ตที่อยู่ที่ปลายอีกด้านของการเชื่อมต่อ

socket.bind ()

ใช้เพื่อผูกกับแอดเดรสที่ระบุเป็นพารามิเตอร์

ซ็อกเก็ตปิด ()

ใช้เพื่อทำเครื่องหมายซ็อกเก็ตว่าปิดแล้ว

ซ็อกเก็ตเชื่อมต่อ ()

ใช้เพื่อเชื่อมต่อกับรีโมตแอดเดรสที่ระบุเป็นพารามิเตอร์

socket.listen ()

ทำให้เซิร์ฟเวอร์ยอมรับการเชื่อมต่อ

เมื่อคุณเข้าใจถึงความสำคัญของโมดูลซ็อกเก็ตแล้วเรามาดูกันดีกว่าว่าจะทำหน้าที่สร้างเซิร์ฟเวอร์และไคลเอนต์สำหรับ Socket Programming ได้อย่างไร .

เซิร์ฟเวอร์คืออะไร?

เซิร์ฟเวอร์เป็นทั้งโปรแกรมคอมพิวเตอร์หรืออุปกรณ์ที่ใช้ในการจัดการทรัพยากรเครือข่าย เซิร์ฟเวอร์สามารถอยู่บนอุปกรณ์หรือคอมพิวเตอร์เครื่องเดียวกันหรือเชื่อมต่อกับอุปกรณ์และคอมพิวเตอร์เครื่องอื่นหรือแม้กระทั่งระยะไกล เซิร์ฟเวอร์มีหลายประเภทเช่นเซิร์ฟเวอร์ฐานข้อมูลเซิร์ฟเวอร์เครือข่ายเซิร์ฟเวอร์การพิมพ์เป็นต้น

เซิร์ฟเวอร์มักใช้วิธีการต่างๆเช่น socket.socket (), socket.bind (), socket.listen () ฯลฯ เพื่อสร้างการเชื่อมต่อและเชื่อมโยงกับไคลเอนต์ ตอนนี้เรามาเขียนโปรแกรมเพื่อสร้างเซิร์ฟเวอร์กัน พิจารณาตัวอย่างต่อไปนี้:

ตัวอย่าง:

นำเข้าซ็อกเก็ต s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.bind ((socket.gethostname (), 1234)) # หมายเลขพอร์ตสามารถเป็นอะไรก็ได้ระหว่าง 0-65535 (โดยปกติเราจะระบุพอร์ตที่ไม่เป็นที่นิยมซึ่ง ได้แก่ > 1023) s.listen (5) ในขณะที่ True: clt, adr = s.accept () print (f'Connection to {adr} created ') #f string คือสตริงตัวอักษรที่นำหน้าด้วย f ซึ่ง # มีนิพจน์ python อยู่ภายในวงเล็บปีกกา clt .send (bytes ('Socket Programming in Python', 'utf-8')) # เพื่อส่งข้อมูลไปยังไคลเอนต์

อย่างที่คุณเห็นสิ่งแรกที่จำเป็นในการสร้างซ็อกเก็ตคือการนำเข้าโมดูลซ็อกเก็ต หลังจากนั้นจะใช้เมธอด socket.socket () เพื่อสร้างซ็อกเก็ตฝั่งเซิร์ฟเวอร์

บันทึก:

AF_INET หมายถึงที่อยู่จากอินเทอร์เน็ตและต้องใช้คู่ของ (โฮสต์พอร์ต) ซึ่งโฮสต์อาจเป็น URL ของเว็บไซต์บางแห่งหรือที่อยู่ของเว็บไซต์และหมายเลขพอร์ตเป็นจำนวนเต็ม SOCK_STREAM ใช้เพื่อสร้าง TCP Protocols

วิธีการผูก () ยอมรับสองพารามิเตอร์เป็นทูเปิล (โฮสต์พอร์ต) อย่างไรก็ตามควรใช้หมายเลขพอร์ต 4 หลักดีกว่าเนื่องจากปกติแล้วหมายเลขพอร์ตต่ำกว่า วิธีการ listen () อนุญาตให้เซิร์ฟเวอร์ยอมรับการเชื่อมต่อ ในที่นี้ 5 คือคิวสำหรับการเชื่อมต่อหลายรายการที่เกิดขึ้นพร้อมกัน ค่าต่ำสุดที่สามารถระบุได้ที่นี่คือ 0 (หากคุณให้ค่าน้อยกว่าค่านั้นจะเปลี่ยนเป็น 0) ในกรณีที่ไม่มีการระบุพารามิเตอร์จะใช้ค่าเริ่มต้นที่เหมาะสม

อนุญาตให้ยอมรับการเชื่อมต่อตลอดไป 'clt' และ 'adr' คือวัตถุและที่อยู่ของลูกค้า คำสั่งการพิมพ์จะพิมพ์ที่อยู่และหมายเลขพอร์ตของซ็อกเก็ตไคลเอ็นต์ ในที่สุด clt.send จะใช้เพื่อส่งข้อมูลเป็นไบต์

ตอนนี้เซิร์ฟเวอร์ของเราพร้อมแล้วให้เราก้าวต่อไปยังไคลเอนต์

ลูกค้าคืออะไร?

ไคลเอนต์คือคอมพิวเตอร์หรือซอฟต์แวร์ที่รับข้อมูลหรือบริการจากเซิร์ฟเวอร์ ในโมดูลไคลเอนต์เซิร์ฟเวอร์ไคลเอนต์ร้องขอบริการจากเซิร์ฟเวอร์ ตัวอย่างที่ดีที่สุดคือเว็บเบราว์เซอร์เช่น Google Chrome, Firefox เป็นต้นเว็บเบราว์เซอร์เหล่านี้ขอเว็บเซิร์ฟเวอร์สำหรับหน้าเว็บและบริการที่จำเป็นตามที่ผู้ใช้กำหนด ตัวอย่างอื่น ๆ ได้แก่ เกมออนไลน์แชทออนไลน์ ฯลฯ

ตอนนี้เรามาดูวิธีเขียนโค้ดโปรแกรมฝั่งไคลเอ็นต์กัน :

ตัวอย่าง:

นำเข้าซ็อกเก็ต s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 2346)) msg ​​= s.recv (1024) พิมพ์ (msg.decode ('utf-8') )

ขั้นตอนแรกคือการนำเข้าโมดูลซ็อกเก็ตจากนั้นสร้างซ็อกเก็ตเช่นเดียวกับที่คุณทำขณะสร้างเซิร์ฟเวอร์ จากนั้นในการสร้างการเชื่อมต่อระหว่างไคลเอนต์เซิร์ฟเวอร์คุณจะต้องใช้วิธีการเชื่อมต่อ () โดยระบุ (โฮสต์พอร์ต)


บันทึก: gethostname ใช้เมื่อไคลเอนต์และเซิร์ฟเวอร์อยู่บนคอมพิวเตอร์เครื่องเดียวกัน (LAN - localip / WAN - สาธารณะ)

ที่นี่ลูกค้าต้องการรับข้อมูลบางอย่างจากเซิร์ฟเวอร์และสำหรับสิ่งนี้คุณต้องใช้เมธอด recv () และข้อมูลจะถูกเก็บไว้ใน msg ตัวแปรอื่น โปรดทราบว่าข้อมูลที่ส่งผ่านจะอยู่ในหน่วยไบต์และในไคลเอนต์ในโปรแกรมข้างต้นสามารถรับได้ถึง 1024 ไบต์ (ขนาดบัฟเฟอร์) ในการถ่ายโอนครั้งเดียว สามารถระบุเป็นจำนวนเท่าใดก็ได้ขึ้นอยู่กับจำนวนข้อมูลที่โอน

สุดท้ายข้อความที่กำลังถ่ายโอนควรได้รับการถอดรหัสและพิมพ์

เมื่อคุณทราบวิธีสร้างโปรแกรมไคลเอนต์เซิร์ฟเวอร์แล้วเรามาดูวิธีดำเนินการกันต่อ

Echo ไคลเอนต์เซิร์ฟเวอร์:

ในการรันโปรแกรมเหล่านี้ให้เปิดพรอมต์คำสั่งเข้าไปในโฟลเดอร์ที่คุณสร้างโปรแกรมไคลเอนต์และเซิร์ฟเวอร์จากนั้นพิมพ์:

py server.py (ที่นี่ server.py เป็นชื่อไฟล์ของเซิร์ฟเวอร์คุณยังสามารถใช้ py -3.7 server.py ได้)

เมื่อเสร็จแล้วเซิร์ฟเวอร์จะเริ่มทำงาน ในการเรียกใช้งานไคลเอนต์ให้เปิดหน้าต่าง cmd อื่นแล้วพิมพ์:

py client.py (ในที่นี้ client.py คือชื่อไฟล์ของไคลเอนต์)

เอาท์พุท (เซิร์ฟเวอร์):

(ลูกค้า)

มาลองใช้โปรแกรมเดียวกันโดยลดขนาดบัฟเฟอร์เป็น 7 แล้วดูว่าเราได้ผลลัพธ์อะไรบ้าง:

เอาท์พุท:

อย่างที่คุณเห็นการเชื่อมต่อจะสิ้นสุดลงหลังจากถ่ายโอน 7 ไบต์ แต่นี่เป็นปัญหาเนื่องจากคุณไม่ได้รับข้อมูลที่ครบถ้วนและการเชื่อมต่อถูกปิด มาแก้ปัญหานี้กัน

การสื่อสารหลายรายการ:

เพื่อให้การเชื่อมต่อดำเนินต่อไปจนกว่าไคลเอนต์จะได้รับข้อมูลที่สมบูรณ์คุณสามารถใช้ประโยชน์จากลูป while:

ตัวอย่าง:

นำเข้าซ็อกเก็ต s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 2346)) ในขณะที่ True: msg = s.recv (7) พิมพ์ (msg.decode ('utf- 8 '))

เมื่อคุณดำเนินการนี้ข้อความที่สมบูรณ์จะได้รับในขนาด 7 ไบต์ต่อการโอน

แต่คราวนี้อย่างที่คุณเห็นการเชื่อมต่อไม่ได้ยุติลงและคุณไม่มีทางรู้ว่าจะเกิดขึ้นเมื่อใด และหากคุณไม่ทราบว่าข้อความหรือข้อมูลที่ลูกค้าจะได้รับจากเซิร์ฟเวอร์นั้นใหญ่แค่ไหน ในกรณีเช่นนี้คุณสามารถใช้บิตโค้ดต่อไปนี้ในฝั่งไคลเอ็นต์:

ตัวอย่าง:

complete_info = '' ในขณะที่ True: msg = s.recv (7) ถ้า len (msg)<=0: break complete_info += msg.decode('utf-8') print(complete_info) 

ทางฝั่งเซิร์ฟเวอร์ใช้เมธอด close () ดังนี้:

clt.close ()

ผลลัพธ์จะเป็นดังที่แสดงในภาพด้านล่าง:

เอาท์พุท:



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

การถ่ายโอนวัตถุ Python:

ถึงตรงนี้คุณก็มีความสามารถในการโอนสาย แต่, Socket Programming ใน Python ยังช่วยให้คุณถ่ายโอนวัตถุ Python ได้อีกด้วย วัตถุเหล่านี้อาจเป็นอะไรก็ได้เช่นเซตทูเปิลพจนานุกรม ฯลฯ เพื่อให้บรรลุสิ่งนี้คุณจะต้องนำเข้าโมดูลดองของ Python

Python Pickle โมดูล:

โมดูล Python pickle จะปรากฏเป็นภาพเมื่อคุณกำลังทำให้เป็นซีเรียลหรืออ็อบเจ็กต์ de-serializing ใน python มาดูตัวอย่างเล็ก ๆ

ตัวอย่าง:

นำเข้า mylist ของดอง = [1,2, 'abc'] mymsg = pickle.dumps (mylist) พิมพ์ (mymsg)

เอาท์พุท: b’x80x03] qx00 (Kx01Kx02Xx03x00x00x00abcqx01e. ’

ดังที่คุณเห็นในโปรแกรมด้านบน 'mylist' ถูกทำให้เป็นอนุกรมโดยใช้ฟังก์ชัน dumps () ของโมดูลดอง นอกจากนี้โปรดทราบด้วยว่าเอาต์พุตเริ่มต้นด้วย 'b' ซึ่งหมายความว่าถูกแปลงเป็นไบต์ ในการเขียนโปรแกรมซ็อกเก็ตคุณสามารถใช้โมดูลนี้เพื่อถ่ายโอน วัตถุหลาม ระหว่างไคลเอนต์และเซิร์ฟเวอร์

จะใช้โมดูล pickle เพื่อถ่ายโอนโครงสร้างวัตถุ python ได้อย่างไร

เมื่อคุณใช้ดองร่วมกับซ็อกเก็ตคุณสามารถโอนอะไรก็ได้ผ่านเครือข่าย มาจดฝั่งเซิร์ฟเวอร์และคู่ค้าฝั่งไคลเอ็นต์เพื่อถ่ายโอนรายการจากเซิร์ฟเวอร์ไปยังไคลเอนต์:

ฝั่งเซิร์ฟเวอร์:

นำเข้าซ็อกเก็ตนำเข้าดอง a = 10 s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.bind ((socket.gethostname (), 2133)) #binding tuple s.listen (5) ในขณะที่ True: clt, adr = s.accept () print (f'Connection to {adr} created ') m = {1:' Client ', 2:' Server '} mymsg = pickle.dumps (m) # ข้อความที่เราต้องการพิมพ์ในภายหลัง mymsg = {เลน (mymsg): {a}} 'utf-8') + mymsg clt.send (mymsg)

ในที่นี้ m คือพจนานุกรมที่เป็นไฟล์ ที่ต้องส่งจากเซิร์ฟเวอร์ไปยังไคลเอนต์ สิ่งนี้ทำได้โดยการทำให้เป็นอนุกรมของวัตถุโดยใช้ dumps () ก่อนแล้วแปลงเป็นไบต์
ตอนนี้เรามาเขียนคู่ของฝั่งไคลเอ็นต์:

ด้านลูกค้า:

นำเข้าซ็อกเก็ตนำเข้าดอง a = 10 s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 2133)) ในขณะที่ True: complete_info = b '' rec_msg = True ในขณะที่ True: mymsg = s.recv (10) ถ้า rec_msg: print (f'The length of message = {mymsg [: a]} ') x = int (mymsg [: a]) rec_msg = False complete_info + = mymsg if len (complete_info) -a == x: print ('ได้รับข้อมูลที่สมบูรณ์') พิมพ์ (complete_info [a:]) m = pickle.loads (complete_info [a:]) print (m) rec_msg = True complete_info = b '' พิมพ์ (complete_info )

ลูป while แรกจะช่วยให้เราติดตามข้อความที่สมบูรณ์ (complete_info) รวมทั้งข้อความที่กำลังรับ (rec_msg) โดยใช้บัฟเฟอร์ ข้อความโดยการตั้งค่า rec_
จากนั้นในขณะที่กำลังรับข้อความทั้งหมดที่ฉันทำคือพิมพ์ทีละบิตโดยได้รับในบัฟเฟอร์ขนาด 10 ขนาดนี้อาจเป็นอะไรก็ได้ขึ้นอยู่กับการเลือกส่วนตัวของคุณ

จากนั้นหากข้อความที่ได้รับเท่ากับข้อความที่สมบูรณ์ฉันแค่พิมพ์ข้อความตามที่ได้รับข้อมูลที่สมบูรณ์ซึ่งฉันได้ยกเลิกการจัดลำดับข้อความโดยใช้ load ()

ผลลัพธ์ไปยังโปรแกรมด้านบนมีดังนี้:

เรามาถึงตอนท้ายของบทความนี้เกี่ยวกับ Socket Programming ใน Python ฉันหวังว่าคุณจะเข้าใจแนวคิดทั้งหมดอย่างชัดเจน

ให้แน่ใจว่าคุณฝึกฝนให้มากที่สุดและเปลี่ยนประสบการณ์

มีคำถามสำหรับเรา? โปรดระบุไว้ในส่วนความคิดเห็นของบล็อก 'Socket Programming in Python' และเราจะติดต่อกลับโดยเร็วที่สุด

หากต้องการรับความรู้เชิงลึกเกี่ยวกับ Python พร้อมกับแอพพลิเคชั่นต่างๆคุณสามารถลงทะเบียนเพื่อถ่ายทอดสด ด้วยการสนับสนุนตลอด 24 ชั่วโมงทุกวันและการเข้าถึงตลอดชีวิต