我最近开始制作一个纯粹的skype解析器,在做完所有事情后我坚持使用套接字通信。
我正在使用python来获取用户的IP,然后脚本打开一个套接字服务器并将用户名发送到用.NET编写的其他程序
为什么?好吧,python skype API不是那么强大,所以我使用axSkype库来收集更多信息。
python套接字发送用户名,但我不知道最有效的方法来获取信息。我想在同一个脚本中打开一个套接字服务器,等待.NET程序发回的内容。
我真的不知道如何尽可能快地做到这一点,所以我在寻求你的帮助。
class api:
def GET(self, username):
skypeapi.activateSkype(username)
time.sleep(1) # because skype is ew
buf = []
print("==========================")
print("Resolving user " + username)
#This is where i'm starting the socket and sending data
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("127.0.0.1", 5756))
s.sendall(username)
s.close()
#at this poaint i want to get data back from the .NET app
for logfile in glob.glob('*.log'):
buf += logparse.search(logfile, username)
print("Done!")
print("==========================")
return json.dumps(buf)
class index:
def GET(self):
return render.index()
if __name__ == "__main__":
app.run()
答案 0 :(得分:1)
您可以将套接字绑定到连接。这样,您的套接字流将保持打开状态,您将能够轻松地发送和接收信息。将其与_thread
模块集成,您将能够处理多个流。下面是一些示例代码,它将套接字绑定到流,然后只返回客户端发送的任何内容(尽管在您的情况下,您可以发送任何必要的数据)
import socket
from _thread import *
#clientHandle function will just receive and send stuff back to a specific client.
def clientHandle(stream):
stream.send(str.encode("Enter some stuff: "))
while True:
#Here is where the program waits for a response. The 4000 is a buffer limit.
data = stream.recv(4000)
if not data:
#If there is not data, exit the loop.
break
stream.senddall(str.encode(data + "\n"))
#Creating socket.
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = "" #In this case the host is the localhost but you can put your host
port = 80
try:
#Here the program tries to bind the socket to the stream.
s.bind((host, port))
except socket.error as e:
print("There was an error: " + str(e))
#Main program loop. Uses multithreading to handle multiple clients.
while True:
conn, addr = s.accept()
print("Connected to: " + addr[0] + ": " + str(addr[1]))
start_new_thread(clientHandle,(conn,))
现在在你的情况下,你可以将它集成到你的api
课程中(那是你想要整合它的地方吗?如果我错了,请纠正我。)所以现在定义和绑定套接字时,请使用以下代码:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, port))
在你的情况下,host
是127.0.0.1
,换句话说,你的本地主机,也可以通过socket.gethostbyname(socket.gethostname())
访问(但这有点冗长),然后{ {1}},适合您port
。一旦限制了套接字,就必须通过以下语法接受连接:
5756
然后,您可以将conn, addr = s.accept()
和conn
传递给任何函数,或者只使用其他任何代码。
无论您使用什么,接收数据都可以使用addr
并传递缓冲区限制。 (请记住解码收到的任何内容。)当然,您使用socket.recv()
发送数据。
如果将其与socket.sendall()
模块结合使用,如上所示,您可以处理多个api请求,这些请求将来可能会派上用场。
希望这有帮助。