Java:从 ObjectInputStream 读取
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/3798774/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Java: Reading from ObjectInputStream
提问by Anand
I have only started learning Java. My task is to create a file server which accepts certain commands like File Get, File Put and File Delete from multiple clients using Threading. I am using a custom class DataObject to serialize and send commands and any data that may accompany with it. The client is to be made interactive in the sense that it involves manual user input of the various commands. This means that ObjectInputStream readObject() function will not work in a while(true) loop because of an EOFException. What can I do so that the server thread pauses at readObject() until it sees the next object and then resumes the while(true) loop?
我才开始学习Java。我的任务是创建一个文件服务器,它使用线程从多个客户端接受某些命令,如文件获取、文件放置和文件删除。我正在使用自定义类 DataObject 来序列化和发送命令以及可能伴随的任何数据。在涉及各种命令的手动用户输入的意义上,客户端将是交互的。这意味着 ObjectInputStream readObject() 函数将由于 EOFException 而无法在 while(true) 循环中工作。我该怎么做才能让服务器线程在 readObject() 处暂停,直到它看到下一个对象,然后恢复 while(true) 循环?
Code at server (runs for each thread separately):
服务器上的代码(分别为每个线程运行):
public void run() {
ObjectInputStream is = null;
ObjectOutputStream os = null;
try{
is = new ObjectInputStream(clientSocket.getInputStream());
os = new ObjectOutputStream(clientSocket.getOutputStream());
while (true) {
input = (DataObject) is.readObject();
//System.out.println("Input has been read");
output = CommandProcessor.process(input);
if(output.data == null) {
os.writeObject(output);
if(output.message.compareToIgnoreCase("Rsp Bye")==0){
clientSocket.close();
}
}
}
}
Code at client:
客户端代码:
public Talker() {
DataObject input = new DataObject(0), output = new DataObject(0);
try {
log = new PrintStream("/home/meher/log.txt");
InetAddress serverAddress = InetAddress.getByName("127.0.0.1");
Socket serverSocket = new Socket(serverAddress, port);
os = new ObjectOutputStream(serverSocket.getOutputStream());
is = new ObjectInputStream(serverSocket.getInputStream());
CommandExecuter.Hello(output);
write(output);
read(input);
while(not-end-of-user-input){ //Yet to code this part
//Execute commands
}
}
回答by Alexander Sagen
EOFException is thrown from readObject when the stream ends. In your case, when the client closes its connection. So if the client sends an object to the server and immediately quits, the server will read one object and get EOFExcpetion the next time it tries to read an object, on the now closed connection.
当流结束时,从 readObject 抛出 EOFException。在您的情况下,当客户端关闭其连接时。因此,如果客户端向服务器发送一个对象并立即退出,则服务器将读取一个对象并在下一次尝试读取对象时在现在关闭的连接上获得 EOFExcpetion。
Perhaps add a QUIT-command, in which they both agree to terminate the connection?
也许添加一个 QUIT 命令,他们都同意终止连接?
回答by jayant
solution add a scanner to input some data ..on the writing object side ...this will keep the thread alive and available it will wait for the input .....
解决方案添加一个扫描器来输入一些数据......在写入对象方面......这将使线程保持活动状态并可用它将等待输入......
Server code
服务器代码
package com.cdac.Network;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.Scanner;
import com.cdac.collection.Customer;
public class Server {
public static void main(String[] args) throws IOException,SocketException{
ServerSocket ss=new ServerSocket(1888);
Customer customer=new Customer(101);
Socket s=ss.accept();
System.out.println("connection establishd");
Scanner scanner=new Scanner(System.in);
ObjectOutputStream oos=new ObjectOutputStream(s.getOutputStream());
{
oos.writeObject(customer);
scanner.next();
}
}
}
client code
客户代码
package com.cdac.Network;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;
import com.cdac.collection.Customer;
public class Client {
public static void main(String[] args) throws UnknownHostException,
IOException, SocketException, ClassNotFoundException {
Customer customer = new Customer(101, "amit", 500);
// String str1,str2;
Socket s = new Socket("localhost", 1888);
ObjectInputStream ois = new ObjectInputStream(s.getInputStream());
{
Object obj = ois.readObject();
Customer c = (Customer) obj;
System.out.println(c);
}
}
}