python之网络编程1-socket-tcp与udp
一、概念
兩個(gè)獨(dú)立python文件之間可以通過(guò)寫入文件,讀取文件進(jìn)行交互
由于不同機(jī)器上的程序要通信,才產(chǎn)生了網(wǎng)絡(luò)
B/S架構(gòu)統(tǒng)一入口,各種小程序和公眾號(hào)
服務(wù)端 一直運(yùn)行,等待服務(wù)別人
客戶端 用的時(shí)候,才使用服務(wù)
想要實(shí)現(xiàn)通信
網(wǎng)卡 和 網(wǎng)線
網(wǎng)卡上有全球唯一的mac地址(物理地址)
4個(gè)點(diǎn)分十進(jìn)制
4個(gè)八位二進(jìn)制:00000000.00000000.00000000.00000000
0.0.0.0-255.255.255.255
通過(guò)ip地址就能找到對(duì)應(yīng)的mac地址:遵循arp協(xié)議
交換機(jī)-多臺(tái)機(jī)器間的通信問(wèn)題:廣播風(fēng)暴
網(wǎng)關(guān):局域網(wǎng)中的機(jī)器想要訪問(wèn)局域網(wǎng)外的機(jī)器,需要通過(guò)網(wǎng)關(guān)訪問(wèn)
子網(wǎng)掩碼與IP地址進(jìn)行按位與 運(yùn)算? 得到網(wǎng)段地址:可判斷電腦是否在同一個(gè)網(wǎng)段內(nèi)
端口:找到的程序
在同一時(shí)間只會(huì)有一個(gè)程序占用一個(gè)端口
不可能在同一時(shí)間 有兩個(gè)程序 占用同一個(gè)端口
端口范圍:0-65535
一般用8000之后的端口
ip:確定唯一一臺(tái)機(jī)器
127.0.0.1 本地的回環(huán)地址
端口:確定唯一的一個(gè)程序
ip+端口:找到唯一的一臺(tái)機(jī)器上的唯一的一個(gè)程序
?
二、socket初認(rèn)識(shí)
server端:
#server端 import socket sk=socket.socket() #sk為手機(jī)對(duì)象 # sk.bind('ip','port') #綁定手機(jī)號(hào) sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # 避免服務(wù)重啟的時(shí)候報(bào)address already in use sk.bind(('127.0.0.1',8080)) sk.listen() # 監(jiān)聽(tīng)。等電話過(guò)程 conn,addr=sk.accept() #接收到別人電話 connection連接,與它連接的address地址 print(addr) while True:# ret=conn.recv(1024) # 聽(tīng)別人說(shuō)話# print(ret)# conn.send(b'hi') # 我和別人說(shuō)話,必須傳一個(gè)bytes類型# ret=conn.recv(1024)# print(ret.decode('utf-8'))# conn.send(bytes('大碗油潑面',encoding='utf-8'))ret=conn.recv(1024).decode('utf-8')if ret=='bye':breakprint(ret)info=input('>>>')conn.send(bytes(info,encoding='utf-8')) conn.close() #掛電話 sk.close() #關(guān)手機(jī)client端:
# client端 import socket sk=socket.socket() #買手機(jī) sk.connect(('127.0.0.1',8080)) #撥別人的號(hào) while True:# sk.send(b'hello')# ret=sk.recv()# print(ret)# sk.send(bytes('中午吃什么?'.encode('utf-8')))# ret=sk.recv(1024)# print(ret.decode('utf-8'))info=input(">>>")sk.send(bytes(info,encoding='utf-8'))ret=sk.recv(1024).decode('utf-8')print(ret)if ret=='bye':sk.send(b'bye')breaksk.close()三、socket之udp和tcp
TCP-demo:
server端:
#server端 import socket sk=socket.socket() #買手機(jī) 創(chuàng)建一個(gè)socket對(duì)象 sk.bind(('127.0.0.1',8080)) #綁定ip和端口,啟動(dòng)服務(wù) sk.listen() #寫幾就是幾個(gè),不寫就是不限制conn,addr=sk.accept() #獲取到一個(gè)客戶端的連接,已經(jīng)完成了三次握手# 阻塞 # msg = conn.recv(1024) # 阻塞 # print(msg.decode('utf-8')) while True:info=input('>>>')if info=='bye':conn.send(b'bye') # 發(fā)消息breakconn.send(info.encode('utf-8')) #發(fā)消息ret=conn.recv(1024).decode('utf-8')if ret=='bye':breakprint(ret) conn.close() sk.close() #關(guān)閉socket對(duì)象,如果不關(guān)閉,還能繼續(xù)接收client端:
# client端 import socket sk=socket.socket() sk.connect(('127.0.0.1',8080)) while True:msg=input('>>>')if msg=='bye':sk.send(b'bye')breaksk.send(msg.encode('utf-8'))ret=sk.recv(1024).decode('utf-8')if ret=='bye':breakprint(ret) sk.close()UDP-demo:
server端:
# server端 import socket sk=socket.socket(type=socket.SOCK_DGRAM) sk.bind(('127.0.0.1',8080))msg,addr=sk.recvfrom(1024) print(msg.decode('utf-8')) sk.sendto(b'bye',addr)# udp的server不需要監(jiān)聽(tīng)和建立連接 # 而是在啟動(dòng)服務(wù)后,只能被動(dòng)的等待客戶端發(fā)送消息過(guò)來(lái) # 客戶端發(fā)送消息的同時(shí)還會(huì) 自帶地址信息 # 消息回復(fù)時(shí),不僅需要發(fā)送消息,還需要把對(duì)方的地址發(fā)送過(guò)去client端:
# client端 import socket sk=socket.socket(socket.SOCK_DGRAM) ip_port=('127.0.0.1',8080) sk.sendto(b'hello',ip_port) ret,addr=sk.recvfrom(1024) print(ret.decode('utf-8')) sk.close()四、利用udp實(shí)現(xiàn)qq聊天功能:
server:
import socket sk=socket.socket(type=socket.SOCK_DGRAM) sk.bind(('127.0.0.1',8080)) while True:msg,addr=sk.recvfrom(1024)print(addr)print(msg.decode('utf-8'))info=input('>>>').encode('utf-8')sk.sendto(info,addr) sk.close()client1:
import socket sk=socket.socket(type=socket.SOCK_DGRAM) ip_port=('127.0.0.1',8080) while True:# info=input("tiger哥:").encode('utf-8')info = input("tiger哥:")info=('\033[34m來(lái)自tiger哥的消息 %s\033[0m'%info).encode('utf-8')sk.sendto(info,ip_port)msg,addr=sk.recvfrom(1024)print(msg.decode('utf-8'))sk.close()client2:
import socket sk=socket.socket(type=socket.SOCK_DGRAM) ip_port=('127.0.0.1',8080) while True:# info=input("二哥:").encode('utf-8')info = input("二哥:")info=('\033[32m來(lái)自二哥的消息 %s\033[0m'%info).encode('utf-8')sk.sendto(info,ip_port)msg,addr=sk.recvfrom(1024)print(msg.decode('utf-8'))sk.close()五:UDP實(shí)現(xiàn)時(shí)間轉(zhuǎn)換
server端:
# 需求# 寫一個(gè)時(shí)間同步的服務(wù)器# 服務(wù)端接收請(qǐng)求# 按照client端發(fā)送的時(shí)間格式,將服務(wù)器時(shí)間轉(zhuǎn)換成對(duì)應(yīng)格式# 發(fā)送給客戶端 import socket import time sk=socket.socket(type=socket.SOCK_DGRAM) sk.bind(('127.0.0.1',9000)) while True:msg,addr=sk.recvfrom(1024)time_format=msg.decode('utf-8')time_str=time.strftime(time_format)sk.sendto(time_str.encode("utf-8"),addr) sk.close()client端:
import socket sk=socket.socket(type=socket.SOCK_DGRAM) sk.sendto('%Y-%m-%d %H-%M-%S'.encode('utf-8'),('127.0.0.1',9000)) msg,addr=sk.recvfrom(1024) print(msg.decode('utf-8')) sk.close()參考自https://www.cnblogs.com/Eva-J/p/5045061.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的python之网络编程1-socket-tcp与udp的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 用Python批量更改图片大小
- 下一篇: opencv图像切割1-KMeans方法