Python socket網絡編程實例代碼


###簡單的實例

__author__ = '12711'
#-*- coding:utf-8 -*-
#客戶端
# import socket
# client=socket.socket()#聲明socket類型,同時生成sockte鏈接對象
# client.connect(('localhost',6969))
#
# client.send(b'Hello World')#發數據
# data=client.recv(1024)#接受服務器返回
# print('recv',data)
#
# client.close()#關閉

#服務器端
import socket
server=socket.socket()
server.bind(('localhost',6969))#綁定要監聽的端口
server.listen()#監聽
print('開始等待')
conn,addr=server.accept()#等待電話打進來
print('電話來了')
data=conn.recv(1024)#接收消息
print('recv:',data)
conn.send(data.upper())
server.close()


進階的服務器端
#改良版 可收多個消息
# import socket
# server=socket.socket()
# server.bind(('localhost',6969))
# server.listen()
# while True:
# conn,addr=server.accept()
# while True:
#
# data=conn.recv(102400)
# print("收到的消息:",data.decode())
# data2=input('你要發送的消息')
# conn.send(data2.encode("utf-8"))
# server.close()


#加強版可以收發大數據
# import socket
# import os
# server=socket.socket()
# server.bind(('localhost',6969))
# server.listen()
# while True:
# conn,addr=server.accept()
# while True:
#
# data=str(conn.recv(1024).decode())
# print('收到的命令:',data)
#
# cmd=os.popen(data).read().encode("utf-8")
# cmd_seif=str(len(cmd))
# conn.send(cmd_seif.encode("utf-8"))
# conn.send(cmd)
#
#
#
#
# server.close()


#收發文件md5驗證
import socket
import hashlib
server=socket.socket()
import os
server.bind(('localhost',6969))
server.listen()
while True:
coon,addr=server.accept()
while True:
data=coon.recv(1024)
cmd,filename=data.decode().split()
print(filename)
if os.path.isfile(filename):
f=open(filename,"rb")
m=hashlib.md5()
flie_size=os.stat(filename).st_size
coon.send(str(flie_size).encode("utf-8"))
coon.recv(1024)
for line in f:
m.update(line)
coon.send(line)
print("md5",m.hexdigest())
f.close()
coon.send(m.hexdigest().encode("utf-8"))
print("發送完畢")

server.close()

進階的客戶端
#可以發送多條消息
# import socket
# client=socket.socket()
# client.connect(('localhost',6969))
# while True:
# data1=input('親輸入:').strip()
# if not data1 :
# print("消息不能為空")
# continue
#
# client.send(data1.encode('utf-8'))
# data=client.recv(102400)
# print("服務器端:",data.decode())
#
# client.close()

#可以收發大數據
# import socket
# client=socket.socket()
# client.connect(('localhost',6969))
# while True:
# data=input('請輸入:')
# if not data:
# print("輸入的不能為空")
# continue
# client.send(data.encode("utf-8"))
# data1=client.recv(1024)
# print("收到的消息長度",data1.decode())
# print(type(data1))
# add=0
# data2=b''
# while add<int(data1):
# data3=client.recv(1024)
# add+=len(data3)
# data2+=data3
# print(data2.decode())
# print("接受的長度為:",add)
#
#
#
# client.close()

#可以接受文件並且md5驗證

import hashlib
import socket
import os
client=socket.socket()
client.connect(('localhost',6969))
while True:
cmd=input("請輸入指令和文件名")
if not cmd:
print("輸入的不能為空")
continue
if cmd.startswith("get"):
client.send(cmd.encode())
file_size=client.recv(1024)
print("File size:",file_size)
client.send(b"ready to ercv file")
recv_file_size=0
filename=cmd.split()[1]
f=open(filename+"new","wb")
#m = hashlib.md5()
m=hashlib.md5()
while recv_file_size<int(file_size.decode()):
if int(file_size.decode())-recv_file_size>1024:
size=1024
else:
size=int(file_size.decode())-recv_file_size
print("最后一次的大小:",size)
data=client.recv(size)
recv_file_size+=len(data)
m.update(data)
f.write(data)
new_flie_md5=m.hexdigest()
print("文件接受完畢:",recv_file_size)
f.close()
server_file_md5=client.recv(1024)
print("server file md5:",server_file_md5)
print("new file md5:",new_flie_md5)

client.close()



Tcp實例代碼只寫了用戶上傳文件

#服務器端 可以同時與多個用戶交流
__author__ = '12711'
#-*- coding:utf-8 -*-
import socketserver
import json,os


class MyTCPHandler(socketserver.BaseRequestHandler):
def put(self,*args):
cmd_dic=args[0]
file_name=cmd_dic["filename"]
file_size=cmd_dic["size"]
if os.path.isfile(file_name):
f=open(file_name+"new","wb")
else:
f=open(file_name,"wb")

self.request.send(b"keyifasong")
rvev_size=0
while rvev_size<file_size:
data=self.request.recv(1024)
f.write(data)
rvev_size+=len(data)
print("%s文件傳輸完畢"%(file_name))



def handle(self):
while True:
try:
self.data=self.request.recv(1024)
print("{} wrote:".format(self.client_address[0]))
print(self.data)
cmd_dic=json.loads(self.data.decode())
action=cmd_dic["action"]

if hasattr(self,action):
func=getattr(self,action)
func(cmd_dic)

except ConnectionResetError as e:
print(e)
break

if __name__=="__main__" :
HOST,PORT="localhost", 6969
server=socketserver.ThreadingTCPServer((HOST,PORT),MyTCPHandler)
server.serve_forever()

#客戶端

__author__ = '12711'
#-*- coding:utf-8 -*-
import socket
import os,json


class TcpClient(object):

def __init__(self):
self.client=socket.socket()

def help(self):
msg='''
ls
pwd
cd ../..
get filename
put filename
'''
print(msg)

def connect(self,ip,port):
self.client.connect((ip,port))

def interactive(self):
while True:
cmd=input("請輸入:")
if not cmd:
print("不能讓為空")
continue
cmd_str=cmd.split()[0]
if hasattr(self,"cmd_%s"%cmd_str):
func=getattr(self,"cmd_%s"%cmd_str)
func(cmd)
else:
help()
def cmd_put(self,*args):
cmd_split = args[0].split()
if len(cmd_split)>1:
filename=cmd_split[1]
if os.path.isfile(filename):
file_size=os.stat(filename).st_size
msg_dic={
"action": "put",
"filename":filename,
"size": file_size,
"overridden":True
}
self.client.send(json.dumps(msg_dic).encode("utf-8"))

self.client.recv(1024)
f=open(filename,"rb")
for line in f:
self.client.send(line)
print(filename,"發送完畢")
f.close()
else:
print(filename,"不是文件")


ftp=TcpClient()
ftp.connect('localhost',6969)
ftp.interactive()






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM