ทำเพื่อใช้เป็น tutorial สำหรับขั้นตอนการเขียน socket programming ด้วยภาษา Python
compatible กับ Python2/3
ขั้นตอนสำหรับ Client side
1. สร้าง socket instance
import socket
sck_instance = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ความหมาย
socket.AF_INET = address family ที่ใช้ IPV4
socket.SOCK_STREAM = เป็นการสื่อสารแบบ connection oriented ใช้ TPC data package
2. เติม error handler
import socket
import sys # for exiting
try :
sck_instance = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error ,message :
print(message[0], message[1])
sys.exit()
3. ติดต่อกับ Server
host = 'www.google.com'
port = 80
try:
remote_ip = socket.gethostbyname( host )
except socket.gaierror:
#could not resolve
print('Hostname could not be resolved. Exiting')
sys.exit()
print('Ip address of ' + host + ' is ' + remote_ip)
#Connect to remote server
sck_instance.connect((remote_ip , port))
4. ส่งข้อมูล
#Send some data to remote server
message = "GET / HTTP/1.1\r\n\r\n"
try :
#Send the whole string
sck_instance.sendall(message)
except socket.error:
#Sending failed
print('Sending failed')
sys.exit()
print('Message send successfully')
คำอธิบาย
ในตัวอย่างเป็นการสื่อสารกับ web server (http server) ก็เลยใช้ message ที่เป็น http header ส่งไป
5. รับข้อมูล
#Now receive data
reply = sck_instance.recv(4096)
print(reply)
คำอธิบาย
สร้างพื้นที่ไว้รองรับขนาด 4096 (4K) bytes ซึ่งคาดเอาว่าหน้าเว็บเพจ 1 หน้า น่าจะมีขนาดประมาณนี้ จะใช้มาก-น้อยกว่านี้ก็กำหนดได้ตามความเหมาะสม
6. ปิด
#Now receive data
sck_instance.close()
ขั้นตอนการสร้าง Server side
1. สร้าง socket instance จะเหมือนกับ Client side
2. bind address และ port
HOST = "" # means all availables
PORT = 9999 # whatever you want except privileged ports
try:
sck_instance.bind((HOST, PORT))
except socket.error , msg:
print('Bind failed. Error Code : ' + str(msg[0]) + ' Message ' + msg[1])
sys.exit()
print('Socket bind complete')
3. รอรับการติดต่อ
sck_instance.listen(10)
print('Socket now listening')
#wait for connection
conn, addr = sck_instance.accept()
#display client information
print( 'Connected with ' + addr[0] + ':' + str(addr[1])
ความหมาย
ตัวเลข 10 ในคำสั่ง sck_instance.listen(10) หมายถึงจำนวน client ที่สามารถติดต่อเข้ามาพร้อมกัน
4. โต้ตอบ
#reply to the client
data = conn.recv(1024)
conn.sendall(data)
#closing connection after sending data to client
conn.close()
5. ปิด
sck_instance.close()
Live Server หรือ Always on Server
คือ Server ที่ทำงานตลอดเวลา ทำได้โดยการเพิ่ม loop เข้าไป ในขั้นตอนที่ 4
import socket
import sys
HOST = ''
PORT = 9999
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.bind((HOST, PORT))
except socket.error , msg:
sys.exit()
s.listen(10)
while 1:
conn, addr = s.accept()
print 'Connected with ' + addr[0] + ':' + str(addr[1])
data = conn.recv(1024)
reply = 'OK...' + data
if not data:
break
conn.sendall(reply)
conn.close()
s.close()
สิ่งที่อาจต้องพิจารณาต่อไปคือการจัดการกับ client ที่อาจมีพฤติกรรมต่างกัน ซึ่งอาจทดลองโดยการสร้าง thread ขึ้นมาเพื่อรองรับ client แต่ละรายดูต่อไป
Sign up here with your email
ConversionConversion EmoticonEmoticon