弄懂 HTTP、Socket、TCP概念
其實在傳輸層和應用層當中還有表示層和會話層這2個層。7層網絡模型。
socket協議不是屬於計算機網絡協議。使得應用層可以直接和傳輸層進行溝通。獨立於這個模型之外,可以脫離於應用層,可以與傳輸層及以下的層建立溝通。
socket的client 和server 實現通信
上圖中左側是server端,右側是client端。
下面是使用socket_server.py和socket_client.py實現了簡單的從服務端到
客戶端的通信。運行時先運行服務端,在運行客戶端。
socket_server.py
import socket
# 網絡類型 協議
server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#綁定 ip 端口
server.bind(('0.0.0.0',8000))
#監聽
server.listen()
sock,addr=server.accept()
#獲取從客戶端發送的數據
data=sock.recv(1024)
#bytes類型
print(data.decode("utf8"))
sock.send("hello ! {}".format(data.decode("utf8")).encode("utf8"))
server.close()
sock.close()
socket_client.py
import socket
# 網絡類型 協議
client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(('127.0.0.1',8000))
client.send("xiaopang".encode("utf8"))
data=client.recv(1024)
print(data.decode("utf8"))
client.close()
socket實現聊天和多用戶連接
socket_server.py
import socket
import threading
# 網絡類型 協議
server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#綁定 ip 端口
server.bind(('0.0.0.0',8000))
#監聽
server.listen()
def handle_sock(sock,addr):
while True:
data = sock.recv(1024)
# bytes類型可以讓我們的終端去輸入
print(data.decode("utf8"))
# 這裏可以加入判斷接收的數據格式
'''
if type(data)==數據類型:
break
然後在循環之外 sock.close()
'''
re_data = input()
sock.send(re_data.encode("utf8"))
while True:
sock, addr = server.accept()
#用線程去處理新接受的連接(用戶) #參數target傳遞的是函數的名稱
client_thread=threading.Thread(target=handle_sock,args=(sock,addr))
#啓動線程
client_thread.start()
# #獲取從客戶端發送的數據 1次接受1k的數據
# data=sock.recv(1024)
# #bytes類型可以讓我們的終端去輸入
# print(data.decode("utf8"))
# re_data=input()
# sock.send(re_data.encode("utf8"))
socket_client.py
import socket
# 網絡類型 協議
client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(('127.0.0.1',8000))
# client.send("xiaopang".encode("utf8"))
while True:
re_data=input()
client.send(re_data.encode("utf8"))
#獲取從客戶端發送的數據
data=client.recv(1024)
#bytes類型可以讓我們的終端去輸入
print(data.decode("utf8"))
socket 模擬http請求的整個過程
# requests --> urlib-->socket
import socket
from urllib.parse import urlparse
def get_url(url):
#解析url
url=urlparse(url)
host=url.netloc
path=url.path
if path=="":
path="/"
#建立連接
client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect((host,80))
#發送請求
client.send("GET {} HTTP/1.1\r\nHost:{}\r\nConnection:close\r\n\r\n".format(path,host).encode("utf8"))
#將所有數據獲取完成
data=b""
while True:
d=client.recv(1024)
if d:
data+=d
else:
break
#數據是byte類型的
data=data.decode("utf8")
#可以將頭部去掉
htmldata=data.split("\r\n\r\n")[1]
print(".............htmldata...............")
print(htmldata)
print(".............................data.............")
print(data)
client.close()
if __name__=="__main__":
get_url("http://www.baidu.com")
完結
下一篇:多線程,多進程和線程池編程