一、實驗目的
- 了解Socket通信的概念,掌握Socket通信的編程方法
- 理解TCP和UDP協議的工作原理與工作過程
- 編寫基於TCP和UDP的客戶/服務器的程序,來了解兩者的工作流程
- 要求能夠在自己的電腦上運行程序並進行數據傳輸
二、實驗內容
-
閱讀API編程 PPT。了解 socket 編程的基本知識。
-
編寫基於 TCP 的客戶/服務器程序。
-
編寫基於 UDP 的客戶/服務器程序。
三、實驗原理
C 庫中包含了用語網絡通信的 socket 套接字。Socket 套接字分為流式套接口、 數據報套接口及原始套接口 3 類,本實驗中將涉及到前兩者:
流式套接口定義了一種可靠的面向連接的服務,實現了無差錯無重復的順序數 據傳輸(TCP)。
數據報套接口定義了一種無連接的服務, 數據通過相互獨立的報文進行傳輸, 是無序的, 並且不保證可靠,無差錯(UDP)。
四、實驗步驟
(一)基於UDP的客戶/服務器編寫
(二)基於TCP的客戶/服務器編寫
五、實驗結果及分析
(一)基於UDP的客戶/服務器
客戶端代碼
from socket import *
serverName = 'localhost'
serverPort = 12000
clientSocket = socket(AF_INET, SOCK_DGRAM)
message = input()
clientSocket.sendto(message.encode(), (serverName, serverPort))
modifiedMessage, serverAddress = clientSocket.recvfrom(2048)
print('From Server: ', modifiedMessage.decode())
clientSocket.close()
服務器端代碼
from socket import *
serverPort=12000
serverSocket=socket(AF_INET,SOCK_DGRAM)
serverSocket.bind(('',serverPort))
print("The srever is ready to receive")
while True:
message,clientAddress=serverSocket.recvfrom(2048)
modifiedMessage=message.decode().upper()
serverSocket.sendto(modifiedMessage.encode(),clientAddress)
測試結果
(二)基於TCP的客戶/服務器編寫
客戶端代碼
from socket import *
serverName = 'localhost'
serverPort = 12000
clientSocket = socket(AF_INET, SOCK_STREAM)
clientSocket.connect((serverName, serverPort))
sentence = input()
clientSocket.send(sentence.encode())
modifiedSentence = clientSocket.recv(1024)
print('From Server: ', modifiedSentence.decode())
clientSocket.close()
服務器端代碼
from socket import *
serverPort = 12000
serverSocket = socket(AF_INET,SOCK_STREAM)
serverSocket.bind(('',serverPort))
serverSocket.listen(1)
print('The server is ready to receive')
while True:
connectionSocket, addr = serverSocket.accept()
sentence = connectionSocket.recv(1024)
capitalizedSentence = sentence.upper()
connectionSocket.send(capitalizedSentence)
connectionSocket.close()
測試結果
七、實驗心得體會
通過該實驗,了解了socket編程的基本方法,學習了利用TCP和UDP進行簡單的數據傳輸。編寫基於TCP和UDP的客戶/服務器的程序,了解了兩者的工作流程和協議工作原理。在實驗過程中,也對應用層有了更直觀和深入的理解。