3

基本上,我的想法是编写某种基本服务器,我可以在其中连接到我的计算机,然后远程运行命令。这似乎不是什么大问题。但后来我有了一个好主意,下一步逻辑上是添加某种线程,这样我就可以产生多个连接。

我读到,由于 GIL,multiprocessing.Process最好尝试这样做。我不完全理解线程,很难找到关于它的好的文档;所以我只是扔东西并试图弄清楚它是如何工作的。

好吧,看来我可能快要做到这一点了;但我有一种感觉,我几乎不可能正确地做到这一点。我的程序现在确实允许多个连接,而当我第一次开始使用线程时它没有;但是一旦建立连接,然后建立另一个连接,第一个连接就不再能够向服务器发送命令。如果有人能给我任何帮助,或者指出我需要学习和理解的正确方向,我将不胜感激。

这是我的代码:

class server:
    def __init__(self):
        self.s = socket.socket()
        try:
            self.s.bind(("",69696))
            self.s.listen(1)
        except socket.error,(value,message):
            if self.s:
                self.s.close()
    def connection(self):
        while True:
            client , address = self.s.accept()

            data = client.recv(5)
            password = 'hello'
            while 1:
                if data == password:
                    subprocess.call('firefox')
                    client.close()
                else:
                    client.send('wrong password')
                    data = client.recv(5)
            p = Process(target=x.connection())
            p.start()
x = server()

if __name__ == '__main':
    main()
4

1 回答 1

1

好吧,这个答案仅适用于您使用的是 unix 或类似 unix 的操作系统(windows 没有os.fork()我们使用的操作系统)。

在 unix 平台上做这些事情的最常见方法之一是派生一个新进程来处理客户端连接,而主进程继续侦听请求。

下面是一个可以处理多个同时连接的简单回显服务器的代码。您只需要修改handle_client_connection()以满足您的需求

import socket
import os

class ForkingServer:
    def serve_forever(self):
        self.s = socket.socket()
        try:
            self.s.bind(("", 9000))
            self.s.listen(1)
        except socket.error, (value,message):
            print "error:", message
            if self.s:
                self.s.close()
            return

        while True:
            client,address = self.s.accept()
            pid = os.fork()
            # You should read the documentation for how fork() works if you don't
            # know it already
            # The short version is that at this point in the code, there are 2 processes
            # completely identical to each other which are simulatenously executing
            # The only difference is that the parent process gets the pid of the child
            # returned from fork() and the child process gets a value of 0 returned
            if pid == 0:
                # only the newly spawned process will execute this
                self.handle_client_connection(client, address)
                break
            # In the meantime the parent process will continue on to here
            # thus it will go back to the beginning of the loop and accept a new connection

    def handle_client_connection(self, client,address):
        #simple echo server
        print "Got a connection from:", address
        while True:
            data = client.recv(5)
            if not data:
                # client closed the connection
                break
            client.send(data)
        print "Connection from", address, "closed"


server = ForkingServer()
server.serve_forever()
于 2013-03-04T23:44:04.710 回答