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
ObjectInputStream#readObject抛出java.io.EOFEException_Java_Sockets - Fatal编程技术网

ObjectInputStream#readObject抛出java.io.EOFEException

ObjectInputStream#readObject抛出java.io.EOFEException,java,sockets,Java,Sockets,当我试图从客户机向服务器发送数据时(虽然我没有使用http,但它可以被视为一种POST),我得到了一个java.io.EOFException 我的客户端源代码: Socket clientSocket = new Socket(serverIpAddr, IConstant.ServerPort); OutputStream out = clientSocket.getOutputStream(); out.write(dataByteArray); out.flush(); if(out!=

当我试图从客户机向服务器发送数据时(虽然我没有使用http,但它可以被视为一种POST),我得到了一个
java.io.EOFException

我的客户端源代码:

Socket clientSocket = new Socket(serverIpAddr, IConstant.ServerPort);
OutputStream out = clientSocket.getOutputStream();
out.write(dataByteArray);
out.flush();
if(out!=null)
    out.close();
if(clientSocket!=null)
    clientSocket.close();
我的服务器源代码:

try{    
      ServerSocket serverSocket = new ServerSocket(IConstant.ServerPort);
      while(true)
      {
           Socket connectionSocket = serverSocket.accept();
           ObjectInputStream ois = new ObjectInputStream(connectionSocket.getInputStream());
           Object obj = ois.readObject();
           byte[] bytes = (byte[])obj;
           System.out.println("A notification has been received");
           //process bytes
           //...
       }
} catch(IOException ex){
     ex.printStackTrace();  
} catch (ClassNotFoundException e) {
     e.printStackTrace();
}
这就是我如何构建我的
dataByteArray
对象(其中
PlayList
是一个实现java.io.Serializable的POJO):

每当服务器尝试执行
ois.readObject()
,就会抛出
java.io.EOFException
。谁能解释一下原因吗

我在尝试发送数据时收到
java.io.EOFException

不,你不是。您在尝试接收数据时得到了它

你的发送代码没有意义。您应该将
播放列表
对象直接序列化到现有的
ObjectOutputStream
,而不是使用
ByteArrayOutputStreams
和每次发送一个新的对象流的所有这些把戏

因此,您还应该将
readObject()
的结果直接转换到
播放列表中

读取的代码应该循环,直到捕获到
EOFEException
,这意味着对等方关闭了连接


NB
clientSocket
out
在测试点不可能为空。

您应该在
对象中发送
播放列表

客户:

Socket clientSocket = new Socket(serverIpAddr, IConstant.ServerPort);
ObjectOutputStream out = new ObjectOutputStream(clientSocket.getOutputStream();
out.writeObject(playlist);
服务器:

ServerSocket serverSocket = new ServerSocket(IConstant.ServerPort);
Socket connectionSocket = serverSocket.accept();
ObjectInputStream ois = new ObjectInputStream(connectionSocket.getInputStream());
PlayList playList = (PlayList) ois.readObject();

您可以使用thread和get-to-start线程,即spatial类中的线程

像这样:

public class receive  extends Thread{
public   Socket socket = null;
ObjectInputStream din = null;
data_socket respon = null ;
data_socket dtsk = new data_socket();

public receive(Socket skt) {
        this.socket=skt;

     }
@Override
public void run(){
    try {

        din = new ObjectInputStream(this.socket.getInputStream());
        while(true){

                respon=(data_socket)din.readObject();

            switch(respon.action){
                case "login"             : this.check_login(); break;
                case "afeef"             : this.afeef();break;

                default                  : System.out.println("unknow action");
            }
        }
    } catch (IOException ex) {
        System.out.println("::::::::::::::::::ERROR 1::::::::::::::::"+ex.toString());
        System.out.println("You r Lost connect to server ");
       System.exit(0);
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
        System.out.println("::::::::::::::::::ERROR 2::::::::::::::::"+e.getException());
    }
}

您正在写入普通输出流,但正在读取对象输入流。为什么不写入对象输出流?或者,你如何构建
dataByteArray
以确保它是一个完整的对象图?@Andy:我已经更新了我的线程并添加了用于构建dataByteArray对象的方法。你确定客户端正在编写数组吗,没有引发异常?如果读取崩溃,这是因为问题是它发送到itI的内容。我实际上尝试使用字符串而不是dataByteArray,则问题仍然存在。我猜这与发送的数据无关,而是与管理连接的方式有关。我是否在源代码中遗漏了一些内容或添加了一些不正确的内容?
public class receive  extends Thread{
public   Socket socket = null;
ObjectInputStream din = null;
data_socket respon = null ;
data_socket dtsk = new data_socket();

public receive(Socket skt) {
        this.socket=skt;

     }
@Override
public void run(){
    try {

        din = new ObjectInputStream(this.socket.getInputStream());
        while(true){

                respon=(data_socket)din.readObject();

            switch(respon.action){
                case "login"             : this.check_login(); break;
                case "afeef"             : this.afeef();break;

                default                  : System.out.println("unknow action");
            }
        }
    } catch (IOException ex) {
        System.out.println("::::::::::::::::::ERROR 1::::::::::::::::"+ex.toString());
        System.out.println("You r Lost connect to server ");
       System.exit(0);
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
        System.out.println("::::::::::::::::::ERROR 2::::::::::::::::"+e.getException());
    }
}