2015-10-01 2 views
0

Так что я отправить Server объект к клиенту этой теме:Java «NotSerializableException: java.net.Socket» Когда не посылает гнездо

public ConnectionThread(final Server server) { 
    super(new Runnable() { 
     public void run() { 
      try { 
       Socket client = server.serverSocket.accept(); 
       server.clients.add(client); 

       ObjectInputStream in = new ObjectInputStream(
         client.getInputStream()); 
       ObjectOutputStream out = new ObjectOutputStream(
         client.getOutputStream()); 

       System.out.println("Connected client: " 
         + client.getRemoteSocketAddress()); 
       server.launchNewThread(); 

       Object input; 
       while (!client.isClosed()) { 
        input = in.readObject(); 

        if (input != null) { 
         if (input.toString().equals("server")) { 
          out.writeObject(server); 
         } 
        } 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 

И когда я называю out.writeObject (сервер) Я получаю это исключение:

java.io.NotSerializableException: java.net.Socket 

Вот класс сервера:

public class Server implements Serializable { 
private static final long serialVersionUID = 4634111951586948020L; 

public ServerArgs args; 

public ArrayList<Socket> clients = new ArrayList<Socket>(); 
public ServerSocket serverSocket; 

public Server(int port) throws IOException { 
    serverSocket = new ServerSocket(port); 

    launchNewThread(); 
} 

public void launchNewThread() { 
    ConnectionThread thread = new ConnectionThread(this); 
    thread.start(); 
} 

public static void main(String[] args) throws IOException { 
    new Server(27015); 
} 
} 
+0

Просьба указать определение класса сервера –

+0

Недопустимый цикл чтения. 'client.isClosed()' не волшебным образом становится истинным, когда партнер отключается, а 'readObject()' не возвращает значение null, если вы не написали null. Вы должны зацикливаться до тех пор, пока не будет обнаружено «EOFException». – EJP

ответ

2
public ArrayList<Socket> clients = new ArrayList<Socket>(); 
public ServerSocket serverSocket; 

У вас есть много несериализуемых сокетов прямо там. Очень непонятно, какой целью является «отправка сервера», но, возможно, вам следует либо просто отправить ServerArgs, либо отметить эти два поля transient.

+0

Работа с полями «переходный». Благодаря! –

Смежные вопросы