Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Asyncore循环和原始输入问题_Python_Loops_Raw Input_Asyncore - Fatal编程技术网

Python Asyncore循环和原始输入问题

Python Asyncore循环和原始输入问题,python,loops,raw-input,asyncore,Python,Loops,Raw Input,Asyncore,我正在尝试学习asyncore模块。所以我决定开发一个聊天程序。我必须同时收听网络和广播udp包。但问题是,当用户键入消息时,用户看不到其他用户发送的其他消息。我该怎么办?我的代码: #!/usr/bin/python # -*- coding: utf-8 -*- import asyncore import socket class Listener(asyncore.dispatcher): def __init__(self, port): asyncore.

我正在尝试学习asyncore模块。所以我决定开发一个聊天程序。我必须同时收听网络和广播udp包。但问题是,当用户键入消息时,用户看不到其他用户发送的其他消息。我该怎么办?我的代码:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import asyncore
import socket

class Listener(asyncore.dispatcher):
    def __init__(self, port):
        asyncore.dispatcher.__init__(self)
        self.port = port
        self.create_socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.bind(('', self.port))

    def handle_connect(self):
        print "CONNECTED."

    def handle_read(self):
        data, addr = self.recvfrom(1024)
        print str(addr) + " > " + data

    def handle_write(self):
        pass

class Sender(asyncore.dispatcher):
    def __init__(self, port):
        asyncore.dispatcher.__init__(self)
        self.buffer = ""
        self.port = port
        self.create_socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
        self.bind(('',0))

    def handle_connect(self):
        print "CONNECTED."

    def handle_read(self):
        pass

    def handle_write(self):
        if self.buffer != "":
            sent = self.sendto(self.buffer, ('<broadcast>', self.port))
            self.buffer = self.buffer[sent:]

    def handle_close(self):
        self.close()

    def serve_forever(self):
        asyncore.loop(count = 10)

if  __name__ == "__main__":
    Listener(50000)
    sender = Sender(50000)

    while True:
        sender.serve_forever()
        sender.buffer += raw_input("Message:")
#/usr/bin/python
#-*-编码:utf-8-*-
导入异步内核
导入套接字
类侦听器(asyncore.dispatcher):
def _u初始(自身,端口):
asyncore.dispatcher.\uuuuu init\uuuuu(self)
self.port=端口
self.create_socket(socket.AF_INET,socket.SOCK_DGRAM)
self.setsockopt(socket.SOL_socket,socket.SO_REUSEADDR,1)
self.bind(('',self.port))
def手柄连接(自):
打印“已连接”
def句柄读取(自):
数据,addr=self.recvfrom(1024)
打印str(addr)+“>”+数据
def句柄_写入(自):
通过
类发送方(asyncore.dispatcher):
def _u初始(自身,端口):
asyncore.dispatcher.\uuuuu init\uuuuu(self)
self.buffer=“”
self.port=端口
self.create_socket(socket.AF_INET,socket.SOCK_DGRAM)
self.setsockopt(socket.SOL_socket,socket.SO_广播,1)
自绑定(('',0))
def手柄连接(自):
打印“已连接”
def句柄读取(自):
通过
def句柄_写入(自):
如果self.buffer!="":
sent=self.sendto(self.buffer,('',self.port))
self.buffer=self.buffer[sent:]
def手柄_关闭(自身):
self.close()
def永远为您服务(自我):
asyncore.loop(计数=10)
如果名称=“\uuuuu main\uuuuuuuu”:
听众(50000)
发送方=发送方(50000)
尽管如此:
寄件人。永远为你服务()
sender.buffer+=原始输入(“消息:”)

原始输入调用被阻塞,但您也可以对其使用asyncore。
您需要添加第三个玩家,即:

class CmdlineClient(asyncore.file_dispatcher):
    def __init__(self, sender, file):
        asyncore.file_dispatcher.__init__(self, file)
        self.sender = sender

    def handle_read(self):
        self.sender.buffer += self.recv(1024)

import sys
sender = Sender(50000)
cmdline = CmdlineClient(sender, sys.stdin)
请使用以下设备连接到char服务器:

$ nc -v 127.0.0.1 4444

然后,您可以在终端上与服务器聊天。

您考虑过吗?如果可能的话,我想使用asyncore解决这个问题。您能给我一个好的理由吗?@JakobBowyer:“我正在尝试学习asyncore模块”-问题的第一行。谢谢您的意见。asyncore可以工作。不幸的是,它仅在Unix上可用。
 $ python ChatManager.py
[*] Listener -         __init__ - create a socket
[*] Listener -         __init__ - bind socket address
[*] Listener -         __init__ - listen socket on 127.0.0.1:4444
$ nc -v 127.0.0.1 4444