python socket編程

弄懂 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")


完結

下一篇:多線程,多進程和線程池編程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章