1.tcp基本語法
# ### TCP協議 客戶端
import socket
# 1.創建一個socket對象
sk = socket.socket()# 2.與服務端建立連接
sk.connect( ("127.0.0.1" , 9000) )# 3.收發數據的邏輯
"""發送的數據類型是二進制字節流"""
"""b開頭的字符串是二進制字節流格式,要求字符類型必須是ascii編碼"""
sk.send("今天我們學習網絡編程".encode())?# 接受數據
res = sk.recv(1024)
print(res.decode())
# 4.關閉連接
sk.close()
?# ### socket 服務端
"""
一發一收是一對,不匹配會導致數據異常
send 發送 recv 接受
"""
import socket# 1.創建一個socket對象
sk = socket.socket()# 一個端口綁定多個程序(僅在測試時使用)
sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)# 2.在網絡中注冊該主機(綁定對應的ip和端口號)
""" 默認本地ip : 127.0.0.1 ?=> localhost """
sk.bind( ?("127.0.0.1" , 9000) )
# 3.開啟監聽
sk.listen()# 4.三次握手
conn,addr = sk.accept()# 5.收發數據的邏輯
# 接受數據
"""一次最多接受1024個字節"""
res = conn.recv(1024)
print(res)
print(res.decode())# 發送數據
conn.send("好好學習,天天向上".encode())
# 6.四次揮手
conn.close()# 7.退還端口
sk.close()
2.tcp循環發消息
# ### 客戶端
import socket# (1) 創建socket對象
sk = socket.socket()
# (2) 連接服務端
sk.connect( ("127.0.0.1" , 9001) )
# (3) 收發數據的邏輯while True:
?? ?# 發送數據
?? ?strvar = input("[客戶端]請輸入您要發送的數據>>>")
?? ?sk.send(strvar.encode())
?? ?
?? ?# 接受數據
?? ?res = sk.recv(1024)
?? ?if res == b"q":
?? ??? ?break
?? ?print(res.decode())
# (4) 關閉連接
sk.close()
?# ### 服務端
import socket# (1) 創建socket對象
sk = socket.socket()# 一個端口綁定多個程序(僅在測試時使用)
sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)# (2) 在網絡中注冊該主機(綁定ip和端口號)
sk.bind( ?("127.0.0.1" , 9001) ?)
# (3) 監聽端口
sk.listen()
# (4) 三次握手
# conn,addr = sk.accept()
# (5) 收發數據的邏輯"""
print(conn)
print(addr)
<socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 9000), raddr=('127.0.0.1', 50176)>
('127.0.0.1', 50176)
"""while True:
?? ?conn,addr = sk.accept()
?? ?while True:
?? ??? ?# 接受數據
?? ??? ?res = conn.recv(1024)
?? ??? ?print(res.decode())
?? ??? ?
?? ??? ?# 發送數據
?? ??? ?strvar = input("[服務端]請輸入您要發送的數據>>>")
?? ??? ?conn.send(strvar.encode())
?? ??? ?
?? ??? ?# 退出
?? ??? ?if strvar == "q":
?? ??? ??? ?break
?? ?# (6) 四次揮手
?? ?conn.close()
?? ?
# (7) 退還端口
sk.close()?
3.udp基本語法
# ### UDP協議 客戶端
import socket?# 1.創建udp對象
sk = socket.socket(type=socket.SOCK_DGRAM)# 2.收發數據的邏輯
# 發送數據
msg = "你喜歡我么~"
# sendto( ?二進制字節流 , ip端口號 ?)
sk.sendto( ? msg.encode() , ?("127.0.0.1",9000) )# 接受數據
msg , addr = sk.recvfrom(1024)
print(msg.decode())
print(addr)# 3.關閉連接
sk.close()
?# ### UDP協議 服務端
import socket?# 1.創建udp對象
sk = socket.socket(type=socket.SOCK_DGRAM)# 2.在網絡中注冊該主機(綁定ip和端口號)
sk.bind( ("127.0.0.1",9000) )# 3.收發數據的邏輯
"""udp協議下,默認第一次只能接收數據(沒有三次握手,不清楚對方的ip和端口號)"""
# 接受數據
msg , addr ?= sk.recvfrom(1024)
print(msg.decode())
print(addr)# 發送數據
sk.sendto( "我喜歡你個錘子".encode() ?, addr )# 4.關閉連接
sk.close()
4.udp循環發消息
# ### udp 客戶端
import socketsk = socket.socket(type=socket.SOCK_DGRAM)
while True:
?? ?# 發送數據
?? ?strvar = input("[客戶端]請輸入您要發送的內容>>>")
?? ?sk.sendto( strvar.encode() , ("127.0.0.1",9000) )
?? ?
?? ?# 接受數據
?? ?msg , addr = sk.recvfrom(1024)
?? ?print(msg.decode())
?? ?
sk.close()
?# ### udp 服務端
import socket?sk = socket.socket(type=socket.SOCK_DGRAM)
sk.bind( ("127.0.0.1",9000) )while True:
?? ?# 接受數據
?? ?msg , addr = sk.recvfrom(1024)
?? ?print(msg.decode())
?? ?print(addr)
?? ?
?? ?# 發送數據
?? ?strvar = input("[服務端]請輸入您要發送的內容>>>")
?? ?sk.sendto( strvar.encode() , ?addr)
sk.close()
5.黏包
# ### 客戶端
import socket
import time?sk = socket.socket()
sk.connect( ("127.0.0.1",9001) ?)time.sleep(2)
# 收發數據的邏輯
res1 = sk.recv(1024)
print(res1.decode() , "<==1===>")
res2 = sk.recv(1024)
print(res2.decode() , "<==2===>")sk.close()
# ### 服務端
import socket
import time
"""
黏包現象:
?? ?(1)發送端,數據小,時間間隔短,造成黏包
?? ?(2)接收端,沒有及時接受數據,可能把多次發送的數據當成一條截取.
"""sk = socket.socket()
sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
sk.bind( ("127.0.0.1",9001) )
sk.listen()
conn,addr = sk.accept()# 收發數據的邏輯
conn.send("world,".encode())
time.sleep(1)
conn.send("hello".encode())conn.close()
sk.close()
?