gpt4 book ai didi

Java如何等待命令完成?

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

我有以下脚本:

    Connection con = new Connection("host",80);

ByteBuffer loginbb = ByteBuffer.allocate(300);
<snip>
loginbb.flip();

byte[]login = new byte[loginbb.remaining()];
loginbb.get(login);


ByteBuffer headerbb = ByteBuffer.allocate(7);
<snip>
headerbb.flip();

byte[]header = new byte[headerbb.remaining()];
headerbb.get(header);

con.run(login, header);


try {
Thread.sleep(1000);
} catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}


long pid = Long.parseLong(request.getParameter("player"));
PrintWriter out = response.getWriter();
ByteBuffer bb = ByteBuffer.allocate(100);
bb.putLong(pid);
bb.putLong(pid);
bb.put((byte) 0x00);
bb.flip();

byte[] payload = new byte[bb.remaining()];
bb.get(payload);


ByteBuffer headerbb2 = ByteBuffer.allocate(7);
<snip>
headerbb2.flip();

byte[]header2 = new byte[headerbb2.remaining()];
headerbb2.get(header2);

con.send(payload, header2);

try {
Thread.sleep(700);
} catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}

Gson gson = new GsonBuilder().setPrettyPrinting().create();
JsonParser jp = new JsonParser();
JsonElement je = jp.parse(Avatar.getJson().toString());
String json = gson.toJson(je);
out.flush();
out.println(json);
out.flush();

注意到以下内容了吗?

    try {
Thread.sleep(700);
} catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}

还有这个:

    try {
Thread.sleep(1000);
} catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}

所以这会让我的脚本暂停一段时间,但我不希望这样,因为脚本可能需要更长或更少的时间。那会浪费一些时间 D:

我想要发生的是它只是等待事情完成。

con.run 基本上执行初始任务,然后执行 con.send。

con.send 基本上运行这个:

private void sendToServer(byte[] message, int length, byte[]header) {

byte[]payload = outrc4.encrypt(message,false);
byte[] data = new byte[header.length+payload.length];

System.arraycopy(header,0,data,0,header.length);
System.arraycopy(payload,0,data,header.length,payload.length);


try {
out.write(data);
} catch (IOException e) {
System.out.println("Error!");
}
}

它只是将数据包发送到服务器。

从这里开始,在 con.run 上我收到了多个数据包。我可以捕获数据包的 ID,并在接收和解析数据包的循环中添加一个 if 语句来检查是否收到了 loginDone 数据包。

void receive() {
try {

while (in.available() > -1) {

int type = in.readUnsignedShort();
int size = in.readUnsignedByte();
size <<= 8;
size |= in.readUnsignedByte();
size <<= 8;
size |= in.readUnsignedByte();
int version = in.readUnsignedShort();

byte array[] = new byte[7];
array[0] = (byte)((type >>> 8) & 0xFF);
array[1] = (byte)(type & 0xFF);
array[2] = (byte)((size >>> 16) & 0xFF);
array[3] = (byte)((size >>> 8) & 0xFF);
array[4] = (byte)(size & 0xFF);
array[5] = (byte)((version >>> 8) & 0xFF);
array[6] = (byte)(version & 0xFF);

final byte[] reply = new byte[size];

in.readFully(reply,0,size);

byte[] data = new byte[array.length + reply.length];
System.arraycopy(array, 0, data, 0, array.length);
System.arraycopy(reply, 0, data, array.length, reply.length);
byte[] decryptedPayload = inrc4.encrypt(reply,false);

if(type == 20000){
updateKeys(decryptedPayload);
}

if(type == 24411){
//this one means that the 1st packet that uses con.run is done

System.out.println("Logged In!");
}

if(type == 24334){
//this one means that the 2nd packet that uses con.send is done

InputStream myis = new ByteArrayInputStream(decryptedPayload);
new Avatar(myis);
t.interrupt();
}

}


} catch (Exception e) {}

}

不要考虑这些注释://这意味着使用 con.send 的第二个数据包已完成//这意味着使用 con.run 的第一个数据包已完成

这是我所知道的。有人知道我应该从这里做什么吗?

最佳答案

如果您的服务器和客户端位于同一个 java 进程中,请使用 CountDownLatch这样做,或 thread.join() 。如果它们是不同的机器,请阅读编辑部分。

class Foo extends Thread {

CountDownLatch latch;

public Foo(CountDownLatch latch) {
this.latch = latch;
}
@Override
public synchronized void start() {

try {
sleep(1000);
latch.countDown(); // in every call latch decrease one, when it reach to zero, every thread that is waiting the latch will continue.
sleep(100);
} catch (InterruptedException e) {

}
}
}
class FooBar {

public static void main(String[] args) throws InterruptedException {

CountDownLatch latch = new CountDownLatch(1);

new Foo(latch).start();

latch.await(); // wait latch reach to zero. BE CAREFUL, IT'S NOT WAIT(),
// IT'S AWAIT()
System.out.println("done");
}
}

编辑为了简单起见,我将保留上面的代码。我认为这是非常不言自明的,可以帮助其他人。

好吧,如果你想等到receive()方法完成,你需要开发一种方法让服务器可以告诉客户端方法已完成,或者你可以开发一种方法您的客户端不断检查服务器中的某些状态,例如 isTaskCompleted()。我不知道你的情况让服务器向客户端发送数据包有多困难。我将基本上描述解决这种情况的两种方法,我将使用其他名称的类和变量,因此请尝试适应您的代码。

public class WaitServer extends Thread {

synchronized void serverCompleted() {
// when server completes
notify();

}

@Override
public synchronized void start() {

try {
wait(); // waits the server
} catch (InterruptedException e) {

}
}
}
class ClientSide {

void doSomething() {

// ... some stuff ....
sendToServer();

new WaitServer().join();

// continues execution
}
}

class ServerSide {
void received() {

// ... do some stuff .....

if (someStuff) {
sendSignalToClient();

}
// .. others stuff
}

void sendSignalToClient() {
// here of course you need to send in the way that you are sending today, this is "pseudocode"
client.serverCompleted()
}
}

另一种方法是让客户端检查服务器直到任务完成,只需创建一个线程来发送验证作业,如果没有完成则 hibernate 一段时间。当您想让一个线程等待另一个线程时,请使用join()。如果您希望一个线程在另一个线程中等待处理的某些部分,请使用 CountDownLatch

关于Java如何等待命令完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33045779/

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