java客户端服务器多线程,仅适用于一个连接

时间:2012-07-16 16:32:09

标签: java client-server

我做了我的客户端 - 服务器应用程序,但目前只有一个用户可以使用它。你能帮我解决一下如何使它适用于多个用户吗?我有以下功能:每两分钟计数器开始减少。每个用户都有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);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我认为您的问题是您混淆了服务器和客户端,并将客户端和服务器代码放在同一个Java文件中。看起来您希望MultiServerThread成为客户端,因为它将套接字的输出流解释为“到服务器”并且套接字的输入流将“从服务器”传出。但是当您使用MultiServerThread创建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文件(在单独的窗口中,当服务器仍在运行时)启动客户端。

相关问题