Pergunta

As I mentioned in this question, I was getting a SocketException: Connection reset.
After implemented Aaron's answer it seems to be working as intended. But today that I run the code again, I got once again the connection reset error.
The problem is that if I run my code like 5 times, it seems to work 2/5 times and the rest gives me the error...

Server:

import java.io.*;
import java.net.*;

public class Server {

    public static void main(String[] args) throws IOException, ClassNotFoundException {       
            ServerSocket server = new ServerSocket(444);
            while (true) {
                Socket socket = server.accept();
                ObjectInputStream objIn = new ObjectInputStream(socket.getInputStream());
                Object objRead = objIn.readObject();
                if (objRead != null) {
                    System.out.println(objRead);
                }
            }       
    }
}

Client:

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.util.HashMap;

public class Client {

    public static void main(String[] args) throws IOException {
        Socket sock;
        int port = 444;
        HashMap<Integer, String>  mapSend= new HashMap<>();
        mapSend.put(1,"row1");
        mapSend.put(2,"row2");

        sock = new Socket(InetAddress.getLocalHost(), port);
        ObjectOutputStream objOut = new ObjectOutputStream(sock.getOutputStream());
        
        objOut.writeObject(mapSend);
        objOut.flush();
    }
}

This is the error: (it appears on the output of the server, after I run the client):

java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(SocketInputStream.java:189)
    at java.net.SocketInputStream.read(SocketInputStream.java:121)
    at java.io.ObjectInputStream$PeekInputStream.read(ObjectInputStream.java:2308)
    at java.io.ObjectInputStream$BlockDataInputStream.read(ObjectInputStream.java:2716)
    at java.io.ObjectInputStream$BlockDataInputStream.readFully(ObjectInputStream.java:2740)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1978)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1913)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1796)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1348)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)
    at java.util.HashMap.readObject(HashMap.java:1154)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1017)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1891)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1796)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1348)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)
    at iotest.Server.main(Server.java:16)

On the client side I get no errors.

EDIT
Any way I can debug the client-server? That might help out to give you guys more info on this.

Foi útil?

Solução

Close the output stream, instead of just flushing it.

NB readObject() doesn't return null unless you write null. The test is pointless.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top