Java: чтение из ObjectInputStream - PullRequest
       11

Java: чтение из ObjectInputStream

0 голосов
/ 26 сентября 2010

Я только начал изучать Java. Моя задача - создать файловый сервер, который будет принимать определенные команды, такие как File Get, File Put и File Delete от нескольких клиентов, используя Threading. Я использую пользовательский класс DataObject для сериализации и отправки команд и любых данных, которые могут сопровождать его. Клиент должен быть интерактивным в том смысле, что он предполагает ручной ввод различных команд пользователем. Это означает, что функция readObject () ObjectInputStream не будет работать в цикле while (true) из-за исключения EOFException. Что я могу сделать, чтобы поток сервера сделал паузу в 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
                    }
            }

Ответы [ 2 ]

3 голосов
/ 26 сентября 2010

EOFException выбрасывается из readObject, когда поток заканчивается.В вашем случае, когда клиент закрывает соединение.Поэтому, если клиент отправляет объект на сервер и сразу же завершает работу, сервер прочитает один объект и получит EOFExcpetion при следующей попытке прочитать объект на закрытом соединении.

Возможно, добавьте QUIT-команда, в которой они оба соглашаются разорвать соединение?

0 голосов
/ 19 июня 2013

решение добавить сканер для ввода некоторых данных .. на стороне пишущего объекта ... это будет поддерживать поток живым и доступным, он будет ждать ввода .....

Код сервера

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

}
...