python-为什么此代码不起作用

时间:2018-07-04 23:24:29

标签: python client-server

我有Black Hat Python书中的以下代码,但是它不起作用,我也不知道为什么。

def client_handler(client_socket):
    global command

    ...

    if command:
        while True:
            client_socket.send('<ncreplace:#> '.encode('utf-8'))
            cmd_buffer = ''

            while '\n' not in cmd_buffer:
                cmd_buffer += str(client_socket.recv(1024))
                print('loop')

            response = run_cmd(cmd_buffer)

            client_socket.send(response.encode('utf-8'))

def run_cmd(command):
    print('command')
    command = command.strip()

    try:
        output = subprocess.check_output(command, stderr=subprocess.STDOUT, shell=True)
    except:
        output = 'Failed to execute command.\r\n'

    return output

问题是:当我运行所有程序(应该是一些客户端服务器应用程序,并且该程序应该在服务器端运行)时,当执行cliend_handler方法时,它不会调用run_cmd方法。它仅打印“循环”一次,但不打印“命令”(我已将这些打印语句用于调试)。有人可以告诉我为什么吗?

1 个答案:

答案 0 :(得分:1)

这是您的问题,或者至少是一个问题,导致该代码无法正常工作:

@FXML
TableView<Client> selectClientTable;
@FXML
TableColumn<Client, String> CodeC, NomC, RegCommerceC, IdFiscalC, NArtFisC;
@FXML
Button selectClientButton, returnSelectClientButton;

ObservableList<Clients> mylist = FXCollections.observableArrayList();

@Override
public void initialize(URL location, ResourceBundle resources) {
    populateTable();
}


void populateTable() {
    mylist.addAll(clientsArray);

    CodeC.setCellValueFactory(c -> new SimpleStringProperty(String.valueOf(c.getValue().getCodeC())));
    NomC.setCellValueFactory(c -> new SimpleStringProperty(c.getValue().getNomC()));
    RegCommerceC.setCellValueFactory(c -> new SimpleStringProperty(c.getValue().getRegCom()));
    IdFiscalC.setCellValueFactory(c -> new SimpleStringProperty(c.getValue().getIdFiscal()));
    NArtFisC.setCellValueFactory(c -> new SimpleStringProperty(c.getValue().getnArticleFiscal()));

    for (Clients client : clientsArray) {
        System.out.println(String.valueOf(client.getCodeC()) + client.getNomC() + client.getRegCom() + client.getIdFiscal() + client.getnArticleFiscal());
    }

    selectClientTable.setItems(mylist);
}

假设这是Python 3,while '\n' not in cmd_buffer: cmd_buffer += str(client_socket.recv(1024)) 返回一个recv。大概包含UTF-8编码的文本。您需要解码。您可以通过调用bytes而不是decode来实现。 str所做的只是这里的错误。例如:

str

您不希望该>>> b = b'abc' >>> print(b.decode()) abc >>> print(str(b)) b'abc' 或那些b个字符。

更重要的是,看看换行符的作用:

'

它将每个换行符转义为反斜杠和n。因此,当您一遍又一遍地询问缓冲区中是否有换行符时,永远不会有换行符。


如果此代码是为Python 2编写的,并且最初没有进行>>> b = b'abc\ndef\n' >>> print(b.decode()) abc def >>> print(str(b)) b'abc\ndef\n' 调用,那么将Python 2代码移植到Python 3可能会比仅随机抛出str更加棘手。和str调用,直到您停止获取异常为止。这些文档具有a chapter on porting Python 2 to 3,尽管它实际上是为精通Python 2的人们准备的,所以您可能需要搜索The Conservative Python 3 Porting Guide之类的第三方教程。 (我不知道这是不是特别好,这只是搜索中出现的第一件事,但看起来不错,并且至少涵盖了如何使用bytesmodernize向导没有,至少我上次看过。)