Как я могу получить подтверждающее сообщение от получателя с помощью программирования сокетов TCP в Python - PullRequest
0 голосов
/ 05 сентября 2018

Я пытаюсь разработать приложение сервер-клиент и выполняю многоходовую связь (один клиент отправляет данные соседнему клиенту. Все клиенты не связаны напрямую с сервером). Я отправляю сообщение, и мне нужно подтверждение от получателя. если отправитель получает подтверждение. сообщение от получателя, тогда хорошо, в противном случае отправителю необходимо повторно отправить сообщение, которое он не получил. Я пытаюсь, но я не мог получить подтверждение. сообщение на стороне отправителя.

Кто-нибудь может мне помочь, как я могу получить подтверждающее сообщение на стороне отправителя параллельно (параллельно означает, что при отправке сообщения он также должен получить подтверждающее сообщение от получателя), используя TCP-сокет в python? . ..

, а также как я могу переслать сообщение соседнему клиенту, если клиент-получатель не является пунктом назначения (нужна помощь, связанная с синхронизацией)

Вторая проблема заключается в том, что когда я отправляю сообщения получателю (клиенту), я не получил сообщения правильно. Мне нужно дать время сна, тогда я получаю все сообщения правильно в приемнике, в противном случае я получил одно сообщение вместо отдельного сообщения.

как я могу получить все сообщения отдельно, не давая времени сна отправителю? Нужно ли создавать протокол сообщений выше уровня TCP?

import os,sys
import socket
import time
import concurrent.futures

Сервер (Отправитель)

MyNeighborSet_ip= ['192.168.1.2']
Data_transfer_listt = [['192.168.1.1', '192.168.1.2'], ['192.168.1.2', '192.168.1.3'], ['192.168.1.2', '192.168.1.4'], ['192.168.1.4', '192.168.1.5'], ['192.168.1.4', '192.168.1.6']]
received_list=[]
def sending_Neighobr_ip_list():
    message='Neighbor_list_sending'
    PORT = 12345
    for k in range (len(MyNeighborSet_ip)):
        s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((MyNeighborSet_ip[k],PORT))
        s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
        for i in range(len(Data_transfer_listt)):
            receiver_ip=Data_transfer_listt[i][0]
            receiver_node_list=Data_transfer_listt[i][1]
            T_message= message + ";" + receiver_ip + ";" + receiver_node_list
            T_message_bytes= bytes(T_message,'utf-8')
            s.sendall (T_message_bytes)
            time.sleep(0.01)
        s.close()

def receive_ack():

    PORT = 12345
    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
    s.bind(('',PORT))
    s.listen(1)
    conn,address=s.accept()
    while True:
        message_chunk=conn.recv(1024).decode()
        if not message_chunk:
            break
        received_list.append(message_chunk)    
    conn.close()
    print ("after the recv_message_list",received_list)
    return 

temp= concurrent.futures.ThreadPoolExecutor (max_workers=2)
temp.submit(sending_Neighobr_ip_list)
temp.submit(receive_ack)

Получатель (Клиент)

data =[]
ip_list=[]
def frame_reception_function ():

    PORT = 12345
    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
    s.bind(('',PORT))
    s.listen(1)
    conn,address=s.accept()  
    while True:
        print (datachunk)
        print ('       ')

        if not datachunk:
            break  
        data.append(datachunk)
        ip_list.append(address[0])
        conn.close()
        Send_Data_ack()

    #conn.close()
    print(data)
    return

def Send_Data_ack():
    mess=data.pop(0)
    ips=ip_list.pop(0)
    PORT = 12345
    s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
    s.connect((ips,PORT))
    s.connect((ips,PORT))
    T_message_bytes= bytes(mess,'utf-8')
    s.sendall (T_message_bytes) 
    s.close ()

frame_reception_function()
...