Ich arbeite am UDP-Chat, der sollte zuhören und in der Lage sein, Nachricht jederzeit mit nur einem Sockel zu senden. Beispiel, ich werde das Chat-Programm fertig haben, ich werde es zum ersten Mal öffnen, dann zum zweiten Mal und ich muss in der Lage sein, über UDP von beiden Programmen zu kommunizieren, einfach hat jedes Programm nur einen geöffneten Socket.Mit einem Socket im UDP-Chat mit Threading
Meine zwei Threads sind zum Abhören, das ist Deamon-Thread, weil ich will, dass es neue Nachrichten nonstop hört, und mein anderer sendet die Nachrichten, die wie ein normaler Thread ist.
Zunächst ist mein Problem, dass es so aussieht, als ob meine Threads sich gegenseitig blockieren, denn wenn ich das Programm ausführe, bekomme ich nur die Ausgabe vom ersten Thread, den ich starte.
Das zweite Problem ist, dass ich nicht sicher bin, ob meine sendende Funktion oder die gesamte Klasse richtig geschrieben ist, oder ob etwas fehlt oder falsch ist.
Vielen Dank im Voraus. Übrigens, ich bin neu in Python und ich benutze Python 3, nur um es klar zu machen.
import socket
import threading
import logging
import time
from sys import byteorder
class Sending():
def __init__(self, name, tHost, tPort):
self.name = name
self.host = tHost
self.port = tPort
def set_name(self, name):
self.name = name
def send(self, name, tHost, tPort, msgType, dgramSize):
logging.debug('Starting send run')
message = input('Enter message: ')
data = bytearray()
data.extend((name.encode('utf-8'), message.encode('utf-8'), msgType.to_bytes(1, byteorder = 'little')))
#data.extend(message.encode(encoding='utf_8'))
self.sock.sendto(bytearray(data), (tHost, tPort))
def run(self):
th2 = threading.Thread(name = 'send', target=self.send('username', 'localhost', 8001, 1, 1400))
th2.start()
class Receiving():
def __init__(self, host, port):
self.host = host
self.port = port
def create_socket(self, host, port):
logging.debug('Starting socket')
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((host, port))
#print ('socket ready')
time.sleep(5)
while True:
data, addr = sock.recvfrom(1500)
print('Prijata:' + data + addr)
def run(self):
th1 = threading.Thread(name = 'rec', target=self.create_socket('localhost', 8000))
th1.setDaemon(True)
th1.start()
if __name__ == '__main__':
#print ('running')
rec = Receiving('localhost', 8000)
send = Sending('username', 'localhost', 8001)
send.run()
rec.run()
Und wenn ich das in zwei Konsolen auf meinem localhost ausführen möchte, wie soll ich dann die IP und den Port einstellen? Weil es in Ihrem Code einen Fehler gibt, dass nur eine Verwendung jeder Socket-Adresse erlaubt ist, aber ich habe dies durch Hinzufügen von 'sock.setsockopt (socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)' behoben und dann rec eingestellt Port auf '8000' und senden Ports beide '8001'. Führen Sie dann das Programm mit diesen Parametern aus und wechseln Sie dann die Ports: 'rec = 8001' und' send = 8000' für beide und öffnen Sie das Programm, so dass wir zwei Clients haben. Aber nur ein Client kann Nachrichten empfangen, andere können nur senden und nicht empfangen. – redesert17
'sock.bind ((self.host, self.port))' in 'Senden' ist falsch. 'self.host' ist die entfernte Adresse, an die Sie keinen lokalen Socket binden können. – Barmar