《計算機網(wǎng)絡——自頂向下方法》應用層——socket編程

TCP套接字編程

典型的網(wǎng)絡應用是由一對程序組成的(客戶程序和服務器程序),他們位于兩個不同的端系統(tǒng)中。當運行這兩個程序時,創(chuàng)建了一個客戶進程和一個服務器進程,同時它們通過從套接字讀出和寫入數(shù)據(jù)彼此進行通信。
網(wǎng)絡應用程序有兩類。一類是實現(xiàn)在協(xié)議標準中定義的操作;另一類網(wǎng)絡應用程序是專用的網(wǎng)絡應用程序,這種情況下程序的應用層協(xié)議并沒有公開發(fā)布在某RFC中或者其他地方。
在研發(fā)階段,開發(fā)者必須最先做的一個決定是:程序是運行在TCP上還是運行在UDP上。

UDP套接字編程

運行在不同的機器上的進程彼此通過向進程發(fā)送報文來進行通信。進程好比是一座房子,進程的套接字就好比是一扇門。應用程序位于房子中門的一側;運輸層位于該門朝外的另一側。
當使用UDP時,發(fā)送進程為分組附上目的地址是由目的主機IP和目的地套接字端口號組成的。同時,發(fā)送方的源地址也是由源主機IP和端口號組成的,該地址也要附在分組上(由底層操作系統(tǒng)完成)。


image

示例

  • client.py
from socket import *
serverName = '192.168.0.5'
serverPort = 12000
clientSocket = socket(AF_INET, SOCK_DGRAM)
message = input("請輸入一串小寫字母:")
clientSocket.sendto(message.encode(), (serverName, serverPort))
modifiedMessage, serverAddress = clientSocket.recvfrom(2048)
print(modifiedMessage.decode())
clientSocket.close()
  • server.py
from socket import *
serverPort = 12000
serverSocket = socket(AF_INET, SOCK_DGRAM)
serverSocket.bind(('', serverPort))
print("服務器準備就緒:")
while True:    
    message, clientAddress = serverSocket.recvfrom(2048)
    modifiedMessage = message.upper()
    serverSocket.sendto(modifiedMessage, clientAddress)

TCP套接字編程

與UDP不同的是,TCP是一個面向連接的協(xié)議。則意味著在客戶和服務器能夠開始互相發(fā)送數(shù)據(jù)之前,他們先要握手和創(chuàng)建一個TCP連接。TCP連接的一端與客戶套接字相聯(lián)系另一端與服務器套接字相聯(lián)系。當創(chuàng)建TCP連接時,我們將其與客戶套接字地址和服務器套接字地址關聯(lián)起來。使用創(chuàng)建的TCP連接,當一側要向另一側發(fā)送數(shù)據(jù)時,它只需經過其套接字將數(shù)據(jù)丟給TCP連接。


image

隨著服務器進程的運行,客戶程序能夠向服務器發(fā)起一個TCP連接。這是由客戶程序通過創(chuàng)建一個TCP套接字完成的。當客戶生成其TCP套接字時,它指定了服務中的歡迎套接字地址,即服務器主機IP地址及其套接字的端口號。生成套接字后,該客戶發(fā)起一個三次握手并創(chuàng)建與服務器的一個TCP連接。發(fā)生在運輸層的三次握手對于客戶和服務器時完全透明的。


image

示例

  • client.py
from socket import *
serverName = '192.168.0.5'
serverPort = 13000
clientSocket = socket(AF_INET, SOCK_STREAM)
clientSocket.connect((serverName, serverPort))
message = input("請輸入一段小寫字母:")
clientSocket.send(message.encode())
modifiedMessage = clientSocket.recv(1024)
print(modifiedMessage.decode())
  • server.py
from socket import *
serverPort = 13000
serverSocket = socket(AF_INET, SOCK_STREAM)
serverSocket.bind(("", serverPort))
serverSocket.listen(1)
while True:    
    connectionSocket, address = serverSocket.accept()
    message = connectionSocket.recv(1024)
    modifiedMessage = message.upper()
    connectionSocket.send(modifiedMessage)
    connectionSocket.close()
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容