2

クライアント/サーバー アプリケーションを作成しましたが、現時点では 1 人のユーザーしか使用できません。複数のユーザーに対して機能させる方法を教えてください。次の機能があります。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ソケットの出力ストリームを「サーバーへ」、ソケットの入力ストリームを「サーバーから」と解釈するため、クライアントになるつもりのようです。しかし、 with を作成するMultiServerThreadと、 1 つのクライアントへの接続のサーバー側serverSocket.accept()を表すソケットが与えられます。したがって、 によって返される出力ストリームは、サーバーからクライアントへのストリームを表します。実際に表現する必要があるのは、サーバーに接続しているクライアントの 1 つのインスタンスではなく、クライアントと通信しているサーバーの 1 つのインスタンスです。socket.getOutputStream()MultiServerThread

クライアントがサーバーに接続するには、別の Java ファイル (Client.java など) が必要です。このファイルには、別のメイン メソッドを持つ別のクラスが含まれています。このクラスは、コンストラクターを使用してサーバーへの接続を開き、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 に答える