2010-09-26 51 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); 
    } 
} 

} 
相关问题