我必须开发一个多线程服务器-客户端应用程序,该应用程序的工作方式类似于Google驱动器。因此,用户首先需要创建一个帐户,然后登录,并具有诸如将文件上传到服务器,预览文件,与其他用户共享他的文件等选项。我有两个问题: 1)首先,如何告诉服务器应该执行哪些操作以及获得什么输入。我想出了一个使用流(甚至可能在另一个端口上)的想法,该想法仅用于客户端告诉服务器该做什么,下一步是哪个输入,以及服务器将答案返回给客户端,但是没有人有更好的主意吗? ?我不知道是否可以对每个操作使用不同的端口,例如在一个端口上登录,在另一个端口上注册等等,我想那是最好的选择,但是我不知道这是否是正确的想法。
2)其次,我尝试了登录选项的想法,如果我随后立即运行服务器和客户端,则可以正常工作,但是如果我等一分钟后再运行客户端,则客户端的线程卡住了。我不知道出了什么问题,请帮忙!
public static void main(String[] args) {
try(ServerSocket serverSocket = new ServerSocket(5000);
BufferedReader br = new BufferedReader(new FileReader("Resources\\Users"))){
String line;
String username = "";
String password = "";
while((line = br.readLine()) != null) {
if(username.isEmpty()) {
username = line;
continue;
}
password = line;
System.out.println(username);
System.out.println(password);
users.put(username, password);
}
while(true) {
Socket socket = serverSocket.accept();
ServerThread thread = new ServerThread(socket);
thread.start();
}
}catch(IOException e) {
System.out.println(e.getMessage());
}
}
这是我的服务器课程,不要介意我使用txt文件存储信息,这是我考试的低级应用程序,并且我没有足够的时间来实现数据库。
public static void main(String[] args) {
login = new LogInPage();
try {
socket = new Socket("localhost", 5000);
input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
output = new PrintStream(socket.getOutputStream());
keyboardInput = new BufferedReader(new InputStreamReader(System.in));
actionInput = new BufferedReader(new InputStreamReader(socket.getInputStream()));
actionOutput = new PrintStream(socket.getOutputStream());
while(true) {
if(guiMessage.equals("login")) {
login(input, output, actionInput, actionOutput);
System.out.println(login.getClientMessage());
break;
}else {
login.setClientMessage("");
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
这是我的客户端类,我使用一个空字符串告诉服务器,而我的GUI不需要执行任何操作。 我只实现了我的登录选项解决方案。