Редактировать: я изменил название и вопрос, чтобы больше относиться к моей проблеме:
Я пытаюсь обмениваться данными (в основном словарями) между сервером и клиентом, используя соединение через сокет.Размер обмениваемых данных не всегда одинаков, поэтому я сделал этот класс для выполнения операции:
bsfc.py:
class Reseau():
msg_sent = False
@classmethod
def snd_data(cls, connexion, data):
print('22')
pdata = pickle.dumps(data)
print('22')
len_msg = len(pdata)
plen = pickle.dumps(len_msg)
print('22')
while cls.msg_sent is not True :
connexion.sendall(plen)
time.sleep(0.1)
cls.msg_sent=False
print('22')
while cls.msg_sent is not True :
connexion.sendall(pdata)
time.sleep(0.1)
cls.msg_sent = False
print('22')
@classmethod
def get_data(cls, connexion):
print('00')
plen_msg=connexion.recv(1024)
cls.msg_sent=True
print('00')
len_msg=pickle.loads(plen_msg)
print('{}'.format(len_msg))
pdata = connexion.recv(len_msg*2)
cls.msg_sent = True
data=pickle.loads(pdata)
print(data)
return data
(я добавил несколько отпечатков, чтобы увидеть, где начинается программаошибка)
теперь, когда я запускаю этот сервер:
serveur.py
import socket
import select
from threading import Thread
from bsfc import Reseau
class Find_clients(Thread):
def __init__(self):
Thread.__init__(self)
self.connexion_serveur = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.connexion_serveur.bind(('', 12800))
self.connexion_serveur.listen(5)
def run(self):
print('serveur connecté')
serveur = True
while serveur :
connexions_demandees, wlist, xlist = select.select([self.connexion_serveur],
[], [], 1)
for connexion in connexions_demandees :
connexion_client, infos_connexion = connexion.accept()
if connexion_client is not None :
msg="connexion acceptee"
print('msg')
Reseau.snd_data(connexion_client, msg)
print('msg')
user=Reseau.get_data(connexion_client)
print('msg')
user['connexion_client']=connexion_client
user['infos_connexion']=infos_connexion
Clients.add_user(user)
if __name__=='__main__' :
serveur=Find_clients()
serveur.start()
serveur.join()
и затем я пытаюсь присоединиться к нему с этим клиентом:
import socket
from bsfc import Menu
from bsfc import Reseau
from tkinter import *
import pickle
class Interface_reseau(Frame):
def __init__(self, wdw, **kwargs):
Frame.__init__(self, wdw, width=500, height=600, bg='black', **kwargs)
self.pack(fill=BOTH, expand=1)
self.columnconfigure(0, weight=1)
self.rowconfigure(0, weight=2)
self.rowconfigure(1, weight=1)
self.rowconfigure(2, weight=1)
self.rowconfigure(3, weight=3)
self.title=Label(self, bg='black', text = " Rejoindre un serveur \n", font="helvetica 16 bold", fg='white')
self.serveur_liste=Listbox(self)
self.title.grid(row=0, column=0)
self.connect()
def connect(self):
connexion_serveur = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.connect_lbl=Label(self, bg='black', fg='white', text='connecting...')
self.connect_lbl.grid(row=1, column=0)
try :
connexion_serveur.connect(('localhost', 12800))
self.connect_lbl.destroy()
print('1')
msg = Reseau.get_data(connexion_serveur)
print('2')
Reseau.snd_data(connexion_serveur, Menu.USER)
print('3')
self.connect_lbl=Label(self, bg='black', fg='white', text=msg)
self.connect_lbl.grid(row=1, column=0)
except:
self.connect_lbl.destroy()
self.connect_lbl=Label(self, bg='black', fg='white', text='connection failled')
self.connect_lbl.grid(row=1, column=0)
У меня есть эта ошибка на стороне сервера:
serveur connecté
msg
22
22
22
Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/lib/python3.5/threading.py", line 914, in _bootstrap_inner
self.run()
File "serveur.py", line 50, in run
Reseau.snd_data(connexion_client, msg)
File "/home/bsfc.py", line 149, in snd_data
connexion.sendall(plen)
BrokenPipeError: [Errno 32] Broken pipe
и это на стороне клиента:
1
00
00
28
28
2
Я думаю, когда сервер меняет атрибут класса "Reseau.msg_sent "при использовании метода класса" Reseau.snd_data () ", импортированного из файла bsfc.py, он изменяет версию в потоке, но не" реальное "значение.Я прав?