0

我正在尝试调整 API 的示例 java 代码以使用 python 脚本。我知道 java 代码可以工作并且可以在 python 中进行套接字连接,但无法弄清楚如何在 python 中转换字符串以便能够成功发送 xml 请求。我很确定我需要使用 struct 但上周还没有弄清楚。

此外,我相当确定我需要先发送请求的长度,然后再发送请求,但我再一次无法获得任何东西来显示服务器程序上的成功请求。

public void connect(String host, int port) {
    try {
        setServerSocket(new Socket(host, port));

        setOutputStream(new DataOutputStream(getServerSocket().getOutputStream()));
        setInputStream(new DataInputStream(getServerSocket().getInputStream()));
        System.out.println("Connection established.");
    } catch (IOException e) {
        System.out.println("Unable to connect to the server.");
        System.exit(1);
    }
}

public void disconnect() {
    try {
        getOutputStream().close();
        getInputStream().close();
        getServerSocket().close();
    } catch (IOException e) {
        // do nothing, the program is closing
    }
}

/**
 * Sends the xml request to the server to be processed.
 * @param xml the request to send to the server
 * @return the response from the server
 */
public String sendRequest(String xml) {
    byte[] bytes = xml.getBytes();
    int size = bytes.length;
    try {
        getOutputStream().writeInt(size);
        getOutputStream().write(bytes);
        getOutputStream().flush();
        System.out.println("Request sent.");

        return listenMode();
    } catch (IOException e) {
        System.out.println("The connection to the server was lost.");
        return null;
    }
}
4

1 回答 1

0

如果您尝试在 python 中发送字符串:

在 python2 中,您只需执行sock.send(s)wheres是您要发送的字符串并且socksocket.socket. 在 python3 中,您需要将字符串转换为字节串。您可以使用 bytes(s, 'utf-8') 进行转换,也可以像在 b'abcd' 中那样在字符串前面加上 ab 前缀。请注意,发送仍然具有套接字发送的所有正常限制,即它只会发送尽可能多的内容,并返回经过多少字节的计数。

以下将作为具有sock属性的类的方法工作。 sock是要通过的套接字

def send_request(self, xml_string):
    send_string = struct.pack('i', len(xml_string)) + xml_string
    size = len(send_string)
    sent = 0
    while sent < size:
        try:
            sent += self.sock.send(send_string[sent:])
        except socket.error:
            print >> sys.stderr, "The connection to the server was lost."
            break
    else:
        print "Request sent."

确保import socket, sys, 和struct

于 2013-05-16T21:48:38.597 回答