Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:从ObjectInputStream读取_Java_Sockets_Objectinputstream - Fatal编程技术网

Java:从ObjectInputStream读取

Java:从ObjectInputStream读取,java,sockets,objectinputstream,Java,Sockets,Objectinputstream,我刚刚开始学习Java。我的任务是创建一个文件服务器,该服务器使用线程从多个客户端接受某些命令,如file Get、file Put和file Delete。我正在使用一个自定义类DataObject来序列化和发送命令以及可能伴随它的任何数据。客户机应具有交互性,因为它涉及各种命令的手动用户输入。这意味着由于EOFEException,ObjectInputStream readObject()函数将无法在while(true)循环中工作。如何使服务器线程在readObject()处暂停,直到看

我刚刚开始学习Java。我的任务是创建一个文件服务器,该服务器使用线程从多个客户端接受某些命令,如file Get、file Put和file Delete。我正在使用一个自定义类DataObject来序列化和发送命令以及可能伴随它的任何数据。客户机应具有交互性,因为它涉及各种命令的手动用户输入。这意味着由于EOFEException,ObjectInputStream readObject()函数将无法在while(true)循环中工作。如何使服务器线程在readObject()处暂停,直到看到下一个对象,然后恢复while(true)循环

服务器上的代码(分别为每个线程运行):

客户端代码:

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

流结束时,从readObject抛出EOFEException。在您的情况下,当客户端关闭其连接时。因此,如果客户机向服务器发送一个对象并立即退出,服务器将读取一个对象,并在下次尝试读取对象时,在现在已关闭的连接上获取EOFExPetion


也许添加一个QUIT命令,在该命令中他们都同意终止连接?

解决方案添加一个扫描器来输入一些数据..在写入对象端…这将使线程保持活动并可用,它将等待输入

服务器代码

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

}

我应该说,对于一个“刚刚开始学习Java”的人来说,这是一项相当艰巨的任务。这是一项将于明天在分布式操作系统课程中完成的作业。Java是预期的语言。请不要担心,我没有在这里输入异常处理程序的catch部分,但它们在代码中。除非有特定的Bye消息,否则我的客户端不应该退出。当用户键入诸如File Get之类的命令并按下enter键时,客户端会不断发送请求。我想让连接一直保持下去。但不明白是什么让客户机坚持住了吗?如果它跳过了尚未编码的部分,它将退出并终止连接。非常感谢。我没有意识到EOF的到来是因为一个封闭的连接。我认为它出现是因为在客户端再次写入之前,它无法读取更多对象。客户端上的while(true)循环已工作。:)使用QUIT命令不会添加任何有用的内容。TCP已经通过FIN位发送了该信息。明确退出只会增加复杂性,而不会增加任何价值。您只需显式捕获
EOFException
,以防对等方因某种原因无法发送退出。扫描仪在此处不添加任何值。仍将抛出
EOFEException
。正确地
    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);
    }
}

}