013 網路程式設計

2021-09-22 18:55:32 字數 4773 閱讀 8185

ip 位址就是標識網路中裝置的乙個位址,好比現實生活中的家庭位址。

ipv4 是目前使用的ip位址

ipv6 是未來使用的ip位址

ipv4 是由點分十進位制組成

ipv6 是由冒號十六進製制組成

ip 位址的作用是標識網路中唯一的一台裝置的,也就是說通過ip位址能夠找到網路中某台裝置。

說明:ifconfig 和 ipconfig 都是檢視網絡卡資訊的,網絡卡資訊中包括這個裝置對應的ip位址

說明:說明:

埠是傳輸資料的通道,好比教室的門,是資料傳輸必經之路。

那麼如何準確的找到對應的埠呢?

其實,每乙個埠都會有乙個對應的埠號,好比每個教室的門都有乙個門牌號,想要找到埠通過埠號即可。

作業系統為了統一管理這麼多埠,就對埠進行了編號,這就是埠號,埠號其實就是乙個數字,好比我們現實生活中的門牌號,

埠號有65536個。

那麼最終飛秋之間進行資料通訊的流程是這樣的,通過ip位址找到對應的裝置,通過埠號找到對應的埠,然後通過埠把資料傳輸給應用程式。

埠號可以標識唯一的乙個埠。

知名埠號是指眾所周知的埠號,範圍從0到1023。

一般程式設計師開發應用程式使用埠號稱為動態埠號, 範圍是從1024到65535。

之前我們學習了 ip 位址和埠號,通過 ip 位址能夠找到對應的裝置,然後再通過埠號找到對應的埠,再通過埠把資料傳輸給應用程式,這裡要注意,資料不能隨便傳送,在傳送之前還需要選擇乙個對應的傳輸協議,保證程式之間按照指定的傳輸規則進行資料的通訊, 而這個傳輸協議就是我們今天學習的 tcp。

tcp 的英文全拼(transmission control protocol)簡稱傳輸控制協議,它是一種面向連線的、可靠的、基於位元組流的傳輸層通訊協議。

tcp 通訊步驟:

建立連線

傳輸資料

關閉連線

說明:tcp 通訊模型相當於生活中的』打**『,在通訊開始之前,一定要先建立好連線,才能傳送資料,通訊結束要關閉連線。

通訊雙方必須先建立好連線才能進行資料的傳輸,資料傳輸完成後,雙方必須斷開此連線,以釋放系統資源。

tcp 採用傳送應答機制

超時重傳

錯誤校驗

流量控制和阻塞管理

socket (簡稱 套接字) 是程序之間通訊乙個工具,好比現實生活中的插座,所有的家用電器要想工作都是基於插座進行,程序之間想要進行網路通訊需要基於這個 socket。

負責程序之間的網路資料傳輸,好比資料的搬運工。

不誇張的說,只要跟網路相關的應用程式或者軟體都使用到了 socket 。

為了保證資料的完整性和可靠性我們使用 tcp 傳輸協議進行資料的傳輸,為了能夠找到對應裝置我們需要使用 ip 位址,為了區別某個埠的應用程式接收資料我們需要使用埠號,程序之間網路資料的傳輸可以通過 socket 來完成, socket 就是程序間網路資料通訊的工具。

tcp 網路應用程式開發分為:

說明:客戶端程式是指執行在使用者裝置上的程式 服務端程式是指執行在伺服器裝置上的程式,專門為客戶端提供資料服務。

步驟說明:

建立客戶端套接字物件

和服務端套接字建立連線

傳送資料

接收資料

關閉客戶端套接字

import socket

if __name__ == '__main__':

# 建立tcp客戶端套接字

# 1. af_inet:表示ipv4

# 2. sock_stream: tcp傳輸協議

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

# 和服務端應用程式建立連線

tcp_client_socket.connect(("192.168.131.62", 8080))

# **執行到此,說明連線建立成功

# 準備傳送的資料

send_data = "你好服務端,我是客戶端小黑!".encode("gbk")

# 傳送資料

tcp_client_socket.send(send_data)

# 接收資料, 這次接收的資料最大位元組數是1024

recv_data = tcp_client_socket.recv(1024)

# 返回的直接是服務端程式傳送的二進位制資料

print(recv_data)

# 對資料進行解碼

recv_content = recv_data.decode("gbk")

print("接收服務端的資料為:", recv_content)

# 關閉套接字

tcp_client_socket.close()

步驟說明:

建立服務端端套接字物件

繫結埠號

設定監聽

等待接受客戶端的連線請求

接收資料

傳送資料

關閉套接字

import socket

if __name__ == '__main__':

# 建立tcp服務端套接字

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

# 設定埠號復用,讓程式退出埠號立即釋放

tcp_server_socket.setsockopt(socket.sol_socket, socket.so_reuseaddr, true)

