【问题标题】:Errorwhen WriteObject from Server To Socket将对象从服务器写入套接字时出错
【发布时间】:2016-09-01 06:42:06
【问题描述】:

当将对象从服务器发送到客户端时,有人帮我解决了这个异常 它是 NotSerializableException >>>>>

    /*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package test;

import java.io.FileWriter;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.logging.Level;
import java.util.logging.Logger;


/**
 *
 * @author Haz
 */
public class Server {

    boolean isRunning = true;
    public static final int Port = 500;
    public static final String Address = "127.0.0.1";
    ObjectOutputStream outToClient;
    Socket Client;
    ArrayList<ConnectionHandler> Handlers;
    HashSet<Socket> Callers;

    public Server() throws IOException {

        ServerSocket socketSer = new ServerSocket(500);
        ExecutorService service = Executors.newFixedThreadPool(50);

        Handlers = new ArrayList<>();
        Callers = new HashSet<>();
        while (isRunning) {
             Client = socketSer.accept();
             System.out.println("Client Connect on Sever");
            ConnectionHandler handler = new ConnectionHandler(Client,socketSer);
            Handlers.add(handler);
            Callers.add(Client);
            SendConnectToAll(Handlers);


        }
    }


    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException {
        // TODO code application logic here
        new Server();
    }

    private void SendConnectToAll(ArrayList<ConnectionHandler> Handlers){


        try {
            outToClient = new ObjectOutputStream(Client.getOutputStream());
            outToClient.writeObject(Handlers);
            outToClient.flush();
            outToClient.close();   
        } catch (IOException ex) {
            Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
        }


    }

}





/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package test;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.Serializable;
import java.net.Socket;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Haz
 */
public class SocketClient {
    Socket Client;
    ObjectInputStream inputFromServer;

    public SocketClient(String Address,int Port) {
        try {
            Client = new Socket(Address,Port);
        } catch (IOException ex) {
            Logger.getLogger(SocketClient.class.getName()).log(Level.SEVERE, null, ex);
        }
        new Thread(new Runnable(){
            @Override
            public void run() {
                         Object temp =null;

                try {
                    inputFromServer = new ObjectInputStream(Client.getInputStream());
                    temp =inputFromServer.readObject();
                    while((temp)!=null){
                          temp = inputFromServer.readObject();
                        System.out.println(temp);
                    }
                    inputFromServer.close();
                } catch (IOException ex) {
                    Logger.getLogger(SocketClient.class.getName()).log(Level.SEVERE, null, ex);
                } catch (ClassNotFoundException ex) {
                    Logger.getLogger(SocketClient.class.getName()).log(Level.SEVERE, null, ex);
                }

            }

        }).start();
    }



}

和类 ConnectionHandler 它是空的,但我实现了

public class ConnectionHandler implements Runnable,Serializable {

    private Socket Client;
    private ServerSocket Server;

    public ConnectionHandler(Socket Client, ServerSocket Server) {
        this.Client = Client;
        this.Server = Server;
    }

【问题讨论】:

  • ConnectionHandler 似乎没有实现任何东西,它甚至可以编译吗?
  • 是的,我从 connectionHandler 创建数组列表

标签: java sockets serversocket serializable objectoutputstream


【解决方案1】:

ConnectionHandler 不可序列化,因为它包含对不可序列化的 Socket 和 ServerSocket 的引用。您必须编写自己的序列化和反序列化方法才能使其可序列化。

但是,无论如何让它可序列化是没有意义的,因为它没有任何可序列化的数据通过网络传输。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-01
    • 2018-02-10
    • 2015-11-02
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    相关资源
    最近更新 更多