2013-06-23 80 views
0

试图创建我的第一个客户机 - 服务器应用程序时遇到了错误... 此代码与文档中的完全相同,但我遇到了问题。Windows 7上的套接字无法连接

服务器:

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,Comodo防火墙(我试图关闭防火墙,但它没有解决问题),Avast Antivirus,Python 2.7。

非常有趣的是,所有的工作正常,并在一瞬间不起作用。

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

对不起,我的英文不好。提前致谢。

+0

嗨!很高兴您开始使用套接字工作!但是,如果您对套接字和线程不太熟悉,那么对您的代码进行评论就太多了。我可以建议你看看:twisted http://twistedmatrix.com/trac/。一个事件驱动的框架,它会为你打扰线程!它非常易于使用! – enpenax

+0

wimps框架=)其实,套接字看起来不太复杂 – progerz

回答

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() 

所以我不认为这是你的代码的问题...如果你有一台机器没有一个防火墙/防病毒软件会尝试该机器上的程序。

+0

** johnthexiii **,我试过你的版本,同样的问题。其实,问题,也许,在这里“** conn,addr = s.accept()**”因为字符串“打印”**连接',addr **“我不会看到,并且此代码在循环之前 – progerz

+0

@progerz事实上,你没有看到连接打印语句让我觉得这是你的电脑有问题。 – John

+0

我也认为,这是计算机的问题...非常奇怪的问题...在早上(12小时前)所有工作正常 – progerz

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() 
+0

感谢您编辑我的文章! – progerz

相关问题