python创建套接字不接收

python创建套接字不接收,python,sockets,connect,Python,Sockets,Connect,我有一个IP='127.0.0.1',端口号'port',正在尝试 class AClass(asyncore.dispatcher): def __init__(self, ip, port): asyncore.dispatcher.__init__(self) self.create_socket(socket.AF_INET, socket.SOCK_STREAM) self.connect((ip

我有一个IP='127.0.0.1',端口号'port',正在尝试

class AClass(asyncore.dispatcher):
     def __init__(self, ip, port):        
        asyncore.dispatcher.__init__(self)
        self.create_socket(socket.AF_INET, socket.SOCK_STREAM)        
        self.connect((ip, port))

    def handle_connect(self):
        print 'connected'   

    def handle_read(self):        
        data = self.recv(8192)
        print data   

    def handle_close(self):
        self.close()
不过什么也没印出来

发送正在由另一个进程处理。我怎么查?以上是正确的吗

编辑: 用于发送:另一个单独运行的python程序:

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((addr, port))
packet="some string"
sock.sendall(packet+'\r\n') 
什么也没发生


如果我把,放在服务器端(!!!)
print sock.recv(4096)
我看到数据包被打印出来了-但是客户端仍然没有发生任何事情。

我假设您的意思是将
AClass
作为服务器端。在这种情况下,
AClass
不应执行
connect()
。套接字通信有两个方面。在服务器端,通常创建套接字,将其绑定到地址和端口,设置积压(通过
listen()
)和
accept()
连接。通常,当您拥有来自客户端的新连接时,您会衍生出一些其他实体来处理该客户端

此代码实现了一个echo服务器:

import asyncore
import socket


class EchoHandler(asyncore.dispatcher_with_send):
    def handle_read(self):
        self.out_buffer = self.recv(1024)
        if not self.out_buffer:
            self.close()
        print "server:", repr(self.out_buffer)

    def handle_close(self):
        self.close()


class EchoServer(asyncore.dispatcher):
    def __init__(self, ip, port):
        asyncore.dispatcher.__init__(self)
        self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
        self.set_reuse_addr()
        self.bind((ip, port))
        self.listen(1)

    def handle_accept(self):
        sock, addr = self.accept()

        print "Connection from", addr

        EchoHandler(sock)

s = EchoServer('127.0.0.1', 21345)
asyncore.loop()
请注意,在
\uuuu init\uuuu()
方法中,我绑定了套接字,并设置了backlog
handle\u accept()
处理新的传入连接。在本例中,我们获取从
accept()
返回的新套接字对象和地址,并为该连接创建一个新的异步处理程序(我们将套接字提供给
EchoHandler
EchoHandler
然后执行从套接字读取的工作,然后将数据放入
out\u缓冲区
asyncore.dispatcher\u with_send
随后会注意到数据已准备好发送,并在后台为我们将其写入套接字,从而将其发送回客户端。因此,我们有两个方面,我们从客户端读取数据,然后将相同的数据发送回服务器

您可以通过几种方式检查此实现。下面是一些python代码,用于打开连接、发送消息、读取响应并退出:

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((ip, port))
client.sendall("Hello world!\r\n")
print "client:", repr(client.recv(1024))
client.close()
在本例中,您还可以使用命令telnet localhost 21345将telnet用作客户端。键入一个字符串,按enter键,服务器将返回该字符串。下面是我做的一个示例课程:

:: telnet 127.0.0.1 21345
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Hello!
Hello!
aouaoeu aoeu aoeu
aouaoeu aoeu aoeu
^]
telnet> quit
Connection closed.
在本例中,第一个“Hello!”是我在客户机中键入的,第二个是来自服务器的回音。然后我又试了另一根弦,它也回响了

如果您以前没有做过套接字通信,我真的无法向您充分推荐Richard Stevens。第三版现已印刷,可在上获得。但是,它不包括使用Python或asyncore。不幸的是,asyncore是Python文档中没有很好介绍的一个模块。不过,在野外也有一些相当不错的例子

希望这能让你朝着正确的方向前进

编辑:这是一个基于asyncore的客户端:

class Client(asyncore.dispatcher_with_send):
    def __init__(self, ip, port, message):
        asyncore.dispatcher_with_send.__init__(self)
        self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
        self.connect((ip, port))
        self.out_buffer = message

    def handle_connect(self):
        print 'connected'

    def handle_read(self):
        data = self.recv(8192)
        print "client:", repr(data)

    def handle_close(self):
        self.close()

您需要执行
self.connect((ip,端口))
。谢谢,我修改了它-这是我第55次尝试打印一些东西,但它越来越令人困惑。您可以包含创建套接字的代码吗?或者不管你是如何得到recv函数的?port='port'真的是吗?不是应该是int吗?谢谢,这很有帮助,我想从你的回答中找到一些可以帮助我的东西。有一个“服务器”,已经实现了,它有一个广播方法,我复制了它来创建一个单播,我确信它可以工作。我想做的是一个客户端,而不是服务器,连接到服务器并获取消息的东西。我的解释正确吗?尽管如此,我能得到的最好结果(使用上面的代码)是一个错误“远程主机强制关闭了一个现有连接”。至于服务器,它的类与您的答案类似。我添加了一个客户端实现。我今天早上已经做了,但根据你的问题,我想你的目标是别的。谢谢。但是在构造函数中,在客户机中,“消息”是什么?客户端从哪里获得它?我只是写了它-减去“消息”,但我仍然没有从客户端打印任何内容…
message
是要传递到另一端的echo服务器的消息。服务器将旋转它并将其发送回。我不知道你的服务器是怎么运行的。。。它是否期望客户端以某种方式启动通信?你是怎么做到的?服务器只是发送了一些东西吗?我有点怀疑,否则你会看到的。您需要理解服务器所使用的协议,并在客户端中遵守该协议。因此,如果它希望你先发言,你就需要发言。
Client
类使用
message
参数执行上述操作。您的客户可能需要做一些不同的事情。