为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

回首忆惘然 2023-12-13 15:06:05
我正在开发一个与 Python 服务器连接的 Android 应用程序。如果我将一个名为 Angle 的整数从我的应用程序发送到 python 服务器,服务器将输出 ASCII 字符而不是 int。import socketserver_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)host = "127.0.0.1"port = 1026server_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;        }    }
查看完整描述

1 回答

?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

当您使用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 loop

my_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 转换为 int


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

尽管这不是将整数发送到后端的最佳方式,但它仍然有效,但如果您不知道客户端发送了多少字节,则极容易出错。问题是,当你说recv(1024)你的服务器可能会同时获得多个输入时。在您的情况下,您在发送数据后立即关闭套接字,所以您会没事,但如果您打算维持一个来回发送数据的连接而不关闭连接,那么这将是一个问题。例如,当您的客户端发送一个编码为文本的整数时,您的服务器可能最终会一次以字符串形式获取多个输入,而"102030"实际上10, 20, 30应该将其分开,并且您将不会获得预期的结果。您确实需要知道客户端发送了多少字节以防止这种情况发生。为了防止这种情况,您可以做的另一件事是在它们前面添加一些字符,以便您的客户端发送"-10", "-20", "-30"并服务器接收"-10-20-30",然后使用"-10-20-30".split('-')python 函数相应地解析它们。


查看完整回答
反对 回复 2023-12-13
  • 1 回答
  • 0 关注
  • 81 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信