0

我有一个 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)我看到打印的数据包 - 但客户端仍然没有任何反应。

4

1 回答 1

2

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

这段代码实现了一个回显服务器:

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

请注意,在该__init__()方法中,我绑定了套接字,并设置了积压工作。 handle_accept()是什么处理新的传入连接。在这种情况下,我们从 获取新的套接字对象和返回的地址accept(),并为该连接创建一个新的异步处理程序(我们将套接字提供给EchoHandler)。 EchoHandler然后从套接字读取数据,然后将该数据放入out_buffer. asyncore.dispatcher_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 作为您的客户端。输入一个字符串,按回车键,服务器将发送回该字符串。这是我做的一个示例会话:

:: 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 UNIX Network Programming。第 3 版现已印刷并在亚马逊上提供。但是,它不包括使用 Python 或 asyncore。而且,不幸的是,asyncore 是一个在 Python 文档中并没有很好地涵盖的模块。不过,在野外有一些相当不错的例子。

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

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

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()
于 2012-10-10T08:34:09.977 回答