Windows 7 上的套接字,无法连接

Posted

技术标签:

【中文标题】Windows 7 上的套接字,无法连接【英文标题】:Sockets on Windows 7, can't connect 【发布时间】:2013-06-20 06:39:50 【问题描述】:

尝试创建我的第一个客户端-服务器应用程序时,我遇到了一个错误。此代码与文档中的代码完全相同,但我有问题。

服务器:

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

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

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

提前致谢。

【问题讨论】:

嗨!很高兴您开始使用套接字!但是,如果您不熟悉套接字和线程,那么对您的代码有太多要评论的地方。我建议你看看:twistedtwistedmatrix.com/trac。一个事件驱动的框架,它将为您处理线程!它真的很容易使用! wimps 的框架 =) 实际上,sockets 看起来并不太复杂 【参考方案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()

【讨论】:

【参考方案2】:

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

所以我认为您的代码没有问题...如果您的机器上没有防火墙/防病毒软件,请尝试该机器上的程序。

【讨论】:

johnthexiii ,我试过你的版本,同样的问题。实际上,问题,也许,这里 "conn, addr = s.accept()" 因为我没有看到字符串 "print 'Connected by', addr",并且这段代码在循环之前 @progerz 您没有看到连接打印语句的事实让我认为这是您的计算机的问题。 我也觉得是电脑的问题...很奇怪的问题...早上(12小时前)一切正常

以上是关于Windows 7 上的套接字,无法连接的主要内容,如果未能解决你的问题,请参考以下文章

没有 ConnectEx 的 Windows 上的非阻塞套接字连接

无法在 Windows 2012 MSMQ 中连接 Winsoc 套接字

无法接受服务器上的套接字连接

代理套接字 io 无法与 nginx、docker 上的节点连接

C++ CreateProcess 无法从 Windows 7 上的套接字接收路径 (64)

我无法将套接字 io 与 windows phone 8.1 C# 连接