Python : ขั้นตอนพื้นฐานของการสร้าง socket programming


ทำเพื่อใช้เป็น 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 แต่ละรายดูต่อไป




Previous
Next Post »