Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.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多客户端服务器程序_Java_Multithreading_Sockets - Fatal编程技术网

Java多客户端服务器程序

Java多客户端服务器程序,java,multithreading,sockets,Java,Multithreading,Sockets,所以我已经编程了一段时间,我第一次尝试制作一个多人游戏。我现在面临的主要问题是同时更新服务器端多个客户端的数据 以下是我的代码背后的概念: 客户端与服务器建立连接-> 客户端根据客户端上按下的键向服务器发送消息-> 根据客户端当前按下的键,服务器每秒更新自身60次 我的主要问题是步骤3,我的问题是主线程中的语法错误: public static void updatethings() { for (ServerSocket i : ssList) { i.calculat

所以我已经编程了一段时间,我第一次尝试制作一个多人游戏。我现在面临的主要问题是同时更新服务器端多个客户端的数据

以下是我的代码背后的概念:

  • 客户端与服务器建立连接->
  • 客户端根据客户端上按下的键向服务器发送消息->
  • 根据客户端当前按下的键,服务器每秒更新自身60次
  • 我的主要问题是步骤3,我的问题是主线程中的语法错误:

    public static void updatethings() {
        for (ServerSocket i : ssList) {
            i.calculatePos();
        }
    }
    
    错误消息是:ServerSocket类型的calculatePos()方法未定义

    我试图做的是制作一个ServerSockets数组,并每秒更新它们60次。每个套接字都是它自己的服务器类线程

    Iv在下面列出了整个服务器程序:

    这是服务器的主类。此类侦听客户端连接,并在每次客户端连接时生成一个新线程

    public class ServerMain {
    
        static ArrayList<ServerSocket> ssList = new ArrayList<ServerSocket>();
        static int oh = 0;
    
        public static void main(String[] args) throws IOException {
    
            int portNumber = 9000;
            boolean listening = true;
            UpdaterThread update = new UpdaterThread();
            update.start();
    
            try (ServerSocket serverSocket = new ServerSocket(portNumber)) {
    
                while (listening) {
    
                    new ServerThread(serverSocket.accept()).start();
                    ssList.add(serverSocket);
    
                }
            } catch (IOException e) {
                System.err.println("Could not listen on port " + portNumber);
                System.exit(-1);
            }
        }
    
        //does not work
        public static void updatethings() {
            for (ServerSocket i : ssList) {
                ServerSocket.calculatePos();
            }
        }
    }
    
    更新程序线程类:

    public class ServerThread
            extends Thread {
        private Socket socket = null;
        byte input;
        private float playery;
        private float playerx;
    
        public ServerThread(Socket socket) {
            this.socket = socket;
        }
    
        public void calculatepos() {
            if (input == 0) {
            }
            if (input == 1) {
                playery = playery + 1;
            }
            if (input == 2) {
                playerx = playerx - 1;
            }
            if (input == 3) {
                playery = playery - 1;
            }
            if (input == 4) {
                playerx = playerx + 1;
            }
            if (input == 5) {
                playerx -= 0.7;
                playery += 0.7;
            }
            if (input == 6) {
                playerx -= 0.7;
                playery -= 0.7;
            }
            if (input == 7) {
                playerx += 0.7;
                playery -= 0.7;
            }
            if (input == 8) {
                playerx += 0.7;
                playery += 0.7;
            }
            System.out.println(playerx);
            System.out.println(playery);
        }
    
        public void run() {
            try (
                    // PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
                    BufferedReader in = new BufferedReader(
                            new InputStreamReader(
                                    socket.getInputStream()));
            ) {
                String inputLine;
    
                while ((inputLine = in.readLine()) != null) {
                    input = Byte.parseByte(inputLine);
                }
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    class UpdaterThread
            extends Thread {
        float time = 0;
        float lasttime = 0;
    
        public void run() {
            while (true) {
                time = Time.getTime();
                if (time > 1000 / 60 + lasttime) {
                    lasttime = time;
                    ServerMain.updatethings();
                }
                try {
                    Thread.sleep(2);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
    

    您的错误来自服务器。您反复存储同一个服务器套接字。并且不存储
    ServerThread
    对象

    ServerSocket接受()

    侦听与此套接字的连接并接受它。该方法会一直阻塞,直到建立连接为止。正在安装一个新的插座s 创建,如果有安全管理器,则安全管理器的 使用s.getInetAddress().getHostAddress()调用checkAccept方法 和s.getPort()作为其参数,以确保允许该操作。 这可能会导致SecurityException

    返回:新套接字

    因此,处理客户机时应该做的是保存这个ServerThread对象。如果你也想要相关的插座

    public class ServerMain  {
    
    static ArrayList <Socket> sSocketList = new ArrayList<Socket>();
     static ArrayList <ServerThread> sObjectList = new ArrayList<ServerThread>();
    static int oh = 0;
    public static void main(String[] args) throws IOException  {
    
        int portNumber =9000;
        boolean listening = true;
        UpdaterThread update =new UpdaterThread();
        update.start();
    
        try (ServerSocket serverSocket = new ServerSocket(portNumber)) { 
    
            while (listening) {
    
                Socket s=  serverSocket.accept();
                ServerThread st= new ServerThread(s);
                sSocketList.add(s);
                sObjectList.add(st);
                st.start();
    
            }
        } catch (IOException e) {
            System.err.println("Could not listen on port " + portNumber);
            System.exit(-1);
        }
    }
    //This might work now
    public static void updatethings() {
        for (ServerThread  i : sObjectList){
         i.calculatePos();
        }
    }
    } 
    
    public类ServerMain{
    静态ArrayList sSocketList=新ArrayList();
    静态ArrayList sObjectList=新建ArrayList();
    静态int-oh=0;
    公共静态void main(字符串[]args)引发IOException{
    int端口号=9000;
    布尔监听=真;
    UpdaterThread update=新的UpdaterThread();
    update.start();
    try(ServerSocket-ServerSocket=newserversocket(端口号)){
    边听{
    sockets=serverSocket.accept();
    ServerThread st=新的ServerThread;
    sSocketList.add(s);
    sObjectList.add(st);
    st.start();
    }
    }捕获(IOE异常){
    System.err.println(“无法侦听端口”+端口号);
    系统退出(-1);
    }
    }
    //这可能会奏效
    公共静态void updatethings(){
    对于(ServerThread i:sObjectList){
    i、 calculatePos();
    }
    }
    } 
    
    ServerSocket是你自己写的吗?如果是的话,写下这个方法。如果没有,请进入API以了解如何计算位置。您甚至不太可能有多个
    ServerSocket
    对象,因此没有必要列出它们,也没有必要对其进行迭代。dood,你的代码在sockets=newserversocket.accept()行有语法错误;我真的不明白为什么,在大多数情况下,你的代码很有意义。