Python學習之旅(三十三)

2021-09-27 22:42:31 字數 4600 閱讀 6473

網路通訊是兩台計算機上的兩個程序之間的通訊,而網路程式設計就是如何在程式中實現兩台計算機的通訊

p協議負責把資料從一台計算機通過網路傳送到另一台計算機

tcp協議則是建立在ip協議之上的。tcp協議負責在兩台計算機之間建立可靠連線,保證資料報按順序到達

許多常用的更高階的協議都是建立在tcp協議基礎上的,比如用於瀏覽器的http協議、傳送郵件的smtp協議等

大多數連線都是可靠的tcp連線。建立tcp連線時,主動發起連線的叫客戶端,被動響應連線的叫伺服器

1、建立乙個基於tcp連線的socket

#

匯入socket

import

socket

#建立乙個socket

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

#建立連線,注意引數是乙個tuple,包含位址和埠號

s.connect(('

www.sina.com.cn

', 80))

tcp連線建立的是雙向通道,雙方都可以同時給對方發資料。誰先發誰後發,怎麼協調,要根據具體的協議來決定

http協議規定客戶端必須先發請求給伺服器,伺服器收到後才發資料給客戶端

傳送的文字格式必須符合http標準

2、建立tcp連線後,就可以向傳送請求,要求返回首頁的內容

#

傳送資料

3、接收伺服器返回的資料

#

接收資料

buffer =

while

true:

#每次最多接收1k位元組

d = s.recv(1024)

ifd:

else

:

break

data = b''.join(buffer)

接收資料時,呼叫recv(max)方法,一次最多接收指定的位元組數,因此,在乙個while迴圈中反覆接收,直到recv()返回空資料,表示接收完畢,退出迴圈

4、呼叫close()方法關閉socket,結束網路通訊

#

關閉連線

s.close()

儲存網頁內容到檔案

#

把網頁內容儲存到sina.html檔案

header, html = data.split(b'

\r\n\r\n

', 1)

print(header.decode('

utf-8'))

#把接收的資料寫入檔案

with open('

sina.html

', 'wb'

) as f:

f.write(html)

接收到的資料報括http頭和網頁本身,只需要把http頭和網頁分離一下,把http頭列印出來,網頁內容儲存到檔案

伺服器程序首先要繫結乙個埠並監聽來自其他客戶端的連線。如果某個客戶端連線過來了,伺服器就與該客戶端建立socket連線,隨後的通訊就靠這個socket連線了

伺服器需要同時響應多個客戶端的請求,每個連線都需要乙個新的程序或者新的執行緒來處理,否則,伺服器一次就只能服務乙個客戶端

1、建立乙個基於ipv4和tcp協議的socket

#

建立乙個基於ipv4和tcp協議的socket

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

2、繫結監聽的位址和埠

#

監聽埠

s.bind(('

127.0.0.1

', 9999))

伺服器可能有多塊網絡卡,可以繫結到某一塊網絡卡的ip位址上,也可以用0.0.0.0繫結到所有的網路位址,還可以用127.0.0.1繫結到本機位址

127.0.0.1是乙個特殊的ip位址,表示本機位址,如果繫結到這個位址,客戶端必須同時在本機執行才能連線,也就是說,外部的計算機無法連線進來

埠號需要預先指定。因為我們寫的這個服務不是標準服務,所以用9999這個埠號

注意:小於1024的埠號必須要有管理員許可權才能繫結

3、呼叫listen()方法監聽埠

傳入的引數指定等待連線的最大數量

s.listen(5)

print('

waiting for connection...

')

4、通過乙個永久迴圈接受來自客戶端的連線

while

true:

#接受乙個新連線

sock, addr =s.accept()

#建立新執行緒來處理tcp連線

t = threading.thread(target=tcplink, args=(sock, addr))

t.start()

accept()會等待並返回乙個客戶端的連線

5、建立新程序處理連線

每個連線都必須建立新執行緒(或程序)來處理,否則,單執行緒在處理連線的過程中,無法接受其他客戶端的連線

#

建立新程序處理連線

deftcplink(sock, addr):

print('

accept new connection from %s:%s...

' %addr)

sock.send(b

'welcome')

while

true:

data = sock.recv(1024)

time.sleep(1)

ifnot data or data.decode('

utf-8

') == '

exit':

break

sock.send((

'hello, %s!

' % data.decode('

utf-8

')).encode('

utf-8'))

sock.close()

print('

connection from %s:%s close.

' % addr)

連線建立後,伺服器首先發一條歡迎訊息,然後等待客戶端資料,並加上hello再傳送給客戶端

如果客戶端傳送了exit字串,就直接關閉連線

6、編寫乙個客戶端程式測試這個伺服器程式

#

tcp_client.py

import

socket

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

#建立連線

s.connect(('

127.0.0.1

', 9999))

#接收歡迎訊息

print(s.recv(1024).decode('

utf-8'))

for data in [b'

alice

', b'

bob', b'

jack']:

s.send(data)

print(s.recv(1024).decode('

utf-8'))

s.send(b

'exit')

s.close()

分別執行tcp_client.py和tcp_server.py

tcp_server.py的結果:

waiting

forconnection...

accept new connection

from 127.0.0.1:60647...

connection

from 127.0.0.1:60647close.

tcp_client.py的結果:

welcome

hello, alice!

hello, bob!

hello, jack!

CUDA學習(三十三)

最大化指令吞吐量 為了最大化指令吞吐量,應用程式應 在本節中,吞吐量以每個多處理器每個時鐘週期的操作次數給出。對於32的變形大小,一條指令對應於32個操作,所以如果n是每個時鐘週期的運算元,則指令吞吐量是每個時鐘週期n 32條指令。所有的吞吐量都是針對乙個多處理器的。它們必須乘以裝置中的多處理器數量...

學習總結 三十三

1 什麼是守護程序 程序是乙個正在執行的程式,守護程序也是乙個程序,守護程序的意思就是乙個程序保護另乙個程序 2 守護程序使用場景 1 什麼是互斥鎖 互斥鎖就是互相排斥的鎖,乙個資源被鎖了,其他子程序就無法使用 2 為什麼需要互斥鎖 因為併發帶來的資源競爭問題,當多個程序同時要操作乙個資源將會導致資...

Python 三十三 異常處理

異常處理 是指程式在出現問題時依然可以正確的執行剩餘的程式,而不會因為異常而終止程式執行。python中引進了很多用來描述和處理異常的類,稱為異常類。except 異常1 pass except 異常2 pass 常見的異常說明 syntaxerror 語法錯誤 nameerror 嘗試訪問乙個沒有...