Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
网络游戏的Java多线程socket编程_Java_Multithreading_Sockets_Serversocket - Fatal编程技术网

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

网络游戏的Java多线程socket编程,java,multithreading,sockets,serversocket,Java,Multithreading,Sockets,Serversocket,我是java多线程的新手。实际上,我想通过使用套接字编程在局域网上的java上制作两人游戏。我只想当两个玩家都连接到服务器后,游戏就开始了。我的游戏服务器基本上使用线程。当客户端连接到服务器时,谁生成线程。我的逻辑是,当一个客户端与服务器建立连接后,该线程将等待第二个线程建立连接。当第二个线程成功建立连接时。然后两个线程都将处于活动状态并开始工作。这是我的GameServer逻辑的连接部分 for(int i = 0; i <= 1; i++) { connectionSocket

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

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

for(int i=0;i你的服务器每次运行只支持一个匹配-你启动服务器,玩家连接,玩游戏,为了另一个游戏开始,你必须杀死服务器并重新启动-因为循环的方式是编写的

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方法中看到,但您可能希望创建一个新的类扩展线程并在构造函数中传递它们。希望至少有帮助

编辑:

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

public static void main(String[] args) 
函数,并且每次比赛你都会启动一个新线程。你不希望每个玩家都有自己的线程,因为那样会浪费资源(请参见编辑^3),而且编写这样的代码会非常繁重。请看下面的教程

编辑^2:

“但我感到困惑的是,服务器如何知道现在playerone正在通信,而当Player2正在通信时……Bcz服务器对两个客户端都有相同的套接字。”

不,服务器总是在给定的端口侦听,并且每个请求都由accept方法提供一个新的连接(端口)

java API doc是您最好的朋友,特别是它说:

侦听要与此套接字建立的连接并接受它。该方法将阻塞,直到建立连接为止

那么,什么时候

playerOneSocket = welcomeSocket.accept();
执行时,在PlayerOnSocket变量中,您已经建立了与 玩家1(在服务器和玩家都知道的其他端口上),服务器可以在同一端口上接受另一个连接-第二个玩家也是如此。例如,1345是您的游戏端口:

P1:connect@server:1345
接受方法开始-第1行
服务器:让我们在9999端口见面
P1:connect@server:9999
服务器:正常连接
接受方法结束-第1行
P2:connect@server:1345
接受方法开始-第2行
服务器:让我们在端口10000处会面
P2:connect@server:10000
服务器:正常连接
接受方法结束-第2行

编辑^3:


我建议你这样做:首先,让它在每场比赛中使用一个线程,然后移动到每名球员一个线程(如都铎所示)-游戏将在更大的网络延迟(例如通过互联网)下更具响应性.为了实现每个玩家一个线程的模式,您需要了解良好的线程和线程通信-请参见您的服务器每次运行只支持一个匹配-您启动服务器,玩家连接,玩游戏,为了启动另一个游戏,您必须关闭服务器并重新启动-因为循环的编写方式

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方法中看到,但您可能希望创建一个新的类扩展线程并在构造函数中传递它们。希望至少有帮助

编辑:

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

public static void main(String[] args) 
函数,并且每次比赛你都会启动一个新线程。你不希望每个玩家都有自己的线程,因为那样会浪费资源(请参见编辑^3),而且编写这样的代码会非常繁重。请看下面的教程

编辑^2:

“但我感到困惑的是,服务器如何知道现在playerone正在通信,而当Player2正在通信时……Bcz服务器对两个客户端都有相同的套接字。”

不,服务器总是在给定的端口侦听,并且每个请求都由accept方法提供一个新的连接(端口)

java API doc是您最好的朋友,特别是它说:

侦听要与此套接字建立的连接并接受它。该方法将阻塞,直到建立连接为止

那么,什么时候

playerOneSocket = welcomeSocket.accept();
执行时,在PlayerOnSocket变量中,您已经建立了与 玩家1(在服务器和玩家都知道的其他端口上),服务器可以在同一端口上接受另一个连接-第二个玩家也是如此。例如,1345是您的游戏端口:

P1:connect@server:1345
接受方法开始-第1行
服务器:让我们在9999端口见面
P1:connect@server:9999
服务器:正常连接
接受方法结束-第1行
P2:connect@server:1345
接受方法开始-第2行
服务器:让我们在端口10000处会面
P2:connect@server:10000
服务器:正常连接
接受方法结束-第2行

编辑^3:


我建议你这样做:首先,让它在每场比赛中使用一个线程,然后移动到每名球员一个线程(如都铎所示)-游戏将在更大的网络延迟(例如通过互联网)下更具响应性.为了实现每个播放器一个线程的模式,您需要了解良好的线程和线程通信-请参见

我想您的意思是这样的

class Player implements Runnable {

     private Socket socket;

     public Player(Socket socket) {
         this.socket = socket;
     }

     public void run() {
     }
}

List<Socket> players = new ArrayList<Socket>();
// accept two connections
for(int i = 0; i <= 1; i++)
{
     Socket playerSocket = welcomeSocket.accept();
     players.add(playerSocket);
}

// start one thread per connection
for(Socket socket: players) {
     new Thread(new Player(socket)).start();         
}
类播放器实现可运行{
专用插座;
公共播放器(插座){
this.socket=socket;
}
公开募捐{
}
}
List players=new ArrayList();
//接受两个康涅