我假设你的意思是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!”是我在我的客户端输入的,第二个是来自服务器的回显。然后我尝试了另一个字符串,它也被回显。
如果你之前没有做过socket通信,我真的不能推荐理查德史蒂文斯UNIX Network Programming够了。第3版现已印刷在Amazon。但是,它并不包括使用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,端口))'。 – jszakmeister
谢谢,我修改了它 - 这是我第55次尝试获取印刷的东西,但它变得越来越混乱 – Thalia
您可以包含create_socket的代码吗?或者,你是否得到了recv函数? – Collin