基於TCP協議的套接字程式設計

2022-01-13 05:40:56 字數 3309 閱讀 1073

socket是應用層與tcp/ip協議族通訊的中間軟體抽象層,它是一組介面。在設計模式中,socket其實就是乙個門面模式,它把複雜的tcp/ip協議族隱藏在socket介面後面,對使用者來說,一組簡單的介面就是全部,讓socket去組織資料,以符合指定的協議。

socket模板已經為我們封裝好了,我們只需要遵循socket的規定去程式設計,寫出的程式自然就是遵循tcp/udp標準的。

s都為通過socket模組生成

import socket

# socket_family 可以是 af_unix 或 af_inet。socket_type 可以是 sock_stream 或 sock_dgram。protocol 一般不填,預設值為 0

socket.socket(socket_family, socket_type, protocal=0)

# 獲取tcp/ip套接字

tcpsock = socket.socket(socket.af_inet, socket.sock_stream)

# 獲取udp/ip套接字

udpsock = socket.socket(socket.af_inet, socket.sock_dgram)

# 由於 socket 模組中有太多的屬性。我們在這裡破例使用了'from module import *'語句。使用 'from socket import *',我們就把 socket 模組裡的所有屬性都帶到我們的命名空間裡了,這樣能大幅減短我們的**

s = socket(af_inet, sock_stream)

方法

用途s.bind()

繫結(主機,埠號)到套接字 注:(127.0.0.1)表示本地ip

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()

建立乙個與該套接字相關的檔案

import socket

#1、買手機

phone = socket.socket(socket.af_inet,

socket.sock_stream) #tcp稱為流式協議,udp稱為資料報協議sock_dgram

# print(phone)

#2、插入/繫結手機卡

# phone.setsockopt(socket.sol_socket,socket.so_reuseaddr,1)

phone.bind(('127.0.0.1', 8080))

#3、開機

phone.listen(5) # 半連線池,限制的是請求數

#4、等待**連線

print('start....')

while true: # 連線迴圈

conn, client_addr = phone.accept() #(三次握手建立的雙向連線,(客戶端的ip,埠))

# print(conn)

print('已經有乙個連線建立成功', client_addr)

#5、通訊:收\發訊息

while true: # 通訊迴圈

try:

print('服務端正在收資料...')

data = conn.recv(1024) #最大接收的位元組數,沒有資料會在原地一直等待收,即傳送者傳送的資料量必須》0bytes

# print('===>')

if len(data) == 0: break #在客戶端單方面斷開連線,服務端才會出現收空資料的情況

print('來自客戶端的資料', data)

conn.send(data.upper())

except connectionreseterror:

break

#6、掛掉**連線

conn.close()

#7、關機

phone.close()

import socket

#1、買手機

phone = socket.socket(socket.af_inet, socket.sock_stream)

# print(phone)

#2、撥**

phone.connect(('127.0.0.1', 8080)) # 指定服務端ip和埠

#3、通訊:發\收訊息

while true: # 通訊迴圈

msg = input('>>: ').strip() #msg=''

if len(msg) == 0: continue

phone.send(msg.encode('utf-8'))

# print('has send----->')

data = phone.recv(1024)

# print('has recv----->')

print(data)

#4、關閉

phone.close()

基於TCP協議的套接字程式設計

基於socket通訊的內部演算法,當傳送的訊息為空的時候,接收端不會收到訊息,而傳送端向下執行到recv,兩端出於僵持狀態。所以在傳送端需要有個判斷,如果傳送的為空,則重新輸入傳送內容。socket是應用層與tcp ip協議通訊的中間軟體抽象層,它是一組介面。import socket 買手機 ph...

基於tcp協議的套接字

簡單版本 一 服務端 import socket 1 買手機 拿到套接字物件,用來鏈結建立鏈結 phone socket.socket socket.af inet,socket.sock stream tcp稱為流式協議sock stream,udp稱為資料報協議sock dgram print ...

基於tcp的套接字程式設計

伺服器端 1 author kelvin2 date 2019 1 28 22 10 3from socket import 4 server socket.socket af inet,sock stream 5 server.setsockopt sol socket,so reuseaddr,...