Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.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_Objectoutputstream - Fatal编程技术网

Java 无法实例化ObjectInputStream以从用户读取输入

Java 无法实例化ObjectInputStream以从用户读取输入,java,sockets,objectinputstream,objectoutputstream,Java,Sockets,Objectinputstream,Objectoutputstream,我不能添加ObjectInputStream来读取用户的输入,它总是在该点阻塞。如果我删除服务器中的ObjectInputStream,该服务器应该从用户处读取输入,然后发送硬编码字符串,则该代码可以正常工作。幕后发生了什么?我知道,当创建ObjectOutputStream时,它会发送一个标头,当创建ObjectInputStream时,它会读取该标头。在尝试实例化oOISUser之前,是否需要刷新系统中的某些内容 这是客户端的代码: import java.io.IOException; i

我不能添加ObjectInputStream来读取用户的输入,它总是在该点阻塞。如果我删除服务器中的ObjectInputStream,该服务器应该从用户处读取输入,然后发送硬编码字符串,则该代码可以正常工作。幕后发生了什么?我知道,当创建ObjectOutputStream时,它会发送一个标头,当创建ObjectInputStream时,它会读取该标头。在尝试实例化oOISUser之前,是否需要刷新系统中的某些内容

这是客户端的代码:

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;

public class Client {
    public Client() {
        Socket oS = null;
        ObjectOutputStream oOOS = null;
        ObjectInputStream oOIS = null;

        try {
            oS = new Socket("127.0.0.1", 1025);
            oOOS = new ObjectOutputStream(oS.getOutputStream());
            oOIS = new ObjectInputStream(oS.getInputStream());

            System.out.println("client receives: " + (String) oOIS.readObject());
            String sToSend = "hello from client";
            System.out.println("client says: " + sToSend);
            oOOS.writeObject(sToSend);
            oOOS.flush();

        } catch (IOException e) {
            System.out.println(e.getMessage());
        } catch (ClassNotFoundException e) {
            System.out.println(e.getMessage());
        } finally {
            try {
                if (oS != null) oS.close();
                if (oOOS != null) oOOS.close();
                if (oOIS != null) oOIS.close();
            } catch (IOException e) {
                System.out.println(e.getMessage());
            }
        }
    }
    public static void main(String[] args) {
        Client c = new Client();
    }

}
你在问题中自己说过:

创建ObjectInputStream时,它将读取该标头

因此,您实际上是在等待用户在控制台中输入ObjectInputStream头。除非文件通过管道传输到System.in,否则这种情况发生的可能性非常小。从System.in读取序列化的Java对象没有什么意义。用户不可能在控制台中键入有效的序列化Java对象。不过,他/她可以输入文本。因此,请使用阅读器或扫描仪

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;

public class Client {
    public Client() {
        Socket oS = null;
        ObjectOutputStream oOOS = null;
        ObjectInputStream oOIS = null;

        try {
            oS = new Socket("127.0.0.1", 1025);
            oOOS = new ObjectOutputStream(oS.getOutputStream());
            oOIS = new ObjectInputStream(oS.getInputStream());

            System.out.println("client receives: " + (String) oOIS.readObject());
            String sToSend = "hello from client";
            System.out.println("client says: " + sToSend);
            oOOS.writeObject(sToSend);
            oOOS.flush();

        } catch (IOException e) {
            System.out.println(e.getMessage());
        } catch (ClassNotFoundException e) {
            System.out.println(e.getMessage());
        } finally {
            try {
                if (oS != null) oS.close();
                if (oOOS != null) oOOS.close();
                if (oOIS != null) oOIS.close();
            } catch (IOException e) {
                System.out.println(e.getMessage());
            }
        }
    }
    public static void main(String[] args) {
        Client c = new Client();
    }

}
new ObjectInputStream(System.in)