1. 程式人生 > 實用技巧 >socket(套接字)

socket(套接字)

目錄

socket(套接字)

socket簡稱(套接字) 是程序間通訊的一種方式,它與其他程序間通訊的一個主要不同是:

它能實現不同主機間的程序通訊,我們網路上各種服務大多都是基於socket完成通訊的

網頁,微信,email

socket()模組函式用法
1 import socket
 2 socket.socket(socket_family,socket_type,protocal=0)
 3 socket_family 可以是 AF_UNIX 或 AF_INET。socket_type 可以是 SOCK_STREAM 或 SOCK_DGRAM。protocol 一般不填,預設值為 0。
 4 
 5 獲取tcp/ip套接字
 6 tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 7 
 8 獲取udp/ip套接字
 9 udpSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
10 
11 由於 socket 模組中有太多的屬性。我們在這,,裡破例使用了'from module import *'語句。使用 'from socket import *',我們就把 socket 模組裡的所有屬性都帶到我們的名稱空間裡了,這樣能 大幅減短我們的程式碼。
12 例如tcpSock = socket(AF_INET, SOCK_STREAM)
服務端套接字函式
s.bind()  繫結(主機,埠號)到套接字

s.listen()  開始TCP監聽

s.accept() 被動接受TCP客戶的連線,阻塞式等待連線的到來
客戶端套接字函式
s.connect()  主動初始化TCP伺服器連線

s.connect_ex()  connect()函式的擴充套件版本,出錯時返回出錯碼,而不是丟擲異常
公共用途的套接字函式
s.recv() 接受TCP資料

s.send() 傳送TCP資料(send在待發送資料量大於己端快取區剩餘空間時,資料丟失,不會發完)

s.sendall() 傳送完整的TCP資料(本質就是迴圈呼叫send,sendall在待發送資料量大於己端快取區剩餘空間時,資料不丟失,迴圈呼叫send直到發完)

s.recvfrom() 接受UDP資料

s.sendto() 傳送UDP資料

s.getpeername() 連線到當前套接字的遠端地址

s.getsockname() 當前套接字地址

s.getsockopt() 返回指定套接字的引數

s.setsockopt() 設定指定套接字的引數

s.close() 關閉套接字
面向鎖的套接字方法
s.setblocking()     設定套接字的阻塞與非阻塞模式
s.settimeout()      設定阻塞套接字操作的超時時間
s.gettimeout()      得到阻塞套接字操作的超時時間
面向檔案的套接字函式
s.fileno()          套接字的檔案描述符
s.makefile()        建立一個與該套接字相關的檔案
基於TCP套接字

server

import socket

# 1、買手機
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # SOCK_STREAM=》TCP協議

# 2、插手機卡
phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #就是它,在bind前加

phone.bind(("127.0.0.1", 8080))  # 本地迴環

# 3、開機
phone.listen(5)
print('starting %s:%s' %("127.0.0.1", 8080))

# 4、等電話連結=>連結迴圈
while True:
    conn, client_addr = phone.accept()
    print(client_addr)
    # 5、收/發訊息=>通訊迴圈
    while True:
        try:
            data = conn.recv(1024)  # 最大接收的位元組個數
            if len(data) == 0:  # 針對linux系統
                break
            print("收到的客戶端資料:", data.decode('utf-8'))
            conn.send(data.upper())
        except Exception:  # 針對windows系統
            break

    # 6、關閉
    conn.close()  # 掛電話
phone.close()  # 關機

client

import socket

# 1、買手機
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # SOCK_STREAM=》TCP協議

# 2、撥電話
phone.connect(("127.0.0.1", 8080))

# 3、發/收訊息=>通訊迴圈
while True:
    msg = input(">>: ").strip()
    phone.send(msg.encode('utf-8'))
    data = phone.recv(1024)
    print("服務的返回的資料:", data.decode('utf-8'))

# 4、關閉
phone.close()