socket介紹
在計算機通信領域,socket 被翻譯爲“套接字”,它是計算機之間進行通信的一種約定或一種方式。通過 socket 這種約定,一臺計算機可以接收其他計算機的數據,也可以向其他計算機發送數據。
socket 的典型應用就是 Web 服務器和瀏覽器:瀏覽器獲取用戶輸入的URL,向服務器發起請求,服務器分析接收到的URL,將對應的網頁內容返回給瀏覽器,瀏覽器再經過解析和渲染,就將文字、圖片、視頻等元素呈現給用戶。
使用socket開啓服務端,通過網頁查看,並使服務端向網頁返回消息
import socket
server_sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server_sk.bind(('127.0.0.1',9999))
server_sk.listen(128)
#bind()函數把一個地址族中的特定地址賦給socket。例如對應AF_INET、AF_INET6就是把一個ipv4或ipv6地址和端口號組合賦給socket。
while True:
#等待鏈接
client_sk,addrs = server_sk.accept()
content = client_sk.recv(1024).decode('utf-8')
#連接後向用戶發送消息
msg1 = 'HTTP/1.1 200 OK\r\n'.encode('utf-8')#設置響應首行
msg2 = 'Content-Type:text/html;charset=utf-8\r\n'.encode('utf-8')#設置響應頭
#告知瀏覽器,返回類型爲文本類型的html,並且以utf-8編碼進行解碼
msg3 = '\r\n'.encode('utf-8')#響應空行
msg4 = '你好'.encode('utf-8')#設置響應體
client_sk.send(msg1)
client_sk.send(msg2)
client_sk.send(msg3)
client_sk.send(msg4)
client_sk.close()
根據請求頭的不同,返回不同的頁面
import socket
sever_sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sever_sk.bind(('127.0.0.1', 9999))
sever_sk.listen(128)
def index(url):
s = '這是{}頁面'.format(url)
return s.encode('utf-8')
def home(url):
s = '這是{}頁面'.format(url)
return s.encode('utf-8')
def page(url):
s = '這是{}頁面'.format(url)
return s.encode('utf-8')
# 1.定義一個url和執行函數對應關係的列表
url_func_lst = [
('/index', index),
('/home', home),
('/page',page)
]
while True:
new_sk, addr = sever_sk.accept()
content = new_sk.recv(1024)
content = content.decode(encoding='utf-8')
data = content.split('\r\n')[0]
url = data.split()[1]
# 2.定義一個變量來接受對應的函數名稱
func = None
# 3.變量列表,查收是否有對應的url
for url_func in url_func_lst:
if url_func[0] == url:
func = url_func[1]
break
if func:
response = func(url)
else:
response = b'404 not found...'
new_sk.send(b'HTTP/1.1 200 OK\r\n')
new_sk.send(b'Content-Type: text/html;charset=utf-8\r\n')
new_sk.send(b'\r\n')
new_sk.send(response)
new_sk.close()
返回具體的網頁
#只需要把對應的文件讀取進來,存放到一個變量中,將這個變量傳遞回去即可
def index(url):
with open('index.html', mode='rb') as f:
data = f.read()
return data