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, addr执行后,我print data在服务器部分看不到消息。

我使用 Windows 7、Komodo 防火墙(我试图关闭防火墙,但没有解决问题)、Avast Antivirus、Python 2.7。

非常有趣,没有错误,但输出不起作用。

此外,我的服务器应用程序只是冻结,直到客户端连接到服务器。这可以仅使用线程解决吗?

提前致谢。

4

2 回答 2

1

您需要在循环内accept()print(或使用两个循环)。我对 Python 中的套接字编程不是很熟悉,但我猜它看起来像这样。(完全未经测试!)

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)

while True:
    conn, addr = s.accept()
    print 'Connected by', addr

    while True:
        data = conn.recv(1024)
        if not data: 
            break

        print data
    conn.close()
于 2013-06-23T18:45:12.367 回答
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 回答