【问题标题】:Java multi client server programJava多客户端服务器程序
【发布时间】:2015-02-19 14:11:29
【问题描述】:

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

这是我的代码背后的概念:

  1. 客户端与服务器建立连接->
  2. 客户端根据客户端按下的键向服务器发送消息->
  3. 服务器根据客户端当前按下的键每秒更新 60 次

我的主要问题是第 3 步,我的问题是我的主线程中的语法错误:

public static void updatethings() {
    for (ServerSocket i : ssList) {
        i.calculatePos();
    }
}

错误信息是:方法calculatePos()未定义类型ServerSocket。

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

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

这是服务器的主要类。此类监听客户端连接并在每次客户端连接时创建一个新线程。

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();
            }
        }
    }
}

【问题讨论】:

  • ServerSocket 是你自己写的吗?如果是这样,请编写该方法。如果不进入 API 以了解您如何计算位置。
  • 您甚至不太可能拥有多个ServerSocket 对象,因此拥有它们的列表或对其进行迭代是没有意义的。某处出了点问题。

标签: java multithreading sockets


【解决方案1】:

您的错误来自服务器。您一遍又一遍地存储相同的服务器套接字。而且您不存储您的ServerThread 对象

ServerSocket accept() - http://download.java.net/jdk7/archive/b123/docs/api/java/net/ServerSocket.html#accept()

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

返回:新的 Socket

所以你应该做的处理客户端是保存这个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();
    }
}
} 

【讨论】:

  • 不错,在 Socket s= new ServerSocket.accept(); 行的代码中存在语法错误;不太明白为什么,在大多数情况下,你的代码很有意义。
猜你喜欢
  • 1970-01-01
  • 2015-01-09
  • 1970-01-01
  • 1970-01-01
  • 2015-09-17
  • 1970-01-01
  • 1970-01-01
  • 2016-04-09
  • 1970-01-01
相关资源
最近更新 更多