gpt4 book ai didi

java - 将 Python 网络代码转换为 Java

转载 作者:行者123 更新时间:2023-12-01 11:09:00 25 4
gpt4 key购买 nike

给定 Python 中的以下函数定义:

class NetworkClient:
def __init__(self, ip):
self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP)
self.s.connect((str(ip), 7331))

def readmem(self, address, length):
if length == 0: raise BaseException, "Why are you giving me no length" #Please don't do this to me
if not self.ValidMemory().validrange(address, length): return
if not self.ValidMemory().validaccess(address, length, "read"): return
self.s.send("\x04") #cmd_readmem
request = struct.pack(">II", address, address + length)
self.s.send(request)
status = self.s.recv(1)
if status == "\xbd": #Non-zero memory was found
response = self.s.recv(length)
elif status == "\xb0": #All zeroes
response = "\x00" * length
else: return #Something went terribly wrong
return response

我现在想在 Java 中做同样的事情。例如,我想读取地址 0x10000003 处长度为 0x1 的内存,例如1 字节。

到目前为止,我编写了以下代码:

import java.io.*;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

public class NetworkClient
{
public static void main(String[] arguments) throws IOException, InterruptedException
{
try (Socket clientSocket = new Socket("192.168.178.35", 7331);
PrintWriter outputWriter =
new PrintWriter(clientSocket.getOutputStream(), true);
BufferedReader inputReader =
new BufferedReader(
new InputStreamReader(clientSocket.getInputStream())))
{
System.out.println("Connected");

byte readMemoryCommand = (byte) 4;
int memoryAddress = 0x10000003;
int length = 0x1;

outputWriter.print(readMemoryCommand);
outputWriter.print(memoryAddress);
outputWriter.println(memoryAddress + length);

System.out.println("Receiving");
System.out.println(inputReader.read());
System.out.println("Received");
}
}

public static byte[] toByteArray(String letters)
{
return letters.getBytes(StandardCharsets.US_ASCII);
}
}

建立连接有效,但发送数据后没有响应。服务器没有发回任何内容,并且我的 Java 程序卡在 readLine() 上。输出结果如下:

Connected
Receiving

read() 替换 readLine() 没有帮助。将 DataOutputStreamwritewriteInt 调用一起使用也不起作用。

我在这里遇到的困难似乎是正确准备和发送请求数据。供您引用,Python 函数 struct.packinteractive Python session 中产生以下结果:

>>> import struct
>>> struct.pack(">II", 10000003, 10000004)
b'\x00\x98\x96\x83\x00\x98\x96\x84'
>>>

两个整数都转换为十六进制并“打包”到字节数组中。

readmem 命令字符串被转换为 ASCII 字节数组,我相信:

>>> print("\x04")
*Box with questionmark in it*
>>> s = "04"
>>> ":".join("{:02x}".format(ord(c)) for c in s)
'30:34'
>>>

后一个打印字节的代码取自 here .

那么 Java 代码有什么问题呢?

最佳答案

您应该使用DataOutputStream而不是 PrintWriter。请密切注意文档 - writewriteByte 方法发送一个字节,writeInt 发送四个字节。同样,阅读应该使用 DataInputStream 来完成。 ,特别是 readBytereadFully 方法,而不是 BufferedReader。

写入器和读取器处理文本,而不是字节。 PrintWriter.print 发送数字的 ASCII 表示形式,而不是字节本身。 BufferedReader(和大多数 Reader)将尝试将传入的字节解码为文本,而不是直接读取字节。

关于java - 将 Python 网络代码转换为 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32591138/

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