Python高效的套接字通信

时间:2015-05-30 20:00:56

标签: python sockets

我最近开始制作一个纯粹的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()

1 个答案:

答案 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))

在你的情况下,host127.0.0.1,换句话说,你的本地主机,也可以通过socket.gethostbyname(socket.gethostname())访问(但这有点冗长),然后{ {1}},适合您port。一旦限制了套接字,就必须通过以下语法接受连接:

5756

然后,您可以将conn, addr = s.accept() conn传递给任何函数,或者只使用其他任何代码。

无论您使用什么,接收数据都可以使用addr并传递缓冲区限制。 (请记住解码收到的任何内容。)当然,您使用socket.recv()发送数据。

如果将其与socket.sendall()模块结合使用,如上所示,您可以处理多个api请求,这些请求将来可能会派上用场。

希望这有帮助。