Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
Multithreading UDP服务器和多个客户端(1v1游戏)_Multithreading_Networking - Fatal编程技术网

Multithreading UDP服务器和多个客户端(1v1游戏)

Multithreading UDP服务器和多个客户端(1v1游戏),multithreading,networking,Multithreading,Networking,我正在尝试创建一个UDP服务器,每个游戏和客户端的新实例有两个插槽 这一定是游戏机制的原因。我写道: public class Server { private static HashSet<Integer> ports = new HashSet<Integer>(); // these are player's IDs static ArrayList<InetAddress> addresses = new ArrayList<

我正在尝试创建一个UDP服务器,每个游戏和客户端的新实例有两个插槽

这一定是游戏机制的原因。我写道:

public class Server {

   private static HashSet<Integer> ports = new HashSet<Integer>(); // these     are player's IDs
   static ArrayList<InetAddress> addresses = new ArrayList<InetAddress>(); 
   public static boolean player1_active = false, player2_active = false;
   public static PlayerCredits p1, p2, temp;
   public static void main(String[] args) throws Exception {

   // The default port     
    int serverport = 8888;        


    DatagramSocket udpServerSocket = new DatagramSocket(serverport);        
        DatagramPacket sendpacket;
    System.out.println("Server started...\n");

    while(true)
    {

        byte[] receiveData = new byte[1024];          


        DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);


        udpServerSocket.receive(receivePacket);           


        String clientMessage = (new String(receivePacket.getData())).trim();


        System.out.println("Client Connected - Socket Address: " + receivePacket.getSocketAddress());
        System.out.println("Client message: \"" + clientMessage + "\"");          


        InetAddress clientIP = receivePacket.getAddress();           
                    addresses.add(clientIP);

        System.out.println("Client IP Address & Hostname: " + clientIP + ", " + clientIP.getHostName() + "\n");

        // Get the port number which the recieved connection came from
        int clientport = receivePacket.getPort();
        System.out.println("Adding "+clientport);
        ports.add(clientport);

        // Response message         
        String returnMessage = clientMessage.toUpperCase();          
        System.out.println(returnMessage);
        // Create an empty buffer/array of bytes to send back 
        byte[] sendData  = new byte[1024];




                    temp = new PlayerCredits(clientport, clientIP);

                    if(!player1_active){
                     p1 = new PlayerCredits(clientport, clientIP);
                     player1_active = true;
                    }

                    if(temp.port != p1.port && temp.ad != p1.ad)
                     if(!player2_active){
                        p2 = new PlayerCredits(clientport, clientIP);
                        player2_active = true;
                    }

                    DatagramPacket sendPacket;
                     if(p2 == null){
                         String awaiting = "WAITING FOR SECOND PLAYER";
                         sendData = awaiting.getBytes();
                          sendPacket= new DatagramPacket(sendData, sendData.length, p1.ad, p1.port); 
                            udpServerSocket.send(sendPacket);   
                     }
                         else{
                         String awaiting = "SECOND PLAYER INCOMING";
                         sendData = awaiting.getBytes();
                            if(p2!=null){
                            sendPacket = new DatagramPacket(sendData, sendData.length, p2.ad, p2.port); 
                            udpServerSocket.send(sendPacket);   
                            }
                            sendPacket = new DatagramPacket(sendData, sendData.length, p1.ad, p1.port); 
                            udpServerSocket.send(sendPacket);    
                     }

        }

}
public static class PlayerCredits{
    int port;
    InetAddress ad;
    public PlayerCredits(int p, InetAddress a){
        this.port = p;
        this.ad = a;
    }
}
现在我有两个人在联系——但正如你可能会说的那样——这是错误的。我需要以某种方式实现Multisocket或其他东西上的每个播放器,或者通过TCP将它们连接起来,然后用新的数据报监听新线程

正如我所知,最好的方法是在主线程上创建一个侦听器服务器TCP—接受连接并将它们传递给“玩家的构造函数”,然后在玩家的类中使整个过程变得有趣

如果有人可以帮助并告诉我,应该如何像我不需要代码那样分3步完成:

与TCP的连接 使用播放器创建新线程并在UDP上侦听 当两名玩家连接时开始游戏
另外,如何停止“第三个连接”并将其重定向到新的游戏实例?因为它是1v1。

不确定您到底需要什么。什么是“multisocket”?我建议你编辑你的代码,删除所有不相关的游戏机制。只需保留现有的套接字代码,并提供您希望执行的操作的伪代码。主要问题是,我不知道哪些操作应该由TCP处理,哪些操作应该由UDP处理。整个队伍?我的想法是我现在就写这篇文章:-在主类中,使用TCP将端口连接到hashmap和IPAddress-当我有两个玩家时-打开一个游戏,将他们的ip和端口传递给构造函数-在“游戏”类中,使用UDP使整个游戏机械化,我只是不知道在1v1游戏clientserverclient实时情况下应该如何做到这一点。只是需要一个点-从哪里开始。仍然不清楚。你的最终目标是什么?你想达到什么目标?为什么是UDP,为什么是TCP?到目前为止,我还不知道你需要什么以及为什么。我正在创建一个1v1游戏,它必须实时更新-这是一个战斗游戏。客户端1连接到服务器,他正在等待客户端2。当客户端2连接时,游戏打开,队列服务器等待新的一对。Stack说,整个游戏必须由数据报来处理,因为数据报速度更快,而且通过TCP进行“第一次连接”和“排队”。我试图实现什么:我不知道上面的说法是否正确——因为如果是的话——我将尝试在TCP上编写这个队列。如果没有-我会尝试另一种方法。好的,首先要做的事。UDP绝不比TCP“快”。它们只是为了不同的目的。UDP是一种消息协议——当对等点以封装消息的形式相互通信时,它工作得最好。TCP是一种面向流的协议——当对等点之间保持通信通道并相互发送数据时,它工作得最好。一个非常松散的类比是电话对话TCP与电子邮件UDP。通过电话交谈,你可以让两个人继续互相交谈。通过电子邮件,你可以让一个人向另一个人发送消息。你不能说哪个更快。