2012-10-10 34 views
0

我有一个IP =“127.0.0.1”,端口号“端口”,并试图蟒创建套接字没有接收到

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)我看到印包 - 但客户端仍然没有发生任何事情。

+0

你需要做的'self.connect((IP,端口))'。 – jszakmeister

+0

谢谢,我修改了它 - 这是我第55次尝试获取印刷的东西,但它变得越来越混乱 – Thalia

+0

您可以包含create_socket的代码吗?或者,你是否得到了recv函数? – Collin

回答

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!”是我在我的客户端输入的,第二个是来自服务器的回显。然后我尝试了另一个字符串,它也被回显。

如果你之前没有做过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() 
+0

谢谢,这是有帮助的,我试图从你的回应中找到一些可以帮助我的东西。有一个已经实现的“服务器”,它有一个广播方法,我复制它来创建一个我确信可以工作的单播。我试图做的是一个CLIENT,而不是服务器,它连接到服务器并获取消息。我的解释是否正确?尽管如此,我能得到的最好结果(使用上面的代码)是一个错误:“现有连接被远程主机强行关闭”。至于服务器 - 它有类似于你的答案的类。 – Thalia

+0

我添加了一个客户端实现。我今天早上做了这件事,但是基于你的问题思考 - 你正在瞄准别的东西。 – jszakmeister

+0

谢谢。但在构造函数中,在客户端中,“消息”是什么?客户在哪里得到它? – Thalia