猿问

Python 服务器打印 ASCII 而不是整数

我正在开发一个与 Python 服务器连接的 Android 应用程序。如果我将一个名为 Angle 的整数从我的应用程序发送到 python 服务器,服务器将输出 ASCII 字符而不是 int。


import socket


server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)


host = "127.0.0.1"

port = 1026


server_socket.bind((host, port))

server_socket.listen(3)


while True:

    client_socket, address = server_socket.accept()

    try:

        while True:

            data = client_socket.recv(1024)


            print(data.decode('utf-8'))


    finally:

        client_socket.close()

Java 中的后台 Android 代码:


class send extends AsyncTask<Void, Void , Void>{

        Socket s;

        PrintWriter pw;

        @Override


        protected Void doInBackground(Void...params){

            try{

                s = new Socket("10.0.2.2",1026);

                pw = new PrintWriter(s.getOutputStream());

                pw.write(Angle);

                pw.flush();

                pw.close();

                s.close();

            } catch (UnknownHostException e ){

                System.out.println("Fail");

                e.printStackTrace();

            } catch (IOException e){

                System.out.println("Fail");

                e.printStackTrace();

            }

            return null;

        }

    }


回首忆惘然
浏览 92回答 1
1回答

幕布斯7119047

当您使用PrintWriter.write(int c)方法时,您基本上将整数转换为字符,并且当服务器接收输入时,它会接收文本。来自 PrintWriter 类文档:将对象的格式化表示打印到文本输出流。此类实现了 PrintStream 中的所有打印方法。它不包含写入原始字节的方法,程序应使用未编码的字节流。如果您想要更好的方法,请这样做。如果您想放弃 PrintWriter 并将纯整数发送到您的服务器,您可以这样做:在您的 Java 客户端上:使用 Socket 的OutputStream.write(byte b[])方法并传递您的 int 。整数通常由 4 个字节组成。使用此方法时,您将 4 个字节发送到 python 服务器。outputStream.write(ByteBuffer.allocate(4).putInt(yourIntHere).array());在你的 Python 服务器上:from struct import unpack# put this in your socket while True loopmy_bytes = client_socket.recv(4)my_int = unpack('>I', my_bytes)[0]所以基本上每次你的 Socket 客户端发送 4 个字节的整数时,你的服务器必须正好接收到 4 个字节,因为这是整数长度。最后 unpack() 方法将字节转换为 int。不推荐: 如果您仍然想使用 PrintWriter,请使用PrintWriter.write(String s)方法将 int 作为 String 发送(确保首先将 int 转换为 String)。然后在你的 python 服务器上通过简单地使用将 str 转换为 intint(data.decode('utf-8'))尽管这不是将整数发送到后端的最佳方式,但它仍然有效,但如果您不知道客户端发送了多少字节,则极容易出错。问题是,当你说recv(1024)你的服务器可能会同时获得多个输入时。在您的情况下,您在发送数据后立即关闭套接字,所以您会没事,但如果您打算维持一个来回发送数据的连接而不关闭连接,那么这将是一个问题。例如,当您的客户端发送一个编码为文本的整数时,您的服务器可能最终会一次以字符串形式获取多个输入,而"102030"实际上10, 20, 30应该将其分开,并且您将不会获得预期的结果。您确实需要知道客户端发送了多少字节以防止这种情况发生。为了防止这种情况,您可以做的另一件事是在它们前面添加一些字符,以便您的客户端发送"-10", "-20", "-30"并服务器接收"-10-20-30",然后使用"-10-20-30".split('-')python 函数相应地解析它们。
随时随地看视频慕课网APP

相关分类

Java
我要回答