0

私はJavaを学び始めたばかりです。私の仕事は、スレッドを使用して複数のクライアントからFile Get、File Put、FileDeleteなどの特定のコマンドを受け入れるファイルサーバーを作成することです。カスタムクラスの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
                    }
            }
4

2 に答える 2

3

ストリームが終了すると、readObjectからEOFExceptionがスローされます。あなたの場合、クライアントが接続を閉じたとき。したがって、クライアントがオブジェクトをサーバーに送信してすぐに終了した場合、サーバーは1つのオブジェクトを読み取り、次にオブジェクトを読み取ろうとしたときに、閉じられた接続でEOFExcpetionを取得します。

おそらく、QUITコマンドを追加します。このコマンドでは、両方が接続を終了することに同意しますか?

于 2010-09-26T16:48:16.920 に答える
-1

解決策書き込みオブジェクト側でデータを入力するためのスキャナーを追加します...これによりスレッドが存続し、入力を待機します.....

サーバーコード

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

}
于 2013-06-19T03:40:45.250 に答える