天天看點

python 網絡程式設計 socket初識socket: socket參數詳解:

初識socket:

首先我們寫的網絡程式設計,屬于應用層,當我們寫好了程式後,需要将資料發送給運輸層,

但是應用層和運輸層通信需要遵循相關協定,關鍵是我們不了解運輸層的協定,那該怎麼辦呢?是以提供了Socket層,Socket英文插座,插口,套接字意思。

Socket是應用層與TCP/IP協定族通信的中間軟體抽象層,它把複雜的TCP/IP協定族隐藏在Socket接口後面,對使用者來說,讓Socket去組織資料,以符合指定的協定。(面向對象的特點,我們隻負責編寫邏輯即可,不用去管TCP/IP具體的格式,Sockect會幫我們做)。

python 網絡程式設計 socket初識socket: socket參數詳解:

 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.要先運作服務端,然後在運作用戶端