2017-04-01 8 views
0

私はネットワークとソケットのプログラミングに全く新しいです。私はいくつかのコードを試しました。 3つのクライアントと1つのサーバーc1メッセージがあり、それがサーバーを経由してc2とc3に反映されているとします。スレッドマルチスレッドチャットサーバソケットプログラムを行う方法は?

私の問題:

  1. (私は「こんにちは」、それはまた、私のために示していますが、それはC2とだけC3に示すべきであると言うならば)私は自分自身のメッセージを表示したくありません。
  2. 唯一のC2のような方法は、c1がPythonでこれを実行することができませんでし
  3. それを送信し、エラーが表示されるので、どのようにそれは、Python 3に

を行うことができたときに、C3のメッセージを見ることができず、そこにありますserver.py

import socket 
import time 

host = '' 
port = 5020 

clients = [] 

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
a=s.bind((host, port)) 
#s.setblocking(0) 

quitting = False 
print "Server Started." 
print("socket binded to %s" % (port)) 
while not quitting: 
    try: 
     data, addr = s.recvfrom(1024) 
     if "Quit" in str(data): 
      quitting = True 
     if addr not in clients: 
      clients.append(addr) 
      #print clients 
     for client in clients: 
      if not a:# tried this for broadcasting to others not c1 

       s.sendto(data, client) 

     print time.ctime(time.time()) + str(addr) + ": :" + str(data) 

    except: 
     pass 
s.close() 

これはPython 2のコードです。

client.py

enter code hereimport socket 
import threading 
import time 


shutdown = False 

def receving(name, sock): 
    while not shutdown: 
     try: 

      while True: 
       data, addr = sock.recvfrom(1024) 

       print str(data) 
     except: 
      pass 


host = '' 
port = 5020 

server = ('',5020) 

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
s.bind((host, port)) 
#s.setblocking(0) 

for i in range(5): 
    threading.Thread(target=receving, args=("RecvThread",s)).start() 


alias = raw_input("Name: ") 
message = raw_input(alias + "-> ") 
while message != 'q': 
    if message != '': 
     s.sendto(alias + ": " + message, server) 

    message = raw_input(alias + "-> ") 

    time.sleep(0.1) 

shutdown = True 

s.close() 

出力は、サーバに取得していますが、時間とサーバーメッセージ正しいですが、私の問題は、クライアント出力C1メッセージがC1自体に示されています。

Name: c1 
c1-> hi 
c1-> c1: hi 

3行目の「hi」というメッセージも表示されます。

あなたがこれを行うことができます
+0

この:あなたがこれを行うと、すべての接続されたクライアントのアドレスがaddrの変数に格納されているので

for client in clients: if client!=addr:# tried this for broadcasting to others not c1 s.sendto(data, client) 

を良い質問であるように思われるが、むしろおしゃべりスタイルに傷ついていた。b eggingとtxtspk:改訂履歴でどれくらいの修復が必要か確認してください。完全な単語の入力が面倒すぎる場合は、スタックオーバーフローがあなたのためではないかもしれません。 – halfer

+1

ok @halfer次回は質問を投稿するように改善しようとしています – onemanarmy

答えて

0

代わりの

for client in clients: 
    if not a:# tried this for broadcasting to others not c1 

     s.sendto(data, client) 

data, addr = s.recvfrom(1024) 
関連する問題