【问题标题】:Basic Python client socket example基本 Python 客户端套接字示例
【发布时间】:2011-12-06 15:40:47
【问题描述】:

我一直试图了解套接字是如何工作的,并且我一直在尝试挑选一些我在this page 找到的示例代码,用于一个非常简单的客户端套接字程序。由于这是基本示例代码,我认为它没有错误,但是当我尝试编译它时,我收到以下错误消息。

文件“client.py”,第 4 行,在 client_socket.connect(('localhost', 5000)) 文件“”,第 1 行,在连接中 socket.error: [Errno 111] 连接被拒绝

我已经用谷歌搜索了这个错误的几乎每个部分,遇到类似问题的人似乎通过更改端口号、使用“连接”而不是“绑定”以及其他一些事情得到了帮助,但它们都不适用于我的情况。非常感谢任何帮助,因为我对网络编程很陌生,对 python 也很陌生。

顺便说一下,如果链接由于某种原因不起作用,这里是代码。

#client example
import socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 5000))
while 1:
    data = client_socket.recv(512)
    if ( data == 'q' or data == 'Q'):
        client_socket.close()
        break;
    else:
        print "RECIEVED:" , data
        data = raw_input ( "SEND( TYPE q or Q to Quit):" )
        if (data <> 'Q' and data <> 'q'):
            client_socket.send(data)
        else:
            client_socket.send(data)
            client_socket.close()
            break;

【问题讨论】:

  • @TheTromboneWilly Python 解释器肯定会讨厌它,就像在SyntaxError 中一样:D
  • @JSmyth 不在 Python 2 中
  • @TheTromboneWilly 有充分的理由切换到 3 然后 (;
  • @JSmyth 同意,还有许多其他原因!
  • 我遇到了同样的问题,问题是我的 Ubuntu 机器上没有正确配置“localhost”。我用 '' 替换,这解决了问题。

标签: python sockets networking


【解决方案1】:

它试图连接到它在端口 5000 上运行的计算机,但连接被拒绝。你确定你有一个服务器在运行吗?

如果没有,可以使用netcat进行测试:

nc -l -k -p 5000

某些实现可能要求您省略 -p 标志。

【讨论】:

  • 成功了!谢谢你。我对网络编程很陌生。我没有意识到服务器必须在监听客户端才能运行。现在看起来很简单,但出于某种原因,我假设客户端可以自行运行。非常感谢!
  • @dukbur 您需要运行服务器套接字才能使用client_socket.connect 命令,因为它试图将其连接到服务器。因此,由于服务器拒绝连接,您会收到拒绝错误。
【解决方案2】:

您的客户端似乎正在尝试连接到不存在的服务器。在 shell 窗口中,运行:

$ nc -l 5000

在运行 Python 代码之前。它将充当侦听端口 5000 的服务器,供您连接。然后你可以在你的 Python 窗口中输入并看到它出现在另一个终端中,反之亦然。

【讨论】:

    【解决方案3】:

    您可能会混淆编译和执行。 Python没有编译步骤! :) 只要您输入python myprogram.py,程序就会运行,并且在您的情况下,它会尝试连接到开放的端口 5000,如果没有服务器程序正在那里侦听,则会出现错误。听起来你熟悉两步语言,需要编译才能生成可执行文件——因此你会混淆 Python 的运行时编译,“我找不到任何人在监听 5000 端口!”有编译时错误。但是,事实上,您的 Python 代码很好;你只需要在运行前调出一个监听器!

    【讨论】:

    • 我知道如何执行 python 程序。我猜我只是把我的术语弄糊涂了。缺乏听众绝对是我的问题。感谢您的回答! :)
    【解决方案4】:

    这是最简单的python套接字示例。

    服务器端:

    import socket
    
    serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    serversocket.bind(('localhost', 8089))
    serversocket.listen(5) # become a server socket, maximum 5 connections
    
    while True:
        connection, address = serversocket.accept()
        buf = connection.recv(64)
        if len(buf) > 0:
            print buf
            break
    

    客户端:

    import socket
    
    clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    clientsocket.connect(('localhost', 8089))
    clientsocket.send('hello')
    
    • 首先运行SocketServer.py,并确保服务器准备好监听/接收某事
    • 然后客户端向服务器发送信息;
    • 服务器收到某事后,终止

    【讨论】:

    • 如何在 LAN 连接上跨计算机?我有麻烦了。我从上面的示例中清空了“localhost”字符串并将“localhost”更改为“192.168.1.104”(这是服务器的本地 IP 地址),但它仍然不起作用。这是如何工作的?
    • 回答上面的评论者(即使这么晚了)......不要在服务器端使用'localhost'(如果你ping localhost,你将把它解析为127.0.0.1),但机器的实际IP。这假设这些其他可能的原因都不会阻止通信:smartftp.com/support/kb/connection-refused-f58.html
    • 使用 python3 的小问题。在客户端,由于 2.x 和 3.x 之间的字符串不同,您需要将发送更改为clientsocket.send(bytes('hello', 'UTF-8'))(或其他编码)。 (见here
    • 不应该关闭这个socket,而不仅仅是使用break吗?
    【解决方案5】:

    这是一个非常简单的套接字程序。这和套接字一样简单。

    对于客户端程序(CPU 1)

    import socket
    
    s = socket.socket()
    host = '111.111.0.11' # needs to be in quote
    port = 1247
    s.connect((host, port))
    print s.recv(1024)
    inpt = raw_input('type anything and click enter... ')
    s.send(inpt)
    print "the message has been sent"
    

    您必须将第 4 行中的 111.111.0.11 替换为在第二台计算机网络设置中找到的 IP 号。

    对于服务器程序(CPU 2)

    import socket
    
    s = socket.socket()
    host = socket.gethostname()
    port = 1247
    s.bind((host,port))
    s.listen(5)
    while True:
        c, addr = s.accept()
        print("Connection accepted from " + repr(addr[1]))
    
        c.send("Server approved connection\n")
        print repr(addr[1]) + ": " + c.recv(1026)
        c.close()
    

    运行服务器程序,然后运行客户端程序。

    【讨论】:

    • 对不起,我在服务器程序的代码中犯了一个小错误。在第 5 行中,使端口号 1247 不是 12。
    • 我已编辑您的答案以更正端口号。下次您可以使用问题左下角的 edit 链接自行完成。
    猜你喜欢
    • 2018-07-02
    • 2013-12-15
    • 2013-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 2016-01-05
    • 1970-01-01
    相关资源
    最近更新 更多