UDP:
from socket import *
import struct
send_data = struct.pack('!H8sb5sb',1,'test.jpg',0,'octet',0) ========>利用pack可以規定發送的某個字符串占用幾個字節(可以用於構造數據包頭數據,比如數據包頭規定某一個字段必須為4個字節,而實際該字段內容只有一個‘1’,此時可以利用這個強行規定‘1’占4個字節)
recv_data = struct.unpack('!HH','接收到的數據') ========>相應的可以用unpack來解除這種限制。
udp_socket = socket(AF_INET,SOCK_DGRAM) =========>創建一個UDP套接字
udp_socket.bind(('',9999)) ===========>將該套接字綁定到指定IP和端口(IP不寫代表全部)。
udp_socket.sendto(b'haha',('10.65.1.27',8888)) =======> 發送數據(注意:python3中要發送的數據需為二進制形式或者經過編碼的字符串(例:'haha'.encode('utf-8')))。
udp_socket.sendto(send_data,('10.65.1.27',8888))
print(udp_socket.recvfrom(1024))
TCP:
服務端:
from socket import *
server_socket = socket(AF_INET,SOCK_STREAM)
server_socket.bind('',8899)
server_socket.listen(5) ======>走到這一步TCP狀態已經可以達到ESTABLISHED了,且ESTABLISHED狀態的最大量為5,再有用戶連接過來時則不再發送回包。
client_socket,client_info = server_socket.accept() =====>TCP服務器每收到一個client鏈接都會生成一個新的套接字(client_socket)來為其(client_info指向該client的基本信息)服務,主socket繼續等待新的客戶到來。
(注意:子套接字變量名不能重復使用,每跟一個新用戶連接需生成一個新的子套接字名字)(注意:只要有足夠的accept就可以無視listen的值,有多少accept就可以有多少ESTABLISHED)
while 1 :
data = client_socket.recv(1024) ======>服務器端接收數據
#client_socket.connect(client_info) =======>如果服務器想要給客戶端回數據則不必再主動連接客戶端(因為已經與客戶端建立連接,直接發數據即可)
client_socket.send(data) ========>向客戶端發送數據
print(data)
client_socket.close()
server_socket.close()
客戶端:
from socket import *
client_socket = socket(AF_INET,SOCK_STREAM)
client_socket.connect(('192.168.1.1',8899))
while 1 :
client_socket.send(input('發送的內容').encode('utf-8'))
client_socket.recv(1024) =====>由於全雙工該socket也可用來接收數據
client_socket.close()