gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:59:05 24 4
gpt4 key购买 nike

我正在开发一个与 Python 服务器连接的 Android 应用程序。如果我从我的应用程序向 python 服务器发送一个名为 Angle 的整数,服务器将输出 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;
}
}

最佳答案

当您使用 PrintWriter.write(int c) 时方法,您基本上将整数转换为字符,当服务器接收到输入时,它接收到文本。

来自 PrintWriter 类文档:

Prints formatted representations of objects to a text-output stream. This class implements all of the print methods found in PrintStream. It does not contain methods for writing raw bytes, for which a program should use unencoded byte streams.

如果您想要更好的方法,请执行此操作。如果您想放弃 PrintWriter 并向您的服务器发送一个纯整数,您可以这样做:

在您的 Java 客户端上:

使用您的 Socket 的 OutputStream.write(byte b[])方法并传递你的 int。整数通常由 4 个字节组成。使用此方法时,您会向 Python 服务器发送 4 个字节。

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 函数相应地解析它们。

关于java - Python 服务器打印 ASCII 而不是整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58549490/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com