網路通訊是兩台計算機上的兩個程序之間的通訊,而網路程式設計就是如何在程式中實現兩台計算機的通訊
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、通過乙個永久迴圈接受來自客戶端的連線
whiletrue:
#接受乙個新連線
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 嘗試訪問乙個沒有...