ซ็อกเก็ตและวิธีการ
ซ็อกเก็ตเป็นจุดสิ้นสุดของช่องทางการสื่อสารแบบสองทิศทาง พวกเขาอาจสื่อสารภายในกระบวนการระหว่างกระบวนการในเครื่องเดียวกันหรือระหว่างกระบวนการในเครื่องอื่น ในบันทึกที่คล้ายกันซ็อกเก็ตเครือข่ายเป็นจุดสิ้นสุดหนึ่งในขั้นตอนการสื่อสารระหว่างสองโปรแกรมที่ทำงานบนเครือข่ายคอมพิวเตอร์เช่นอินเทอร์เน็ต เป็นสิ่งเสมือนจริงและไม่ได้หมายถึงฮาร์ดแวร์ใด ๆ ซ็อกเก็ตเครือข่ายสามารถระบุได้โดยการรวมกันของที่อยู่ IP และหมายเลขพอร์ตที่ไม่ซ้ำกัน ซ็อกเก็ตเครือข่ายอาจถูกนำไปใช้กับช่องประเภทต่างๆเช่น TCP, UDP และอื่น ๆ
คำศัพท์ต่างๆที่เกี่ยวข้องกับซ็อกเก็ตที่ใช้ในการเขียนโปรแกรมเครือข่ายมีดังนี้ -
โดเมน
โดเมนคือตระกูลของโปรโตคอลที่ใช้เป็นกลไกการขนส่ง ค่าเหล่านี้เป็นค่าคงที่เช่น AF_INET, PF_INET, PF_UNIX, PF_X25 เป็นต้น
ประเภท
Type หมายถึงประเภทของการสื่อสารระหว่างจุดสิ้นสุดสองจุดโดยทั่วไปคือ SOCK_STREAM สำหรับโปรโตคอลที่เน้นการเชื่อมต่อและ SOCK_DGRAM สำหรับโปรโตคอลที่ไม่มีการเชื่อมต่อ
มาตรการ
ซึ่งอาจใช้เพื่อระบุรูปแบบของโปรโตคอลภายในโดเมนและประเภท ค่าเริ่มต้นคือ 0 ซึ่งมักจะถูกปล่อยทิ้งไว้
ชื่อโฮสต์
ใช้เป็นตัวระบุของอินเทอร์เฟซเครือข่าย ชื่อโฮสต์ไม่ว่าจะเป็นสตริงแอดเดรสแบบจุด - รูปสี่เหลี่ยมหรือที่อยู่ IPV6 ในเครื่องหมายโคลอน (และอาจเป็นจุด)
ท่าเรือ
เซิร์ฟเวอร์แต่ละตัวจะรับฟังไคลเอ็นต์ที่เรียกใช้พอร์ตอย่างน้อยหนึ่งพอร์ต พอร์ตอาจเป็นหมายเลขพอร์ต Fixnum สตริงที่มีหมายเลขพอร์ตหรือชื่อของบริการ
โมดูลซ็อกเก็ตของ Python สำหรับการเขียนโปรแกรมซ็อกเก็ต
ในการใช้การเขียนโปรแกรมซ็อกเก็ตใน python เราจำเป็นต้องใช้โมดูล Socket ต่อไปนี้เป็นไวยากรณ์ง่ายๆในการสร้าง Socket -
import socket
s = socket.socket (socket_family, socket_type, protocol = 0)
ที่นี่เราต้องนำเข้าไลบรารีซ็อกเก็ตจากนั้นสร้างซ็อกเก็ตแบบธรรมดา ต่อไปนี้เป็นพารามิเตอร์ต่างๆที่ใช้ในการสร้างซ็อกเก็ต -
socket_family - นี่คือ AF_UNIX หรือ AF_INET ตามที่อธิบายไว้ก่อนหน้านี้
socket_type - นี่คือ SOCK_STREAM หรือ SOCK_DGRAM
protocol - โดยปกติจะถูกปล่อยทิ้งไว้โดยเริ่มต้นเป็น 0
วิธีการซ็อกเก็ต
ในส่วนนี้เราจะเรียนรู้เกี่ยวกับวิธีการซ็อกเก็ตต่างๆ ชุดวิธีการซ็อกเก็ตที่แตกต่างกันสามชุดมีการอธิบายไว้ด้านล่าง -
- วิธีการซ็อกเก็ตเซิร์ฟเวอร์
- วิธีการซ็อกเก็ตไคลเอนต์
- วิธีการทั่วไปของซ็อกเก็ต
วิธีการซ็อกเก็ตเซิร์ฟเวอร์
ในสถาปัตยกรรมไคลเอนต์เซิร์ฟเวอร์มีเซิร์ฟเวอร์ส่วนกลางหนึ่งเซิร์ฟเวอร์ที่ให้บริการและไคลเอนต์จำนวนมากได้รับบริการจากเซิร์ฟเวอร์ส่วนกลางนั้น ไคลเอนต์ยังร้องขอไปยังเซิร์ฟเวอร์ วิธีการซ็อกเก็ตเซิร์ฟเวอร์ที่สำคัญบางประการในสถาปัตยกรรมนี้มีดังนี้ -
socket.bind() - วิธีนี้ผูกที่อยู่ (ชื่อโฮสต์หมายเลขพอร์ต) กับซ็อกเก็ต
socket.listen()- วิธีนี้โดยทั่วไปฟังการเชื่อมต่อที่ทำกับซ็อกเก็ต มันเริ่มตัวฟัง TCP Backlog เป็นอาร์กิวเมนต์ของวิธีนี้ซึ่งระบุจำนวนการเชื่อมต่อที่อยู่ในคิวสูงสุด ค่าต่ำสุดคือ 0 และค่าสูงสุดคือ 5
socket.accept()- สิ่งนี้จะยอมรับการเชื่อมต่อไคลเอนต์ TCP คู่ (conn, address) คือคู่ค่าส่งคืนของวิธีนี้ ที่นี่ conn เป็นอ็อบเจ็กต์ซ็อกเก็ตใหม่ที่ใช้ในการส่งและรับข้อมูลเกี่ยวกับการเชื่อมต่อและแอดเดรสคือแอดเดรสที่ผูกไว้กับซ็อกเก็ต ก่อนใช้วิธีนี้ต้องใช้เมธอด socket.bind () และ socket.listen ()
วิธีการซ็อกเก็ตไคลเอนต์
ไคลเอนต์ในสถาปัตยกรรมไคลเอนต์เซิร์ฟเวอร์ร้องขอเซิร์ฟเวอร์และรับบริการจากเซิร์ฟเวอร์ สำหรับวิธีนี้มีเพียงวิธีเดียวสำหรับลูกค้า -
socket.connect(address)- วิธีนี้การเชื่อมต่อเซิร์ฟเวอร์ที่ใกล้ชิดอย่างแข็งขันหรือพูดง่ายๆว่าวิธีนี้เชื่อมต่อไคลเอนต์กับเซิร์ฟเวอร์ ที่อยู่อาร์กิวเมนต์แสดงถึงที่อยู่ของเซิร์ฟเวอร์
วิธีการทั่วไปของซ็อกเก็ต
นอกเหนือจากวิธีการซ็อกเก็ตไคลเอ็นต์และเซิร์ฟเวอร์แล้วยังมีวิธีการซ็อกเก็ตทั่วไปบางวิธีซึ่งมีประโยชน์มากในการเขียนโปรแกรมซ็อกเก็ต วิธีการซ็อกเก็ตทั่วไปมีดังนี้ -
socket.recv(bufsize)- ตามความหมายของชื่อเมธอดนี้ได้รับข้อความ TCP จากซ็อกเก็ต อาร์กิวเมนต์ bufsize ย่อมาจากขนาดบัฟเฟอร์และกำหนดข้อมูลสูงสุดที่วิธีนี้สามารถรับได้ในคราวเดียว
socket.send(bytes)- วิธีนี้ใช้ในการส่งข้อมูลไปยังซ็อกเก็ตซึ่งเชื่อมต่อกับเครื่องระยะไกล ไบต์ของอาร์กิวเมนต์จะให้จำนวนไบต์ที่ส่งไปยังซ็อกเก็ต
socket.recvfrom(data, address)- วิธีนี้รับข้อมูลจากซ็อกเก็ต ค่าสองคู่ (ข้อมูลที่อยู่) จะถูกส่งกลับโดยวิธีนี้ ข้อมูลกำหนดข้อมูลที่ได้รับและที่อยู่ระบุที่อยู่ของซ็อกเก็ตที่ส่งข้อมูล
socket.sendto(data, address)- ตามความหมายของชื่อวิธีนี้ใช้ในการส่งข้อมูลจากซ็อกเก็ต ค่าสองคู่ (ข้อมูลที่อยู่) จะถูกส่งกลับโดยวิธีนี้ ข้อมูลกำหนดจำนวนไบต์ที่ส่งและที่อยู่ระบุที่อยู่ของเครื่องระยะไกล
socket.close() - วิธีนี้จะปิดซ็อกเก็ต
socket.gethostname() - วิธีนี้จะคืนชื่อของโฮสต์
socket.sendall(data)- วิธีนี้จะส่งข้อมูลทั้งหมดไปยังซ็อกเก็ตซึ่งเชื่อมต่อกับเครื่องระยะไกล มันจะถ่ายโอนข้อมูลอย่างไม่ระมัดระวังจนกว่าจะเกิดข้อผิดพลาดและหากเกิดขึ้นก็จะใช้วิธีการ socket.close () เพื่อปิดซ็อกเก็ต
โปรแกรมสร้างการเชื่อมต่อระหว่างเซิร์ฟเวอร์และไคลเอนต์
ในการสร้างการเชื่อมต่อระหว่างเซิร์ฟเวอร์และไคลเอนต์เราจำเป็นต้องเขียนโปรแกรม Python สองโปรแกรมที่แตกต่างกันโปรแกรมหนึ่งสำหรับเซิร์ฟเวอร์และอีกโปรแกรมสำหรับไคลเอนต์
โปรแกรมฝั่งเซิร์ฟเวอร์
ในโปรแกรมซ็อกเก็ตฝั่งเซิร์ฟเวอร์นี้เราจะใช้ไฟล์ socket.bind()วิธีที่ผูกเข้ากับที่อยู่ IP และพอร์ตเฉพาะเพื่อให้สามารถรับฟังคำขอที่เข้ามาบน IP และพอร์ตนั้นได้ ต่อมาเราใช้ไฟล์socket.listen()วิธีการที่ทำให้เซิร์ฟเวอร์เข้าสู่โหมดฟัง ตัวเลขพูด 4 เป็นอาร์กิวเมนต์ของsocket.listen()วิธีการหมายความว่าการเชื่อมต่อ 4 รายการจะรอต่อไปหากเซิร์ฟเวอร์ไม่ว่างและหากซ็อกเก็ตที่ 5 พยายามเชื่อมต่อการเชื่อมต่อจะถูกปฏิเสธ เราจะส่งข้อความไปยังลูกค้าโดยใช้ไฟล์socket.send()วิธี. ในตอนท้ายเราใช้socket.accept() และ socket.close()วิธีการเริ่มต้นและปิดการเชื่อมต่อตามลำดับ ต่อไปนี้เป็นโปรแกรมฝั่งเซิร์ฟเวอร์ -
import socket
def Main():
host = socket.gethostname()
port = 12345
serversocket = socket.socket()
serversocket.bind((host,port))
serversocket.listen(1)
print('socket is listening')
while True:
conn,addr = serversocket.accept()
print("Got connection from %s" % str(addr))
msg = 'Connecting Established'+ "\r\n"
conn.send(msg.encode('ascii'))
conn.close()
if __name__ == '__main__':
Main()
โปรแกรมฝั่งไคลเอ็นต์
ในโปรแกรมซ็อกเก็ตฝั่งไคลเอ็นต์เราจำเป็นต้องสร้างวัตถุซ็อกเก็ต จากนั้นเราจะเชื่อมต่อกับพอร์ตที่เซิร์ฟเวอร์ของเรากำลังทำงาน - 12345 ในตัวอย่างของเรา หลังจากนั้นเราจะสร้างการเชื่อมต่อโดยใช้ไฟล์socket.connect()วิธี. จากนั้นใช้ไฟล์socket.recv()วิธีการไคลเอนต์จะได้รับข้อความจากเซิร์ฟเวอร์ ในที่สุดsocket.close() เมธอดจะปิดไคลเอนต์
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostname()
port = 12345
s.connect((host, port))
msg = s.recv(1024)
s.close()
print (msg.decode('ascii'))
ตอนนี้หลังจากรันโปรแกรมฝั่งเซิร์ฟเวอร์เราจะได้ผลลัพธ์ต่อไปนี้บนเทอร์มินัล -
socket is listening
Got connection from ('192.168.43.75', 49904)
และหลังจากรันโปรแกรมฝั่งไคลเอ็นต์เราจะได้ผลลัพธ์ต่อไปนี้บนเทอร์มินัลอื่น -
Connection Established
การจัดการข้อยกเว้นซ็อกเก็ตเครือข่าย
มีสองช่วงตึกคือ try และ exceptซึ่งสามารถใช้เพื่อจัดการกับข้อยกเว้นซ็อกเก็ตเครือข่าย ต่อไปนี้เป็นสคริปต์ Python สำหรับจัดการข้อยกเว้น -
import socket
host = "192.168.43.75"
port = 12345
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try:
s.bind((host,port))
s.settimeout(3)
data, addr = s.recvfrom(1024)
print ("recevied from ",addr)
print ("obtained ", data)
s.close()
except socket.timeout :
print ("No connection between client and server")
s.close()
เอาต์พุต
โปรแกรมข้างต้นสร้างผลลัพธ์ต่อไปนี้ -
No connection between client and server
ในสคริปต์ด้านบนก่อนอื่นเราสร้างวัตถุซ็อกเก็ต ตามด้วยการระบุที่อยู่ IP ของโฮสต์และหมายเลขพอร์ตที่เซิร์ฟเวอร์ของเรากำลังทำงาน - 12345 ในตัวอย่างของเรา ต่อมาลองใช้บล็อกและอยู่ข้างในโดยใช้socket.bind()เราจะพยายามผูกที่อยู่ IP และพอร์ต เรากำลังใช้socket.settimeout()วิธีการตั้งเวลารอสำหรับลูกค้าในตัวอย่างของเราเรากำลังตั้งค่า 3 วินาที ใช้บล็อกยกเว้นซึ่งจะพิมพ์ข้อความหากการเชื่อมต่อจะไม่ถูกสร้างขึ้นระหว่างเซิร์ฟเวอร์และไคลเอนต์