2

我做了我的客户端-服务器应用程序,但目前只有一个用户可以使用它。你能帮我如何让它为多个用户工作。我有以下功能: 每两分钟计数器开始减少。每个用户有 30 秒的时间连接到应用程序。每个连接的用户都应该看到相同的结果,他应该使用这些结果进行一些其他操作。我现在是通过这种方式做到的。不同情况下的代码并不那么重要。我需要一个建议如何使它作为代码的结构工作。提前致谢!

import java.net.*;
import java.io.*;

public class MultiServer {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = null;
        boolean listening = true;

        try {
            serverSocket = new ServerSocket(4444);
        } catch (IOException e) {
            System.err.println("Could not listen on port: 4444.");
            System.exit(-1);
        }

        while (listening)
        new MultiServerThread(serverSocket.accept()).start();

        serverSocket.close();
    }
}




import java.net.*;
import java.io.*;
import java.util.HashMap;

public class MultiServerThread extends Thread {
    private Socket socket = null;

    public MultiServerThread(Socket socket) {
        super("MultiServerThread");
    this.socket = socket;
    }

    public void run() {
        try {

            ObjectOutputStream toServer = new ObjectOutputStream(socket.getOutputStream());
            ObjectInputStream fromServer = new ObjectInputStream(socket.getInputStream());

            int userProcess = 0;
            Object data = 11111;
            boolean listening = true;


            CountDown c = new CountDown();
            int timeRemaining = 900;

            while (listening) {
                boolean send = true;
                Object ob;
                try {
                    ob = fromServer.readObject();
                    userProcess = Integer.parseInt(ob.toString());
                    HashMap<String,Integer> finalScores = new HashMap<String,Integer>();
                    if(userProcess == 0) {
                        timeRemaining = c.getRemainingTime();
                        int temp = 999;
                        while(timeRemaining-110>0) {
                            timeRemaining = c.getRemainingTime();
                            if(temp != timeRemaining) {
                                toServer.writeObject(timeRemaining-110);
                                toServer.flush();
                                temp = timeRemaining;
                            }
                        } 
                    } 
                    if(userProcess == 0 && timeRemaining-110 < 0) {
                        c = new CountDown();
                        send = false;
                    }

                    if(userProcess == 1) {   
                        BoardGeneraor board = new BoardGeneraor();
                        data = board.getBoard();
                    } 
                    if(userProcess == 2) {   
                        int score = (Integer)fromServer.readObject();
                        String username = (String)fromServer.readObject();
                        finalScores.put(username, score);
                        data = finalScores;
                        c = new CountDown();
                    }
                    if(send) {
                       toServer.writeObject(data);
                        toServer.flush();
                    } else {
                        toServer.writeObject("quit");
                        toServer.flush();
                    }
                } catch (ClassNotFoundException e) {
                    System.out.println(e);
                }
            }

            fromServer.close();
            toServer.close();
            socket.close(); 

        } catch(IOException e) {
             System.out.println(e);
        }
    }
}
4

1 回答 1

0

我认为您的问题是您混淆了服务器和客户端,并将客户端和服务器代码放在同一个 Java 文件中。看起来您打算MultiServerThread成为客户端,因为它将套接字的输出流解释为“到服务器”,而套接字的输入流解释为“来自服务器”。但是,当您创建一个MultiServerThreadwith 时serverSocket.accept(),您将为其提供一个套接字,该套接字代表服务器端与一个客户端的连接。因此,返回的输出流socket.getOutputStream()表示从服务器到客户端的流。实际上应该MultiServerThread表示的是服务器与客户端通信的一个实例,而不是连接到服务器的客户端实例。

为了让客户端连接到您的服务器,您需要一个单独的 Java 文件,比如 Client.java,其中包含一个带有单独 main 方法的单独类。此类应使用Socket(String host, int port)构造函数打开与服务器的连接,并将该套接字的输入流视为来自服务器的输入流。这是一个简单的例子:

public class Client {

    public static void main(String[] args) {

        Socket serverConnection = null;

        try {
            serverConnection = new Socket("localhost", 4444);
        } catch(IOException e) {
            System.err.println("Could not connect to server");
            System.exit(-1);
        }

        try {
            ObjecttInputStream fromServer = new ObjectInputStream(serverConnection.getInputStream());
            Object ob = fromServer.readObject();
        } catch(IOException e) {
            System.err.println("Error reading from server");
        }

    }

}

通过运行 MultiServer.class 文件启动服务器后,您可以通过运行 Client.class 文件启动客户端(在单独的窗口中,同时服务器仍在运行)。

于 2012-07-16T17:34:25.283 回答