Come scrivere un ottimo software di messaggistica LAN?

0

Sto facendo questa domanda come un'estensione della seguente domanda: link

Non penso di avere una risposta reale. Ho trovato abbastanza difficile ottenere il comando net send che funziona su Windows 7 e anche se potessi farlo sarebbe stato abilitato solo per gli utenti amministratori.

Quindi ho deciso di scrivere il mio programma per risolvere il problema. Usando python Posso scrivere un programma per controllare i messaggi su un file comune (che posso memorizzare su un disco fisso comune che abbiamo sulla nostra LAN). Quindi il programma scriverà from:192.168.23.44 to:192.168.23.45 Hello . Supponendo che il programma sia installato su entrambe le macchine, posso chiedere alle macchine di eseguire il polling di questo file ogni pochi secondi e di visualizzare un messaggio se è stato scritto un messaggio per esso, cercandolo nel campo to: . Se scrivere su un singolo file diventa un problema, creerò più file che fungeranno da caselle di posta in arrivo per ciascuno dei computer sulla LAN.

Tuttavia, questo approccio è molto inelegante. Non suppongo che i messaggeri di internet, Google parlano per esempio, interrogino un server per verificare se ci sono nuovi messaggi per l'utente. Quindi la mia domanda è: qual è il modo ottimale per scrivere un programma di messaggistica LAN. Ora che ci penso, sto cercando un approccio minimalista. Inserirò il programma nella cartella Startup di tutte le macchine e dovrebbe diventare visibile ogni volta che un utente esegue l'accesso.

Ero in grado di configurare la macchina per rispondere al comando ping creando una nuova regola per il protocollo ICMPv4 (ref: link ). Sto indovinando che la risposta si trova in python e il protocollo ICMPv4 , ma avevo bisogno di qualche direzione.

    
posta Shashank Sawant 08.02.2014 - 20:54
fonte

2 risposte

1

Potresti creare il tuo protocollo di chat basato su socket TCP / IP .

Esistono due modi comuni per implementare un'applicazione di questo tipo. O un'architettura client / server o un'architettura peer-to-peer.

Nell'architettura client / server, si esegue un server di chat centrale su una macchina sempre attiva. Ogni partecipante utilizza un'applicazione client separata. Quando un client va online, si connette al server. Quando un cliente vuole inviare un messaggio, invia quel messaggio al server. Il server quindi lo inoltra ai destinatari.

Se non si dispone di un server sempre online, si potrebbe optare per un'architettura peer-to-peer.

In tale scenario il tuo programma di chat è sia client che server allo stesso tempo. Per inviare un messaggio a un altro utente, il client del mittente si connette direttamente al client del destinatario. Per poter fare ciò, è necessario conoscere l'indirizzo IP del ricevitore o almeno il suo nome host in modo da poter risolvere l'IP tramite DNS.

    
risposta data 08.02.2014 - 21:04
fonte
1

Ho creato un piccolo script con i socket.

See.

Il server:

# Sockets server.
import socket

s = socket.socket()
s.bind(("localhost", 44000))
s.listen(1)

print("Connection Waiting...")
sc, addr = s.accept()
print("Connection Matched!")

while True:
    print("Waiting message...")
    received = sc.recv(128)
    print(type(received))
    a = received.decode('utf-8')
    print(type(a), len(a))
    if a == "quit":
        break
    print("Received Message:", a)
    sc.send(received)

print("Good bye!")

sc.close()
s.close()
a = input("Enter key to End:")

E questo è lo script del client:

# Sockets client script
import socket, time

s = socket.socket()
print("Connecting to server...")
while True:
    try:
        s.connect(("localhost", 44000))
        break
    except:
        print("Retrying connection to server...")
        time.sleep(1)

print("Connection Matched!")

while True:
      keyboardInput = input("Enter the message: ")
      # s.send(bytes(message, 'UTF-8'))
      message = keyboardInput.encode('utf-8')
      s.send(message)
      print("Message sent!")
      r = s.recv( 128)
      a = r.decode('utf-8')
      print("Confirmation received message: ", a)
      if keyboardInput == "quit":
         break

print("Good bye")

s.close()

a = input("Enter key to End:")

Modifica: per implementare multi-thread. Per evitare che il server blocchi il flusso mentre è in attesa del messaggio in arrivo.

# Example script with sockets and multi-threads
import socket, threading, time

a = ""
s = socket.socket()
s.bind(("localhost", 44000))
s.listen(1)

sc, addr = s.accept()

class MiThread(threading.Thread):   # Defines the class MiThread, subclass of Thread
    def __init__(self, sc):
        threading.Thread.__init__(self)

    def run(self):  # this method is the code of the thread, it will works when be called by .start() method
        received = sc.recv(128)
        print(type(received))
        a = received.decode('utf-8')
        print(type(a), len(a))
        print("Received Message:", a)
        return a

t = MiThread(sc)     # creates an object of class MiThread, subclass Thread
t.start()       # method start() calls to .run() method as a thread

# this code is for debugging, change it and put your own code
# I'll works in the main proccess while the thread is waiting for messages
for i in range(0, 60):
    time.sleep(1)
    print("Seconds: ",i)
    #sc.send(received)

print("Time out. Good bye!")

sc.close()
s.close()
a = input("Enter key to End:")

Se desideri codificare una piccola conversazione, potresti utilizzare questi due utils: socket e multi-threading.

    
risposta data 09.02.2014 - 13:44
fonte

Leggi altre domande sui tag