1

ここでの私のチャットアプリのように、クライアントがメッセージをサーバーに送信すると、クライアントがメッセージを再度送信する前にサーバーが返信を送信する必要があります。これを回避する方法は?

サーバー プログラム:

from socket import *
import threading
host=gethostname()
port=7776
s=socket()
s.bind((host, port))
s.listen(5)
print "Server is Ready!"
def client():
    c, addr= s.accept()
    while True:

        print c.recv(1024)
        c.sendto(raw_input(), addr)

for i in range(1,100):
    threading.Thread(target=client).start()
s.close()

クライアント プログラム:

from socket import *
host=gethostname()
port=7776
s=socket()
s.connect((host, port))

while True:
    s.send(( raw_input()))
    data= s.recv(1024)
    if data:
        print data
s.close()
4

1 に答える 1

0

中央サーバーがクライアントからメッセージを受信し、それを他のすべてのクライアントに送信することを意図していたのは確かですよね? あなたが実装したものは正確にはそうではありません.代わりに、サーバープロセスはクライアントから到着したすべてのメッセージを出力するだけです.

とにかく、実装方法に基づいて、これを行う方法は次のとおりです。

サーバ:

from socket import *
import threading

def clientHandler():
    c, addr = s.accept()
    c.settimeout(1.0)

    while True:
        try:
            msg = c.recv(1024)
            if msg:
                print "Message received from address %s: %s" % (addr, msg)
        except timeout:
            pass

host = "127.0.0.1"
port = 7776
s = socket()
s.bind((host, port))
s.listen(5)

for i in range(1, 100):
    threading.Thread(target=clientHandler).start()
s.close()
print "Server is Ready!"

クライアント:

from socket import *

host = "127.0.0.1"
port = 7776

s = socket()
s.settimeout(0.2)

s.connect((host, port))

print "Client #%x is Ready!" % id(s)

while True:
    msg = raw_input("Input message to server: ")
    s.send(msg)

    try:
        print s.recv(1024)
    except timeout:
        pass

s.close()
于 2016-06-20T13:17:00.543 に答える