python 网络编程--socket模块/struct模块
socket模塊:
客戶端:CS架構(gòu),? client -> server
瀏覽器:BS架構(gòu),? browser -> server
?
網(wǎng)絡(luò)通信本質(zhì):傳輸字節(jié)
doc命令查看ip地址:ipconfig / ifconfig(windows系統(tǒng) / mac系統(tǒng))
?
tcp協(xié)議和udp協(xié)議
TCP(Transmission Conteol Protocol)可靠的,面向連接的協(xié)議(eg打電話),傳輸效率低全雙工通信(發(fā)送緩存&接收緩存),面向字節(jié)流.使用TCP的應(yīng)用:Web瀏覽器;電子郵件,文件傳輸程序.
UDP(User Datagram Protocol)不可靠的,無連接的服務(wù),傳輸效率高(發(fā)送前延時小),一對一,一對多,多對一,多對多,面向報文,盡最大努力服務(wù),無擁塞控制.使用UDP的應(yīng)用:域名系統(tǒng)(DNS);視頻流;IP語音(VoIP).
服務(wù)端:
import socket# 創(chuàng)建服務(wù)端socket對象 server = socket.socket()
# 綁定IP和端口 server.bind(('192.168.13.88',5001))
# 后邊可以等5個人 server.listen(5)while 1:
conn,addr = server.accept() # 等待客戶端來連接,如果沒人來就傻傻的等待。
#字節(jié)類型while 1:data = conn.recv(1024) # 一次性最多拿1024字節(jié)。if data == b"exit":breakresponse = data + b'在北京'conn.send(response) # 服務(wù)端通過連接對象給客戶端回復(fù)了一個消息。conn.close() # 與客戶端斷開連接
客戶端:
import socket# 創(chuàng)建服務(wù)端socket對象 sk = socket.socket()
# 綁定IP和端口 sk.connect(('192.168.13.88',5001))while 1:name = input('請輸入姓名:')sk.send(name.encode('utf-8')) # 鏈接上服務(wù)端后,向服務(wù)端發(fā)送消息if name == 'exit':breakresponse = sk.recv(1024) # 等待服務(wù)端給他發(fā)送消息print(response.decode('utf-8'))sk.close() # 關(guān)閉自己
?黏包:
同時執(zhí)行多條命令之后,得到的結(jié)果很可能只有一部分,在執(zhí)行其他命令的時候又接收到了之前執(zhí)行的另外一部分結(jié)果,這種顯現(xiàn)就是黏包.
?
#_*_coding:utf-8_*_ from socket import * import subprocessip_port=('127.0.0.1',8888) BUFSIZE=1024tcp_socket_server=socket(AF_INET,SOCK_STREAM) tcp_socket_server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) tcp_socket_server.bind(ip_port) tcp_socket_server.listen(5)while True:conn,addr=tcp_socket_server.accept()print('客戶端',addr)while True:cmd=conn.recv(BUFSIZE)if len(cmd) == 0:breakres=subprocess.Popen(cmd.decode('utf-8'),shell=True,stdout=subprocess.PIPE,stdin=subprocess.PIPE,stderr=subprocess.PIPE)stderr=res.stderr.read()stdout=res.stdout.read()conn.send(stderr)conn.send(stdout)tcp - server 黏包實(shí)例:TCP/服務(wù)端?
#_*_coding:utf-8_*_ import socket BUFSIZE=1024 ip_port=('127.0.0.1',8888)s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) res=s.connect_ex(ip_port)while True:msg=input('>>: ').strip()if len(msg) == 0:continueif msg == 'quit':breaks.send(msg.encode('utf-8'))act_res=s.recv(BUFSIZE)print(act_res.decode('utf-8'),end='')tcp - client 黏包實(shí)例:TCP/客戶端tcp協(xié)議的拆包機(jī)制
成因:當(dāng)發(fā)送端緩沖區(qū)的長度大于網(wǎng)卡的MTU時,tcp會將這次發(fā)送的數(shù)據(jù)拆成幾個數(shù)據(jù)包發(fā)出去.MTU是Maximum Transmission Unit的縮寫.意思是網(wǎng)絡(luò)上傳的最大數(shù)據(jù)包.MTU的單位是字節(jié).大部分網(wǎng)絡(luò)設(shè)備的MTU都是1500.如果本季的MTU比網(wǎng)關(guān)的MTU大,大的數(shù)據(jù)包就會被拆開來傳送,這樣會產(chǎn)生很多數(shù)據(jù)包碎片,增加丟包率,降低網(wǎng)絡(luò)速度.
?struct模塊:
該模塊可以把一個類型,例如數(shù)字,轉(zhuǎn)換成固定長度的bytes
?
struct.pack('i',1111111111111)struct.error: 'i' format requires -2147483648 <= number <= 2147483647 #這個是范圍?
轉(zhuǎn)載于:https://www.cnblogs.com/zbw582922417/p/9578978.html
總結(jié)
以上是生活随笔為你收集整理的python 网络编程--socket模块/struct模块的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WPF 异常其他信息: “对类型“Bas
- 下一篇: pythonのgevent同步异步区别