[英]How to read from standard input and from a socket at the same time (java multithreaded socket programming)
This program prompts the user with three options: 该程序用三个选项提示用户:
Enter an option ('m', 'f', 'x'):
(M)essage (send)
(F)ile (request)
e(X)it
I want to only focus on the 'M' and 'm' options. 我只想关注“ M”和“ m”选项。 (Adding a "receive" option is not allowed for this unfortunately)
(不幸的是,不允许添加“接收”选项)
Screenshot of code running (error on server side): 正在运行的代码的屏幕截图(服务器端错误):
Screenshot of code running (successful client side): 运行代码的屏幕快照(成功的客户端):
The problem is that the BufferedReader readStandardInput
and the BufferedReader readFromClient
cannot execute at the same time (or at least read the same line of code at the same time). 问题是
BufferedReader readStandardInput
和BufferedReader readFromClient
无法同时执行(或至少同时读取同一行代码)。 I would like to know how to make them both execute simultaneously. 我想知道如何使它们同时执行。
Code: 码:
try{
OutputOptions();
String sendingMessage = "";
BufferedReader readFromClient = null;
String fromClient = "";
if(isConnected == true){
readFromClient = new BufferedReader(new InputStreamReader(socket.getInputStream()));
fromClient = readFromClient.readLine();
System.out.println("Recieved from client: " + fromClient);
//The 4 lines above this comment are recieving a message from the client
//the lines below this comment are reading from standard input
//I want to be able to do both the above and the below lines at the same time (reading two types of input, standard and socket),
//In other words, once the client sends a message after typing "m",
//it should appear on the server side, but if i decide to type "m" first
//on the server side, then the client will also have to be able to
//read that message, then afterwards be able to take in standard input
BufferedReader readStandardInput = new BufferedReader(new InputStreamReader(System.in));
option = readStandardInput.readLine();
if (option.length() == 1){
if(option.equals("m") || option.equals("M")){
System.out.println("Enter your message: ");
StandardOutput();
}
if(option.equals("m") || option.equals("M")){
System.out.println("Enter your message: ");
StandardOutput();
}
if(option.equals("f") || option.equals("F")){
FileTransferReceive();
}
if(option.equals("x") || option.equals("X")){
System.exit(0);
}
else{
StandardOutput();
}
}
else{
StandardOutput();
}
}
//}
}catch (IOException e){
e.printStackTrace();
}
finally{ }
Earlier version of code 早期版本的代码
My question is: How do I make the server in the first screenshot be able to enter an option "m" and read a line from the client socket at the same time? 我的问题是:如何使第一个屏幕截图中的服务器能够输入选项“ m”并同时从客户端套接字读取一行?
Java standard input stream and java.net.Socket
are blocking (so once you called read
on either of socket.getInputStream
or System.in
your app will wait till it receives something), meaning you can't implement simultaneous reads in the same thread from those. Java标准输入流和
java.net.Socket
被阻挡(所以一旦你叫read
在任的socket.getInputStream
或System.in
您的应用程序会等到它收到的东西),这意味着你不能同时实现在同一个线程读取从那些。
If you set up another thread(s) for serving client connection(s) you would be able to receive data from clients while waiting for the console input. 如果您设置另一个线程来服务客户端连接,则可以在等待控制台输入的同时从客户端接收数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.