爲什麼學習socket必定要先學習互聯網協議?python
首先C/S架構是基於網絡通訊的編程
而後網絡的核心即一堆網絡協議,也就是協議標準。若是你想開發一款基於網絡通訊的軟件,就必須遵循這些標準設計模式
socket層:socket處於應用層與傳輸層之間,提供了一些簡單的接口. 避免與操做系統之間對接,省去了至關繁瑣複雜的操做.socket在python中屬於一個模塊.爲咱們提供了這些簡單的功能.網絡
socket是什麼?架構
socket是應用層與TCP/IP協議通訊的中間軟件抽象層,它是一組接口。在設計模式中,Socket其實就是一個門面模式,它把複雜的TCP/IP協議族隱藏在Socket接口後面,對用戶來講,一組簡單的接口就是所有,讓Socket去組織數據,以符合指定的協議。socket
因此,咱們無需深刻理解tcp/udp協議,socket已經爲咱們封裝好了,咱們只須要遵循socket的規定去編程,寫出的程序天然就是遵循tcp/udp標準的。tcp
基於TCP協議的socket函數
套接字函數學習
服務端套接字函數:操作系統
import socket phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 1.服務端套接字函數 phone.bind('主機ip地址',端口號) #綁定到(主機,端口號)套接字 phone.listen() #開始TCP監聽 phone.accept() #被動接受TCP客戶的鏈接,等待鏈接的到來
客戶端套接字函數:
import socket phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)#買手機 phone.connect() #主動鏈接服務端的ip和端口 phone.connect_ex() #connect()函數的擴展版本,出錯的時候返回錯碼,而不是拋出異常
服務端和客戶端的公共用途的嵌套字函數:
phone.recv() #接受TCP數據 phone.send() #發送TCP數據 phone.recvfrom() #接受UDP數據 phone.sendto() #發送UDP數據 phone.getpeername() #接收到當前套接字遠端的地址 phone.getsockname() #返回指定套接字的參數 phone.setsockopt() #設置指定套接字的參數 phone.close() #關閉套接字
server:
import socket # 買電話 phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 默認基於TCP協議的socket # 綁定電話卡 phone.bind(('192.168.14.198',8848)) # 綁定IP地址和端口 # 開機監聽 phone.listen(5) print(111) # 等待鏈接 conn, addr = phone.accept() # 阻塞 print(conn,addr) from_client_data = conn.recv(1024) # 至多接受1024個字節 阻塞 print(f'來自客戶端{addr[0]}的消息:{from_client_data.decode("utf-8")}') to_client_data = input('>>>') conn.send(to_client_data.encode('utf-8')) conn.close() phone.close()
client
import socket # 買電話 phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 默認基於TCP協議的socket # 撥號打電話 phone.connect(('127.0.0.1',8848)) data = input('請輸入>>>') phone.send(data.encode('utf-8')) from_server_data = phone.recv(1024) print(f'來自服務端的消息:{from_server_data}') # 關閉電話 phone.close()