【问题标题】:Java sockets - Custom Objects SendingJava 套接字 - 自定义对象发送
【发布时间】:2012-01-12 12:11:59
【问题描述】:

我已经创建了工作套接字,当我尝试发送文本或数字时,没问题,但是当我尝试发送我的自定义类对象时,我得到了 NullPointerException... 这是一些代码:

public boolean SendLi(List<Entity> list)
{
    try {
         out.writeObject(list);
    } catch (IOException e) {
        e.printStackTrace();
        System.err.println("Send: Error on OutputStream.write(byte[])");
    }
    return true;
}

public List<Entity> RecvLi()
{
    List<Entity> data;
    data = new ArrayList<Entity>();
      try{
          data = (List<Entity>) in.readObject();
        } catch (IOException e) {
          System.err.println("Send: Error on OutputStream.read(byte[]) - IOException");
          return null;
        } catch (ClassNotFoundException e) {
          System.err.println("Send: Error on OutputStream.read(byte[]) - ClassNotFound");
            e.printStackTrace();
        }
    return data;
}

实际上,我为列表编写的代码,但我想要一些类似的函数来发送其他对象。 感谢您的任何回复!

【问题讨论】:

    标签: java sockets object arraylist


    【解决方案1】:

    您需要在通过套接字发送自定义类之前对其进行序列化。您要发送的对象

    out.writeObject(list);
    

    应该被序列化,你的类应该实现 java.io.Serializable 接口

    【讨论】:

    • 问题是自定义对象被序列化了,但是没有帮助。我不能序列化ArrayList,所以它必须是其他的......
    • 改为 List 尝试设置数组 Entity[]。
    【解决方案2】:

    下面的代码 sn-ps 对我来说适用于所有类型的可序列化对象。请检查。

    *IRequest 是要发送的对象。 *IResponse 是要获取的对象。

    客户代码:

        Socket clientSocket = new Socket(hostName, portNo);
        clientSocket.setSoTimeout(connectionTimeout);
        try {
            OutputStream outputStream = clientSocket.getOutputStream();
            InputStream inputStream = clientSocket.getInputStream();
            ObjectOutputStream objOutputStream = new ObjectOutputStream(outputStream);
            ObjectInputStream objInputStream = null;
    
            try {
                objOutputStream.writeObject(request);
                objOutputStream.flush();
                objInputStream = new ObjectInputStream(inputStream);
                res = (IResponse) objInputStream.readObject();
            } finally {
                if (objOutputStream != null) {
                    objOutputStream.close();
                }
                if (outputStream != null) {
                    outputStream.close();
                }
                if (objInputStream != null) {
                    objInputStream.close();
                }
                if (inputStream != null) {
                    inputStream.close();
                }
            }
        } finally {
            clientSocket.close();
            clientSocket = null;
        }
    

    服务器代码:

            private IMessageProcessor messageProcessor = null;
            private Socket clientSocket = null;
            private Logger logger = null;
    
    
            String clientIP = clientSocket.getInetAddress().getHostAddress();
            int clientPortNr = clientSocket.getPort();
    
            InputStream inputStream = clientSocket.getInputStream();
            OutputStream outputStream = clientSocket.getOutputStream();
            try {
                ObjectInputStream objInputStream = null;
                ObjectOutputStream objOutputStream = null;
                try {
                    IRequest request = null;
    
                    objInputStream = new ObjectInputStream(inputStream);
                    objOutputStream = new ObjectOutputStream(outputStream);
                    request = (IRequest) objInputStream.readObject();
    
                    IResponse response = null;
    
                    try {
                        response = messageProcessor.processMessage(clientIP,
                                                                    clientPortNr,
                                                                    request,
                                                                    logger);
                        objOutputStream.writeObject(response);
                    } catch (Exception ex) {
                        objOutputStream.writeObject(ex);
                    }
    
                    objOutputStream.flush();
                    objOutputStream.reset();
    
                } finally {
                    if (objInputStream != null)
                        objInputStream.close();
                    if (objOutputStream != null)
                        objOutputStream.close();
                }
            } finally {
                inputStream.close();
                outputStream.close();
                clientSocket.close();
            }
        } catch (Exception ex) {
            logger.error(ex.getMessage());
        }
    

    【讨论】:

    • 我猜你这边有问题,因为我每天都在使用它。也许首先您应该尝试传输一个简单的 Integer 对象。不会有任何问题。
    猜你喜欢
    • 2014-01-11
    • 2021-01-11
    • 1970-01-01
    • 2012-08-29
    • 2015-08-31
    • 2014-03-24
    • 2017-03-20
    • 1970-01-01
    • 2012-03-13
    相关资源
    最近更新 更多