# 給程式繫結埠號

tcp_server_socket.bind(("", 8989))

# 設定監聽

# 不需要讓客戶端進行等待建立連線

# listen後的這個套接字只負責接收客戶端連線請求,不能收發訊息,收發訊息使用返回的這個新套接字來完成

tcp_server_socket.listen(128)

# 等待客戶端建立連線的請求, 只有客戶端和服務端建立連線成功**才會解阻塞,**才能繼續往下執行

# 1. 專門和客戶端通訊的套接字: service_client_socket

service_client_socket, ip_port = tcp_server_socket.accept()

# **執行到此說明連線建立成功

print("客戶端的ip位址和埠號:", ip_port)

# 接收客戶端傳送的資料, 這次接收資料的最大位元組數是1024

recv_data = service_client_socket.recv(1024)

# 獲取資料的長度

recv_data_length = len(recv_data)

print("接收資料的長度為:", recv_data_length)

# 對二進位制資料進行解碼

recv_content = recv_data.decode("gbk")

print("接收客戶端的資料為:", recv_content)

# 準備傳送的資料

send_data = "ok, 問題正在處理中...".encode("gbk")

# 傳送資料給客戶端

service_client_socket.send(send_data)

# 關閉服務與客戶端的套接字, 終止和客戶端通訊的服務

service_client_socket.close()

# 關閉服務端的套接字, 終止和客戶端提供建立連線請求的服務

tcp_server_socket.close()

tcp 網路應用程式開發分為客戶端程式開發和服務端程式開發。

主動發起建立連線請求的是客戶端程式

等待接受連線請求的是服務端程式

當 tcp 客戶端程式想要和 tcp 服務端程式進行通訊的時候必須要先建立連線

tcp 客戶端程式一般不需要繫結埠號,因為客戶端是主動發起建立連線的。

tcp 服務端程式必須繫結埠號,否則客戶端找不到這個 tcp 服務端程式。

listen 後的套接字是被動套接字,只負責接收新的客戶端的連線請求,不能收發訊息。

當 tcp 客戶端程式和 tcp 服務端程式連線成功後, tcp 伺服器端程式會產生乙個新的套接字,收發客戶端訊息使用該套接字。

關閉 accept 返回的套接字意味著和這個客戶端已經通訊完畢。

關閉 listen 後的套接字意味著服務端的套接字關閉了,會導致新的客戶端不能連線服務端,但是之前已經接成功的客戶端還能正常通訊。

當客戶端的套接字呼叫 close 後,伺服器端的 recv 會解阻塞,返回的資料長度為0,服務端可以通過返回資料的長度來判斷客戶端是否已經下線,反之服務端關閉套接字,客戶端的 recv 也會解阻塞,返回的資料長度也為0。

當建立乙個tcp socket物件的時候會有乙個傳送緩衝區和乙個接收緩衝區,這個傳送和接收緩衝區指的就是記憶體中的一片空間。

send是不是直接把資料發給服務端?

不是,要想發資料,必須得通過網絡卡傳送資料,應用程式是無法直接通過網絡卡傳送資料的,它需要呼叫作業系統介面,也就是說,應用程式把傳送的資料先寫入到傳送緩衝區(記憶體中的一片空間),再由作業系統控制網絡卡把傳送緩衝區的資料傳送給服務端網絡卡 。

recv是不是直接從客戶端接收資料?

不是,應用軟體是無法直接通過網絡卡接收資料的,它需要呼叫作業系統介面,由作業系統通過網絡卡接收資料,把接收的資料寫入到接收緩衝區(記憶體中的一片空間),應用程式再從接收快取區獲取客戶端傳送的資料。

說明:不管是recv還是send都不是直接接收到對方的資料和傳送資料到對方,傳送資料會寫入到傳送緩衝區,接收資料是從接收緩衝區來讀取,傳送資料和接收資料最終是由作業系統控制網絡卡來完成。

hive0 13網路介面安裝

安裝好hive 0.13以後,在.lib下找不到hive hwi 0.13.1.war 那該怎麼辦?2.修改配置檔案hive site.xml hive.hwi.war.file lib hive hwi 0.13.1.war this sets the path to the hwi war fi...

39 網路程式設計

http協議,hyper text transfer protocol 超文字傳輸協議 是用於從全球資訊網伺服器傳送超文字到本地瀏覽器的傳輸議,http是乙個應用層協議,由請求和響應構成,是乙個標準的客戶端伺服器模型。c s模式 client和server常常分別處在相距很遠的兩台計算機上,clie...

2018 4 15 網路程式設計

單純的客戶端服務端有個侷限性,a客戶端連線上以後,未處理完之前,b客戶端連線只有等待 所以服務端最好將每個客戶端封裝到乙個執行緒中 class picthread implements runnable public void run outputstream out s.getoutputstre...