2017-04-25 7 views
1

私はUDPソケットを使ってPythonで小さなチャットルームアプリケーションを作っています。ユーザーがユーザー名を選択してサーバーにメッセージを送信する場所に設定しました。サーバーは、接続されているすべてのクライアントにメッセージをブロードキャストします。私はサーバを稼動させることができ、クライアントはサーバにメッセージを送ることができます。問題は、サーバーが接続されている他のクライアントにメッセージをブロードキャストしていないことです。UDP Python:UDPチャットルームでクライアントが送信するメッセージブロードキャストメッセージを作成する方法

from socket import * 
    import socket 
    port = 1234 
    localhost='127.0.0.1' 
    #Create a socket 



try : 
    s = socket.socket(AF_INET, SOCK_DGRAM) 
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
    s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) 
    print ('Socket created') 
except socket.error: 
    print ('Error creating socket.') 
    sys.exit() 
#Bind the socket to port and localhost. 
try: 
    s.bind((localhost, port)) 
except socket.error: 
    print ('Error while binding.') 
    sys.exit() 
print ('Bind complete.')  

while 1: 
    # receive data from client (data, addr) 
    d = s.recvfrom(2048) 
    data = d[0] 
    addr = d[1] 

    if not data: 
     break 
    print('Client connected at ' + addr[0] + ':' + str(addr[1])) 

    print('Message[' + addr[0] + ':' + str(addr[1]) + '] - ' +      
    data.strip().decode("utf-8")) 
    s.close() 

クライアントコード:

from socket import * 
import socket 
import sys 
port=1234 
localhost='127.0.0.1' 


try: 
    s = socket.socket(AF_INET, SOCK_DGRAM) 
except socket.error: 
    print ('Error creating socket.') 
    sys.exit() 
print ("Connected to chat") 
Username= input('Please choose a username: ') 
while(1) : 
msg = input ('Enter message to send : ') 

try : 
    #Set the whole string 
    s.sendto('{}: {}'.format(Username,msg).encode('utf-8'), (localhost,port)) 
    # receive data from server (data, addr) 
    data = s.recvfrom(2048) 
    reply = data[0] 
    addr = data[1] 

    print (+ reply.decode()) 

except socket.error: 
    print ('Error sending message ') 
    sys.exit() 

任意の提案ここで

は、サーバーのコードですか?

答えて

1

socket.SO_BROADCASTについては混乱していると思います。受信したすべてのメッセージがすべてのクライアントにブロードキャストされるわけではありません。これは、マシン上のネットワークスタックに、ソケットがブロードキャストパケットを送信するために使用できることを知らせるために使用されます(これは、ブロードキャストアドレスとみなされる宛先アドレスを持つパケットを意味します。サブネットのブロードキャストアドレス:192.168.0.0またはサブネット192.168.0.0/24の場合は192.168.0.255)。

あなたのチャットアプリケーションを意図どおりに機能させるには、接続されたすべてのクライアントのログを保持する必要があります。メッセージを受け取ったら、s.sendto()を使用してすべてのクライアントに再送信できます。

0

ねえ、あなたは本当にこのためasyncio使用する必要があり交尾: (49mins)https://www.youtube.com/watch?v=ZzfHjytDceU

しかし、あなたがする必要があることはまた、あなたが「ドン彼らに

のデータを送信後、ユーザーのオブジェクトを作成していますデータの衛生的処理を行っているように見える。長さと内容は限定されるべきである。基本的に:

from html import escape 
clients = {} 

... 

msg = escape(msg_received[:2048]) 
for c in clients: 
    c.send(msg) 
関連する問題