gpt4 book ai didi

java多线程服务器客户端通信

转载 作者:行者123 更新时间:2023-12-01 04:12:46 32 4
gpt4 key购买 nike

我一直在编写客户端-服务器应用程序。我创建了多线程服务器。我想知道如何在服务器和客户端之间进行正确的通信。有两个客户端(2 个游戏玩家)具有唯一的 GUID 号(线程命名相同)。玩家线程一起工作。

服务器已在上一步中收到玩家 GUID 号。服务器线程一直在工作。

我有一个步骤问题 - 如何提供正确的玩家顺序。我尝试了简单的例子:

服务器 - 正在发送 GUID(字符串):- 首先 - 玩家1,- 其次 - 玩家2。片段:

public class ServerToPlayer implements Runnable //server creates this thread for each player
{
private ObjectOutputStream output;

@Override
public void run()
{
...
while(true)
{
output.writeObject(String.valueOf(localKey1)); //localKey1 - GUID number of Player1
output.writeObject(String.valueOf(localKey2)); //localKey2 - GUID number of Player2
break;
}
}
}

线程玩家类别:

public class Player implements Runnable
{
private ObjectOutputStream output;
private ObjectInputStream input;
private static boolean startPlayer = true;

@Override
public void run()
{
Thread.currentThread().setName(String.valueOf(GUIDPlayer)); // GUIDPlayer
// -
// describes
// player in
// server

// ...
while (true)
{
String guidInput = (String) input.readObject(); // guid from server
if (Thread.currentThread().getName().equals(guidInput))
{
synchronized (this)
{
startPlayer = true;
doMovement(); // proper player is doing sth
startPlayer = false;
notify();
}
} else if (!Thread.currentThread().getName().endsWith(guidInput))
{
synchronized (this)
{
while (true)
{
wait();
if (!startPlayer)
{
break;
}
}
}
}
}
}
}

The question is how to provide thread communication to receive in this example:
1. first iteration: class Player receives localKey1 from server (GUID of player1):
- player1 should be executing, and player2 should wait
2. second iteration: change executing player - class Player receives localKey2 from server (GUID of player2):
- player2 should be executing, and player1 should wait.

使用此代码 - 玩家1正在执行,玩家2正在等待并且未被唤醒;所以下一步也是错误的。如何提高同步性?

我也尝试过这样做:

if(Thread.currentThread().getName().equals(guidInput))
{
startPlayer = true;
doMovement();
startPlayer = false;
}
else if(!Thread.currentThread().getName().endsWith(guidInput))
{
while(true)
{
Thread.sleep(5000);
if(!startPlayer)
break;
}
}

但是这样 boolean startPlayer 并没有改变

最佳答案

几点包括:

while(true) {
output.writeObject(String.valueOf(localKey1)); //localKey1 - GUID number of Player1
output.writeObject(String.valueOf(localKey2)); //localKey2 - GUID number of Player2
break;
}

break 使得 while 循环毫无意义,没有 break 循环将永远不会结束,并且会非常快地发送大量字符串。

startPlayer 变量相关的问题,我建议您阅读有关 volatile 关键字的内容。

如果您希望玩家按顺序行动,那么您必须在没有其他玩家行动时将控制权从服务器传递给玩家,然后在玩家完成后从玩家返回到服务器。

关于java多线程服务器客户端通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19753627/

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