题 (非常)基本的Python客户端套接字示例


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

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

我已经搜索了这个错误的每个部分,并且有类似问题的人似乎通过更改端口号,使用'connect'而不是'bind'以及其他一些东西来帮助,但没有一个他们适用于我的情况。非常感谢任何帮助,因为我对网络编程很新,而且对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;

51
2017-10-13 04:03


起源


@TheTromboneWilly Python解释器肯定会讨厌它 SyntaxError :d - JSmyth
@JSmyth不是Python 2 - Jerfov2
@TheTromboneWilly有充分理由改用3然后(; - JSmyth
@JSmyth同意,以及其他许多原因! - Jerfov2


答案:


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

如果没有,你可以使用 netcat 供测试用:

nc -l -k -p 5000

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


17
2017-10-13 04:12



那很有效!谢谢。我对网络编程很陌生。我没有意识到服务器必须监听客户端运行。现在看起来似乎不费吹灰之力,但出于某种原因,我假设客户端可以独立运行。非常感谢! - dukbur
@dukbur你需要运行服务器套接字才能使用 client_socket.connect 命令,因为它尝试将其连接到服务器。因此,当服务器拒绝连接时,您会收到拒绝错误。 - Lolitha Ratnayake


这是最简单的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,并确保服务器已准备好收听/接收某事
  • 然后客户端将信息发送到服务器;
  • 服务器收到后,它终止

109
2017-08-18 09:23



我如何在LAN连接上执行此跨计算机?我遇到了麻烦。我从顶部示例清空“localhost”字符串并将“localhost”更改为“192.168.1.104”(这是服务器的本地IP地址)但它仍然无法正常工作。这个怎么用? - Jerfov2
要回答上面的评论者(即使这么晚)...不要在服务器端使用'localhost'(如果你ping localhost,你将它解析为127.0.0.1),而是使用机器的实际IP。这假设这些其他可能的原因都不会阻止通信: smartftp.com/support/kb/connection-refused-f58.html 。 - elder elder
使用python3的小问题。在客户端中,您需要将发送更改为 clientsocket.send(bytes('hello', 'UTF-8')) (或其他编码)由于2.x和3.x之间的字符串差异。 (看到 这里) - Chris Sprague
不应该这样 socket 被关闭,而不仅仅是使用 break? - user1318135


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

用于客户端程序(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"

您必须使用第二个计算机网络设置中找到的IP号替换第4行中的111.111.0.11。

对于服务器程序(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()

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


20
2018-02-07 15:12



对不起,我在服务器程序的代码中犯了一个小错误。在第5行中输入端口号 1247 不是12。 - Pyboss
我已编辑您的答案以更正端口号。下次你可以通过使用自己来做到这一点 编辑 链接在问题的左下角。 - Chris


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

$ nc -l 5000

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


4
2017-10-13 04:16





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


3
2017-10-13 04:16



我知道如何执行python程序。我猜我的术语很混乱。缺乏听众肯定是我的问题。感谢您的回答! :) - dukbur