由於本篇博文的項目都很簡單,所以本次開個特例,本次解析兩個項目,但是都很簡單的 項目一:用socket實現文件傳輸 本項目很簡單,作為小項目的預熱的,前面剛學完socket,這裡馬上又利用socket進行項目開發,難不倒各位 項目要求: 1.用socket完成文件上傳功能 2.文件位置可以設置 3. ...
由於本篇博文的項目都很簡單,所以本次開個特例,本次解析兩個項目,但是都很簡單的
項目一:用socket實現文件傳輸
本項目很簡單,作為小項目的預熱的,前面剛學完socket,這裡馬上又利用socket進行項目開發,難不倒各位
項目要求:
1.用socket完成文件上傳功能
2.文件位置可以設置
3.傳輸協議可以為get,和post
4.路徑存放位置可以設置
5.服務端實現多用戶連接,客戶端隨意
要求就這麼簡單,好久沒有這麼簡單的操作了吧?
不多說,直接來。
程式結構:
settings.py:
#!usr/bin/env python
#-*- coding:utf-8 -*-
# author:yangva
# datetime:2018/2/11 0011 22:18
import os
base_dir = os.path.dirname(__file__) #預設根目錄
transport_type = 'post' #傳輸方式
dir = 'test' #存放文件夾名,記得事先創建好
path = os.path.join(base_dir,dir) #存放路徑
pic_server.py:
#!usr/bin/env python
#-*- coding:utf-8 -*-
# author:yangva
import socket,os
import settings
s = socket.socket()
address = ('127.0.0.1',8800)
s.bind(address)
s.listen(3)
base_dir = settings.base_dir
def recv():
print('服務端啟動....')
conn,addr = s.accept()
path = settings.path #設定待存放文件路徑
while True:
info = str(conn.recv(1024),'utf8') #接受文件名和文件大小
if not info:
conn.close()
conn,addr = s.accept()
continue
filename,filesize = info.split(',') #分割出文件名和文件大小
print('待傳輸的文件大小為:%s'%filesize)
print('請稍後....')
f = open(os.path.join(path,filename),'wb') #創建文件
recv_size =0 #已接受數據的值,初始為0
while recv_size != int(filesize): #迴圈接受數據,直到數據接收完整
data = conn.recv(1024) #每次接受1024個位元組
f.write(data) #每接受1024個就寫入文件
recv_size += len(data) #每接受一次增加同等值的已接受值
f.close()
print('傳輸完成')
s.close()
if __name__ == '__main__':
recv()
pic_client.py:
#!usr/bin/env python
#-*- coding:utf-8 -*-
# author:yangva
import socket,os
import settings
c = socket.socket()
addr = ('127.0.0.1',8800)
base_dir = settings.base_dir
def send():
print('客戶端啟動...')
c.connect(addr)
types,filename = input('>>>:').strip().split('/') #分割出輸入的傳輸方式、文件名
if types != settings.transport_type:exit() #傳輸方式
path = os.path.join(base_dir,filename) #拼湊文件名的絕對路徑
filesize = os.stat(path).st_size #文件名的空間大小
info = '%s,%s'%(filename,filesize)
c.sendall(bytes(info,'utf8')) #傳輸文件名、文件大小
sent_size = 0 #設定初始值,用於標記已傳輸的大小
f = open(path,'rb')
while sent_size != filesize: #迴圈傳入,直到傳完整個文件
data = f.read(1024) #每次讀取1024個位元組大小
if not data:break
c.sendall(data) #傳輸讀取的1024個位元組
sent_size += len(data) #每傳輸一次增加同等值的已接受值
c.close()
if __name__ == '__main__':
send()
好的,就這麼些,我這裡測試的是上傳名為1.jpg的圖片到test文件目錄里
先看下1.jpg:
美女對吧。好的,開始測試:
客戶端:
服務端:
我們看下test目錄:
打開這個目錄的1.jpg看看:
這美女已經被我們傳到test目錄里了,驗證的文件大小看看:
和剛纔的對比:
好的,是的,那麼這個項目就搞定了。很簡單對不對
項目二:用socketserver模塊實現併發,多用戶同時訪問
項目要求:使用socketserver模塊操作實現多用戶同時訪問服務端
是的,你沒有看錯,項目要求就這麼一個,最根本的就是熟悉socketserver模塊的使用方法就行。
所以本項目的前提,先學習socketserver模塊,不用多說,就一句話,socketserver是在socket基礎之上開發的,類似於一個框架,裡面的大部分東西是給我們寫好的,稍微的學習socketserver的使用方法就行,其他和socket是完全沒區別的。
好的,不多說,直接上來。
項目結構就兩個con_server.py和con_client.py。
con_server.py:
#!usr/bin/env python
#-*- coding:utf-8 -*-
# author:yangva
import socketserver
class myserver(socketserver.BaseRequestHandler):
def handle(self): #這裡的方法名是固定的,不能是其他的
print('服務端啟動。。。')
while True:
conn = self.request #和conn,addr = socket.accept()等同
print(self.client_address)
while True:
client_data = conn.recv(1024) #接受數據
print(str(client_data,'utf8')) #轉為字元串
req = input('>>>:') #輸入數據
conn.sendall(bytes(req,'utf8')) #發送數據
conn.close()
if __name__ == '__main__':
server = socketserver.ThreadingTCPServer(('127.0.0.1',8888),myserver)
server.serve_forever() #服務永遠存在,不關閉
con_client.py:
和前面的完全一樣,沒做任何更改
#!usr/bin/env python
#-*- coding:utf-8 -*-
# author:yangva
import socket
address = ('127.0.0.1',8888)
c = socket.socket()
c.connect(address)
print('客戶端啟動。。。')
while True:
data = input('>>>:')
c.send(bytes(data,'utf8'))
if data == 'exit':break
res_data = c.recv(1024)
print(str(res_data,'utf8'))
c.close()
好的,運行測試:
第一個客戶端:
第二個客戶端:
第三個客戶端:
服務端:
查看結果:
第一個客戶端收到信息:
第二個客戶端收到信息:
第三個客戶端收到信息:
那麼就是都收發到了的,服務端回覆的內容會按連接的先後順序依次分發給客戶端。那麼併發就實現了。
這個真麽什麼難度,具體就自己下去多研究了
好的,項目結束,都是很簡單的小項目