代码之家  ›  专栏  ›  技术社区  ›  Anand

Java:从ObjectInputStream读取

  •  0
  • Anand  · 技术社区  · 15 年前

    我才刚开始学Java。我的任务是创建一个文件服务器,该服务器使用线程从多个客户机接收某些命令,如file Get、file Put和file Delete。我使用一个自定义类DataObject来序列化和发送命令以及任何可能伴随它的数据。客户机是交互式的,因为它涉及到各种命令的手动用户输入。这意味着ObjectInputStream readObject()函数将无法在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 回复  |  直到 15 年前
        1
  •  3
  •   Alexander Sagen    15 年前

    或者添加一个QUIT命令,在该命令中,它们都同意终止连接?

        2
  •  -1
  •   jayant    12 年前

    服务器代码

      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);
        }
    }
    
    }
    
    推荐文章