初識socket:
首先我們寫的網絡程式設計,屬于應用層,當我們寫好了程式後,需要将資料發送給運輸層,
但是應用層和運輸層通信需要遵循相關協定,關鍵是我們不了解運輸層的協定,那該怎麼辦呢?是以提供了Socket層,Socket英文插座,插口,套接字意思。
Socket是應用層與TCP/IP協定族通信的中間軟體抽象層,它把複雜的TCP/IP協定族隐藏在Socket接口後面,對使用者來說,讓Socket去組織資料,以符合指定的協定。(面向對象的特點,我們隻負責編寫邏輯即可,不用去管TCP/IP具體的格式,Sockect會幫我們做)。
socket參數詳解:
family | 位址系列應為AF_INET(預設值),AF_INET6,AF_UNIX,AF_CAN或AF_RDS。 (AF_UNIX 域實際上是使用本地 socket 檔案來通信) |
type | 套接字類型應為SOCK_STREAM(預設值),SOCK_DGRAM,SOCK_RAW或其他SOCK_常量之一。 SOCK_STREAM 是基于TCP的,有保障的(即能保證資料正确傳送到對方)面向連接配接的SOCKET,多用于資料傳送。 SOCK_DGRAM 是基于UDP的,無保障的面向消息的socket,多用于在網絡上發廣播資訊。 |
我們來模拟一下QQ聊天環境:
服務端:
import socket
server_sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_sk.bind(('10.10.65.176', 9953)) # 服務端的是綁定----->bind
server_sk.listen(128)
new_socket, addr = server_sk.accept()
print(addr)
while True: # 設定一個while循環使得可以連續聊天
# 發送消息
ret = new_socket.recv(1024).decode('utf-8')
print('用戶端:', ret)
content = input('請輸入内容>>>>>')
new_socket.send(content.encode('utf-8'))
if content == 'b': # 設定一個退出
break
new_socket.close()
server_sk.close()
用戶端:
import socket
client_sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_sk.connect(('10.10.65.176', 9953)) # 用戶端的是------>connect
# 發送消息
while True:
content = input('請輸入----->')
client_sk.send(content.encode('utf-8'))
ret = client_sk.recv(1024).decode('utf-8')
print('服務端:', ret)
if content == 'b':
break
client_sk.close()
注意事項:
1.socket.SOCK_STREAM是基于CTP協定的
2. 服務端要綁定ip位址和端口,而服務端是連接配接伺服器的ip和端口
3.服務端和用戶端的ip位址和端口号要一緻
4.要先運作服務端,然後在運作用戶端