Search code examples
javasocketsserializableobjectinputstreamobjectoutputstream

ObjectOutput/InputStream only sends and recevies objects once


i'm trying to send an object that will hold some information through ObjectOutputStream using sockets. when i call the method Client_Handler(String auth, String user) and send the object it works fine, but when i call it again it doesn't work. I want to be able to use the connection to send the object with different data inside it many times.

client:

public void Client_Handler(String auth, String user){
        try{
        socket2 = new Socket(serverAddress, 8080);
        User_Authorization us3 = new User_Authorization();
        ObjectOutputStream out2 = new ObjectOutputStream(socket2.getOutputStream());
        us3.set_name(user);
        us3.set_authorization(auth);
        out2.writeUnshared(us3);  
        }catch(Exception e){
            JOptionPane.showMessageDialog(null, e, "Error", JOptionPane.ERROR_MESSAGE);
        }  
}

server:

public class Conn implements Runnable{
private Socket socket;
public static ServerSocket server ;

public void go(){
    Thread r = new Thread(this);
        try{
                r.start();
        }catch(Exception e){
            JOptionPane.showMessageDialog(null, e, "Error", JOptionPane.ERROR_MESSAGE);
        }  
}

@Override
public void run() {
    try{
    server = new ServerSocket(8080);
    socket = server.accept(); 
    while(true){
        Login.User_Authorization us = null;            
        ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
        us = (Login.User_Authorization) in.readObject();
    System.out.println(us.get_name()+ "he's " +us.get_authorization());
   }
    }catch(Exception e){JOptionPane.showMessageDialog(null, e, "Error", JOptionPane.ERROR_MESSAGE);}
}

Solution

  • when i call the method Client_Handler(String auth, String user) and send the object it works fine, but when i call it again it doesn't work.

    Because, each time you are calling Client_Handler(String auth, String user) method you are trying to establish a new connection with Server via socket2 = new Socket(serverAddress, 8080); which is terminating the previous connection. That's why you are getting EOFException exception. You should create the socket2 object once before calling Client_Handler method. And while calling the Client_Handler method simply use the initialized Socket socket2.

    You code could something be like this at client side:

    Socket socket2;
    ObjectOutputStream out2 = null;
    public void mainMethod()
    {
        try
        {
            socket2 = new Socket(serverAddress, 8080);  
            out2 = new ObjectOutputStream(socket2.getOutputStream());
            boolean canSend = true;
            while (canSend)
            {
                canSend = Client_Handler("authentication","user");
            }
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }
        finally
        {
            if (out2!=null)
            {
                try
                {
                    out2.close();
                }
                catch (Exception ex)
                {
                    ex.printStackTrace();
                }
            }
        }
    }
    public boolean Client_Handler(String auth, String user)
    {
        try
        {
            User_Authorization us3 = new User_Authorization();
            us3.set_name(user);
            us3.set_authorization(auth);
            out2.writeUnshared(us3);  
        }catch(Exception e)
        {
            JOptionPane.showMessageDialog(null, e, "Error", JOptionPane.ERROR_MESSAGE);
            return false;
        }  
        return true;
    }