網路通訊——>TCP協議和UDP協議的客戶端與服務端之間的建立
阿新 • • 發佈:2018-12-22
網路程式設計
OSI有七層模型:它從低到高分別是:物理層、資料鏈路層、網路層、傳輸層、會話層、表示層和應用層。如下圖:
網路程式設計的三要素:
1、IP地址
## 獲取ip地址和主機名的方式
#需要匯入socket模組
import socket
name = socket.gethostname()
ip = socket.gethostbyname()
print(name,ip)
2、埠號:
0–65526是有效埠,0–1024是系統使用或者保留埠
3、協議:通訊的方式,例如:TCP DUP
TCP的優缺點:需要建立連線、速度慢、但是可靠安全。
UDP的優缺點:不需要建立連線、速度快、不可靠不安全、只管發不管對方是否收到。
下面是TCP協議和UDP協議的客戶端和服務端建立連線
TCP通訊程式碼
#建立TCP協議的客戶端 import socket #1、建立socket物件,第一個引數ipv4協議,第二個面向流的TCP協議 s = socket.socket(socket.AF_INET,sock.SOCK_STREAM) # 2、建立連線:ip地址和埠號(連線那臺計算機就寫它的ip和埠號,本機的ip:“127.0.0.1”) s.connect(('127.0.0.1',8001)) # 3、傳送資料 while True: data = input("客戶端發出請求:") #向客戶端傳送資料 s.send(data.encode()) # 接收客戶端的資料 data1 = s.recv(1024) print(data1.decode('utf-8')) # 輸入byebye結束死迴圈 if data1 == b'byebye': break s.close()
### 建立TCP的服務端 import socket s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #繫結客戶端的IP地址和埠 s.bind(('127.0.0.1',8848)) #監聽:接收多少個客戶端 s.listen(2) #接收客戶端的請求 cilent,addres = s.accept() while True: #接收客戶端發來的資料 # 使用cilent客戶端而不是使用s服務端是因為服務端面對很多客戶端, # 所以不能使用服務端,否則不知道回覆給那個客戶端 data1 = cilent.recv(1024) print(data1.decode('utf-8')) #伺服器響應客戶端 data2= input('伺服器響應:') cilent.send(data2.encode('utf-8')) if data1 == b'byebye': break s.close()
以上是TCP協議的客戶端和服務端建立連線,可以向qq一樣互發訊息
#UDP客戶端
import socket
# 這點需要注意的是第二個引數與TCP的是不一樣的
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
while True:
data = input('>>>:')
s.sendto(data.encode(),('10.8.156.43',8000))
data1,addr1= s.recvfrom(1024)
print(data1.decode(),addr1)
if data1 == b'byebye':
break
s.close()
#UDP協議服務端
import socket
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.bind(('10.8.156.43',8000))
while True:
data,addr = s.recvfrom(1024)
print(data.decode(),addr)
data1 = input('>>>:')
s.sendto(data1.encode(),addr)
if data == b'byebye':
break
s.close()
UDP建立連線與TCP建立連線相比不需要客戶端發出連線請求,服務端也不需要監聽。