0

初めてのクライアント サーバー アプリケーションを作成しようとしたときに、エラーが発生しました。このコードはドキュメントとまったく同じですが、問題があります。

サーバ:

import socket

HOST = 'localhost'
PORT = 9090

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print 'Connected by', addr
while True:
    data = conn.recv(1024)
    if not data: break

print data
conn.close()

クライアント:

import socket

HOST = 'localhost'
PORT = 9090
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.sendall('Hello, world')
s.close()

実行後、メッセージが表示されず、サーバー部分に表示されませprint Connected by, addrprint data

Windows 7、Komodo Firewall (ファイアウォールを閉じようとしましたが、問題は解決しませんでした)、Avast Antivirus、Python 2.7 を使用しています。

非常に興味深いことに、エラーはありませんが、出力は機能しません。

また、サーバー アプリケーションは、クライアントがサーバーに接続するまでフリーズします。これは、スレッドを使用するだけで解決できますか?

前もって感謝します。

4

2 に答える 2

0

+1 Cfreak に。基本的に、データで起こっていることは、空の文字列が割り当てられ、ループが中断されることです。したがって、print ステートメントをループに入れると問題が解決します。ループが終了した後にそのデータにアクセスする必要があると仮定すると、次のようなものを試してください

data = []
while True:
    datum = conn.recv(1024)
    data.append(datum)
    if not datum: break

print " ".join(data)

これが私が実行しているコードと私のコンピューターであり、動作します

クライアント

import socket
HOST = 'localhost'
PORT = 9090
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.sendall('Hello, world')
s.close()

サーバ

import socket

HOST = 'localhost'
PORT = 9090

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print 'Connected by', addr
data = []
while True:
    datum = conn.recv(1024)
    data.append(datum)
    if not datum: break

print " ".join(data)

conn.close()

コードに問題があるとは思いません...ファイアウォール/ウイルス対策のないマシンがある場合は、そのマシンでプログラムを試してください。

于 2013-06-23T18:51:12.013 に答える