2010-09-26 68 views
0

我只開始學習Java。我的任務是創建一個文件服務器,該文件服務器使用線程處理從多個客戶端接受文件獲取,文件放置和文件刪除等特定命令。我正在使用自定義的類DataObject來序列化和發送命令以及可能伴隨的任何數據。客戶端應該是交互式的,因爲它涉及手動用戶輸入各種命令。這意味着由於EOFException,ObjectInputStream readObject()函數在while(true)循環中不起作用。我該怎麼做,以便服務器線程在readObject()處暫停,直到它看到下一個對象,然後恢復while(true)循環?在服務器Java:從ObjectInputStream讀取

代碼(爲每個線程運行單獨):

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

我應該說,這是對一個人誰「纔開始學習Java的一個相當艱鉅的任務。 – Roman 2010-09-26 16:42:07

+0

這是明天在分佈式操作系統課程中完成的任務。 Java是預期的語言。 – Anand 2010-09-26 16:51:08

+0

請不要因爲我沒有打擾把異常處理程序的catch部分放在這裏,但他們在代碼中。 – Anand 2010-09-26 17:06:20

回答

3

EOFException類是從的readObject拋出。在你的情況下,當客戶端關閉它的連接。因此,如果客戶端將對象發送到服務器並立即退出,則服務器將在當前關閉的連接上讀取一個對象,並在下次嘗試讀取對象時獲取EOFExcpetion。

也許增加一個QUIT命令,他們都同意終止連接?

+0

除非有特定的再見消息,否則我的客戶端不應該退出。當用戶輸入類似文件獲取的命令並且點擊回車鍵時,客戶端不斷髮送請求。我希望連接能夠持續整個時間。 – Anand 2010-09-26 16:52:33

+0

也許你可以發佈一些代碼? – 2010-09-26 16:53:54

+0

雖然沒有看到什麼讓客戶端堅持?如果它跳過尚未編碼的部分,它只會退出並終止連接。 – 2010-09-26 17:10:44

0

解決方案掃描儀添加到輸入一些數據..on寫入對象側...這將保持線程活着,可它會等待輸入.....

Server代碼

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

} 
相關問題