Синхронизация передачи данных между клиентом и сервером - PullRequest
0 голосов
/ 21 ноября 2018

Я работаю над проектом клиент / сервер tcp, и мне интересно, какой хороший метод для "проверки", что сервер / клиент готов к отправке данных.Это потому, что у моего клиента есть графический интерфейс, и я хочу, чтобы сервер был готов к любому вводу в любое время, и поэтому должен убедиться, что он не пытается отправлять данные, в то время как он должен отправлять данные

Здесьмоя попытка

Клиент:

import socket
# Methods of a class
def receiveData(self, FROM=""):
    if self.SENT_LAST:
        print("DATA WAS LAST SENT BY CLIENT, NO CHECK REQUIRED")
    else:
        print("DATA LAST SENT BY CLIENT, CHECK REQUIRED")
        self.sendPickledData("dataReady")
    print("In receive data")
    if FROM:
        print("From:", FROM)
    data = s.recv(4096)
    try:
        data = pickle.loads(data)

    except pickle.UnpicklingError as err:
        errorReport(err)
    time.sleep(0.2)
    self.SENT_LAST = False
    if data != noData:
        print("data :",data)
        return data
    else:
        print("No data found")
        return False

def sendPickledData(self, data, FROM=""):
    if self.SENT_LAST:
        print("DATA WAS LAST SENT BY CLIENT, CHECK REQUIRED")
        checkData = self.receiveData("sendpickled")
        print("CheckData :", checkData)
        if checkData != "dataReady":
            raise ValueError
    else:
        print("DATA LAST SENT BY CLIENT, NO CHECK REQUIRED")
    print("In sendPickle, data :", data)
    if FROM:
        print("From:", FROM)
    data = pickle.dumps(data)
    s.sendall(data)
    time.sleep(0.5)
    self.SENT_LAST = True
    print("Data sent")

Сервер:

import socket
def receiveData_v2(FROM, FUNC=[]):
    global SENT_LAST, receive_count
    receive_count += 1
    print("Receive :",receive_count)
    print("Receiving")
    if SENT_LAST:
        print("DATA WAS LAST SENT BY SERVER, NO CHECK REQUIRED")
    if not SENT_LAST:
        print("DATA LAST SENT BY SERVER, CHECK REQUIRED")
        sendPickledData("dataReady")
        SENT_LAST = False

    print("In receive data")

    if FROM:
        print("From:", FROM)

    data = conn.recv(4096)

    try:
        data = pickle.loads(data)
    except pickle.UnpicklingError as err:
        print("Pickling error:")
        print(err)

    if data == PROG_QUIT:
        return data
    elif data == noData:
        return False
    else:
        if FUNC:
            funcData = FUNC(data)
            return funcData
        else:
            return data


def sendPickledData(data):
    global SENT_LAST, send_count
    send_count += 1
    print("Send :",send_count)
    print("sending")
    if SENT_LAST:
        print("DATA WAS LAST SENT BY SERVER, CHECK REQUIRED")
        print("sent last")
        checkData = receiveData_v2("sendpickled")
        print("CheckData :", checkData)
        if checkData != "dataReady":
            raise ValueError
    else:
        print("DATA LAST SENT BY SERVER, NO CHECK REQUIRED")
    print("In sendPickled,\nSending:", data)
    data = pickle.dumps(data)
    conn.sendall(data)
    SENT_LAST = True
    conn.sendall(data)

Всякий раз, когда я пытаюсь отправить данные с помощью этого метода, каким-то образом происходит отключение синхронизации, и ониоба будут пытаться прослушивать данные одновременно.Или receiveData (клиент) получит только «dataReady»

...