如何在python中实现非阻塞套接字服务器
一个类似但不同的问题: 我有一个生成字符串的IRC客户端。每当有人说话时,这个IRC客户端使用一个钩子来调用一个方法(somone_说)。我想通过套接字将此字符串发送到我的flash客户端 我有一个flash的工作客户端和一个python的服务器,但问题是它会阻塞: 1) 在侦听客户端连接时 2) 在等待生成下一条消息时 这会阻止IRC客户端响应其他输入 我想我需要在一个单独的线程中创建我的套接字,但是这会产生另外三个问题。 1) 我的事件驱动方法是如何访问套接字的 2) 如果有人在没有服务器-客户机连接(在侦听时)或客户机已关闭连接时说了什么,该怎么办。 3) 如何检查线程是否处于活动状态,以及是否打开新线程 我的阻止服务器代码如下:如何在python中实现非阻塞套接字服务器,python,multithreading,sockets,blocking,nonblocking,Python,Multithreading,Sockets,Blocking,Nonblocking,一个类似但不同的问题: 我有一个生成字符串的IRC客户端。每当有人说话时,这个IRC客户端使用一个钩子来调用一个方法(somone_说)。我想通过套接字将此字符串发送到我的flash客户端 我有一个flash的工作客户端和一个python的服务器,但问题是它会阻塞: 1) 在侦听客户端连接时 2) 在等待生成下一条消息时 这会阻止IRC客户端响应其他输入 我想我需要在一个单独的线程中创建我的套接字,但是这会产生另外三个问题。 1) 我的事件驱动方法是如何访问套接字的 2) 如果有人在没有服务器-
# Echo server program
import socket
import sys
HOST = None # Symbolic name meaning all available interfaces
PORT = 7001 # Arbitrary non-privileged port
s = None
def startListening():
print "starting to listen"
for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC,
socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
af, socktype, proto, canonname, sa = res
try:
s = socket.socket(af, socktype, proto)
except socket.error as msg:
s = None
continue
try:
s.bind(sa)
s.listen(1)
except socket.error as msg:
s.close()
s = None
continue
break
if s is None:
print 'could not open socket'
sys.exit(1)
conn, addr = s.accept()
print 'Connected by', addr
while 1:
try:
data = conn.recv(1024)
except:
print "cannot recieve data"
break
if not data:
break
print data
message = ""
while not "quit" in message:
message = raw_input('Say Something : ') # This will come from event driven method
try:
conn.sendall(message)
except Exception as exc:
print "message could not be sent"
break
conn.close()
print "connection closed"
while 1:
startListening()
xchat模块python脚本的工作方式如下(需要运行HexChat)
我已经用头撞这堵墙好几天了。帮助我欧比-万·克诺比,你是我唯一的希望。看看Asyncore,它正是为你所寻找的东西而做的:) 干杯
K.我添加了一些asyncore代码,但脚本在等待连接和发送之间仍然会阻塞。这是不可接受的,因为HexChat IRC客户端在进行此操作时必须执行其他操作。Python提供了使用
socket.setblocking(0)
的功能,之后套接字将是非阻塞的。主文档在这里是可用的(),您在这里也有一些利用()。在侦听客户端连接或发送之间的连接时,程序仍然挂起。我不能允许程序像那样挂起/暂停,因为它应该同时做其他事情。
__module_name__ = "Forward Module"
__module_version__ = "1.0.0"
__module_description__ = "Forward To Flash Module by Xcom"
import sys
import xchat
def someone_said(word, word_eol, userdata):
# method called whenever someone speaks in IRC channel
username = str(word[0]) # From IRC contains the username string
message = str(word[1]) # From IRC contains the user message
sendString = username + " : " + message
send_to_server(sendString)
def send_to_server(message):
# send over socket method to be implemented here
xchat.hook_print('Channel Message' , someone_said)