【问题标题】:Java: Reading from ObjectInputStreamJava:从 ObjectInputStream 读取
【发布时间】:2010-09-26 16:39:29
【问题描述】:

我才刚刚开始学习 Java。我的任务是创建一个文件服务器,它使用线程从多个客户端接受某些命令,如文件获取、文件放置和文件删除。我正在使用自定义类 DataObject 来序列化和发送命令以及可能伴随它的任何数据。客户端是交互式的,因为它涉及到各种命令的手动用户输入。这意味着由于 EOFException,ObjectInputStream readObject() 函数将无法在 while(true) 循环中工作。我该怎么做才能让服务器线程在 readObject() 处暂停,直到它看到下一个对象,然后恢复 while(true) 循环?

服务器上的代码(为每个线程单独运行):

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();
                }
            }
        }
    }

客户端代码:

    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
                    }
            }

【问题讨论】:

  • 我应该说,对于一个“刚开始学习 Java”的人来说,这是一项相当艰巨的任务。
  • 这是分布式操作系统课程明天到期的作业。 Java 是预期的语言。
  • 请注意,我没有费心在此处放入异常处理程序的 catch 部分,但它们在代码中。

标签: java sockets objectinputstream


【解决方案1】:

当流结束时从 readObject 抛出 EOFException。在您的情况下,当客户端关闭其连接时。因此,如果客户端向服务器发送一个对象并立即退出,服务器将读取一个对象并在下一次尝试读取对象时获取 EOFExcpetion,此时连接已关闭。

也许添加一个 QUIT 命令,他们都同意终止连接?

【讨论】:

  • 除非有特定的再见消息,否则我的客户不应该退出。当用户键入 File Get 之类的命令并按回车键时,客户端会不断发送请求。我希望连接一直持续。
  • 看不出是什么让客户坚持了下来?如果它跳过尚未编码的部分,它将退出并终止连接。
  • 非常感谢。由于连接关闭,我没有意识到 EOF 即将到来。我认为它出现是因为在客户端再次写入之前它无法读取更多对象。客户端的 while (true) 循环有效。 :)
  • 使用 QUIT 命令没有任何用处。 TCP 已经通过 FIN 位发送了它。明确的 QUIT 只会增加复杂性,而不会增加任何价值。您只需要明确地捕获EOFException - 如果对等方由于某种原因无法发送 QUIT,无论如何您都会这样做。
【解决方案2】:

解决方案添加一个扫描器来输入一些数据..在写入对象端...这将使线程保持活动状态并且可用它会等待输入.....

服务器代码

  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(); 
    }

}

 }

客户端代码

    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);
    }
}

}

【讨论】:

  • 扫描仪在这里没有增加任何价值。 EOFException 仍将被抛出。正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-19
  • 2014-08-19
  • 2016-04-10
  • 1970-01-01
相关资源
最近更新 更多