我做了我的客户端 - 服务器应用程序,但目前只有一个用户可以使用它。你能帮我解决一下如何使它适用于多个用户吗?我有以下功能:每两分钟计数器开始减少。每个用户都有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);
}
}
}
答案 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文件(在单独的窗口中,当服务器仍在运行时)启动客户端。