gpt4 book ai didi

网络游戏的Java多线程socket编程

转载 作者:行者123 更新时间:2023-12-02 00:11:26 24 4
gpt4 key购买 nike

我是java多线程的新手。实际上我想通过使用Socket编程在局域网上的java上制作两人游戏。我只是希望当两个玩家连接到服务器后游戏就会开始。我的GameServer基本上使用线程。当客户端连接到服务器时谁创建线程。我的逻辑是,当一个客户端与服务器建立连接时,该线程将等待,直到第二个线程建立连接。当第二个线程成功建立连接时。然后两个线程都将激活并开始工作。这是我的 GameServer 逻辑的连接部分。

for(int i = 0; i <= 1; i++) {
connectionSocket = welcomeSocket.accept();
System.out.println("Connection has been accepted");
no++;
}

但是这段代码在逻辑上是行不通的。有什么想法或建议吗?

最佳答案

您的服务器每次运行仅支持一场比赛 - 您启动服务器,玩家连接,玩游戏,并且为了开始另一场游戏,您必须终止服务器并重新启动 - 因为 for 循环的编写方式。

while(true) {
playerOneSocket = welcomeSocket.accept(); // 1
playerTwoSocket = welcomeSocket.accept(); // 2
startNewMatch(playerOneSocket,playerTwoSocket);
}

public void startNewMatch(final Socket pOne, final Socket pTwo) {
new Thread(new Runnable() {
@Overrride
public void run() {
// pOne, pTwo variables visible here
}
}).start();
}

(任何)服务器必须始终能够自由地接受新请求,这就是为什么您在处理单个匹配逻辑的新线程中传递两个套接字的原因。 startNewMatch 函数的参数已被最终确定,可以在 run 方法内部看到,但您可能希望创建一个扩展 Thread 的新类并将它们传递到构造函数中。希望有帮助。

编辑:

while 循环在主线程中运行,例如在内部:

public static void main(String[] args) 

函数,并且每场比赛你都会启动一个个新线程。你不希望每个玩家都在自己的线程中,因为 这会浪费资源 (请参阅编辑^3)并且编写这样的代码会很多代码。看看下面的教程 1 , 2 , 3

编辑^2:

“但我的困惑是,服务器如何知道现在玩家一正在通信以及玩家二何时正在通信......Bcz 服务器对于两个客户端都有相同的套接字。”

不,服务器总是在给定的端口上监听,并且每个请求都会通过accept方法给出一个新的连接(端口)。

java API 文档是您最好的 friend - 专门针对 ServerSocket accept它说:

Listens for a connection to be made to this socket and accepts it. The method blocks until a connection is made

所以,当

playerOneSocket = welcomeSocket.accept();

执行后,在playerOneSocket变量中你已经建立了与玩家一(在服务器和玩家都知道的某个其他端口上),并且服务器可以接受同一端口上的另一个连接 - 第二个玩家也是如此。例如。 1345是你的游戏端口:

P1: connect @ server:1345
accept method start - line 1
SERVER: lets meet at port 9999
P1: connect @ server:9999
SERVER: ok connected
accept method end - line 1
P2: connect @ server:1345
accept method start - line 2
SERVER: lets meet at port 10000
P2: connect @ server:10000
SERVER: ok connected
accept method end - line 2

编辑^3:

我建议你这样做:首先,让它在每场比赛中使用一个线程,然后转移到每个玩家一个线程(如 Tudor 所示) - 游戏将在更大的网络延迟(例如通过互联网)上做出更快的响应)。为了为每个玩家模型执行一个线程,您需要了解良好的线程和线程通信 - 请参阅 this tutorial

关于网络游戏的Java多线程socket编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12757457/

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