Socket input stream keeps closing or EOF Exception

ServerSocket serverSocket = new ServerSocket(1234);
Socket socket = serverSocket.accept();
try {

System.out.println("Client connected.");

ObjectOutputStream outputStream = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream inputStream = new ObjectInputStream(socket.getInputStream());
while(true){
RequestObject receivedObject = (RequestObject) inputStream.readObject();
if (receivedObject.type == 1) {
applicationPublicKey = receivedObject.publicKey;
RequestObject responseObject = new RequestObject();
responseObject.setPublicKey(myPair.getPublic());
outputStream.writeObject(responseObject);
} else if (receivedObject.type == 2) {
String msg = decrypt(receivedObject.getText().getBytes(), myPair.getPrivate());
System.out.println("Encrypted msg: " + receivedObject);
System.out.println("Decrypted msg: " + msg);
}
}
}catch (Exception e){
e.printStackTrace();
}
ServerSocket serverSocket = new ServerSocket(1234);
Socket socket = serverSocket.accept();
try {

System.out.println("Client connected.");

ObjectOutputStream outputStream = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream inputStream = new ObjectInputStream(socket.getInputStream());
while(true){
RequestObject receivedObject = (RequestObject) inputStream.readObject();
if (receivedObject.type == 1) {
applicationPublicKey = receivedObject.publicKey;
RequestObject responseObject = new RequestObject();
responseObject.setPublicKey(myPair.getPublic());
outputStream.writeObject(responseObject);
} else if (receivedObject.type == 2) {
String msg = decrypt(receivedObject.getText().getBytes(), myPair.getPrivate());
System.out.println("Encrypted msg: " + receivedObject);
System.out.println("Decrypted msg: " + msg);
}
}
}catch (Exception e){
e.printStackTrace();
}
This is a chunk of my Server class, i want the input stream to keep listening to the socket if other requests are called. But it keeps giving me error with the stacktrace:
java.io.EOFException
at java.base/java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:3244)
at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1708)
at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:538)
at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:496)
at Server.main(Server.java:29)
java.io.EOFException
at java.base/java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:3244)
at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1708)
at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:538)
at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:496)
at Server.main(Server.java:29)
Line 29 in server is :
RequestObject receivedObject = (RequestObject) inputStream.readObject();
RequestObject receivedObject = (RequestObject) inputStream.readObject();
19 Replies
JavaBot
JavaBot2y ago
This post has been reserved for your question.
Hey @Ed! Please use /close or the Close Post button above when you're finished. Please remember to follow the help guidelines. This post will be automatically closed after 300 minutes of inactivity.
TIP: Narrow down your issue to simple and precise questions to maximize the chance that others will reply in here.
dan1st
dan1st2y ago
what is the client code?
Ed
EdOP2y ago
public static void main(String[] args) throws NoSuchAlgorithmException {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(2048); // Key size in bits
myPair=keyPairGenerator.generateKeyPair();
PublicKey controllerPublicKey;

Socket socket;
ObjectOutputStream outputStream;
ObjectInputStream inputStream;


try {
socket = new Socket("localhost", 1234);
outputStream = new ObjectOutputStream(socket.getOutputStream());
inputStream = new ObjectInputStream(socket.getInputStream());
RequestObject requestObject = new RequestObject();
requestObject.setType(1);
requestObject.setPublicKey(myPair.getPublic());
outputStream.writeObject(requestObject);

RequestObject response = (RequestObject) inputStream.readObject();
controllerPublicKey= response.publicKey;

RequestObject last=new RequestObject();
last.type=2;
String msg="Hello";
String enc= String.valueOf(encrypt(msg,controllerPublicKey));
last.setText(enc);


System.out.println("Server public key:"+response.getPublicKey());

// Close connections
outputStream.close();
inputStream.close();
socket.close();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static void main(String[] args) throws NoSuchAlgorithmException {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(2048); // Key size in bits
myPair=keyPairGenerator.generateKeyPair();
PublicKey controllerPublicKey;

Socket socket;
ObjectOutputStream outputStream;
ObjectInputStream inputStream;


try {
socket = new Socket("localhost", 1234);
outputStream = new ObjectOutputStream(socket.getOutputStream());
inputStream = new ObjectInputStream(socket.getInputStream());
RequestObject requestObject = new RequestObject();
requestObject.setType(1);
requestObject.setPublicKey(myPair.getPublic());
outputStream.writeObject(requestObject);

RequestObject response = (RequestObject) inputStream.readObject();
controllerPublicKey= response.publicKey;

RequestObject last=new RequestObject();
last.type=2;
String msg="Hello";
String enc= String.valueOf(encrypt(msg,controllerPublicKey));
last.setText(enc);


System.out.println("Server public key:"+response.getPublicKey());

// Close connections
outputStream.close();
inputStream.close();
socket.close();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
i think the issue is mainly from server side because its the one that keeps shutting down
dan1st
dan1st2y ago
Also, note that a single malicious client could completely take over your server
Ed
EdOP2y ago
Yeah this is a primitive project for a class in uni just to demonstrate an idea i am going to build but do you know why the server keeps crashing? Or why do i keep reaching end of input
dan1st
dan1st2y ago
I think so the client sends two request objects but the server accepts such objects in a loop it would expect infinitely many request objects but the client just stops sending
Ed
EdOP2y ago
it actually always stops after first request is recieved and response is sent 2nd request is never received by server for some reason
Unknown User
Unknown User2y ago
Message Not Public
Sign In & Join Server To View
Ed
EdOP2y ago
oh you are actually right... Is there a way to just keep server up all time and deal with each request that he gets from as many clients as possible?
Unknown User
Unknown User2y ago
Message Not Public
Sign In & Join Server To View
Ed
EdOP2y ago
its working now, but after 2 requests it crash with same error How can i listen tho
Unknown User
Unknown User2y ago
Message Not Public
Sign In & Join Server To View
Ed
EdOP2y ago
can i do this without threads? true while loop, with if serversockt.accept? then loop again until end
Unknown User
Unknown User2y ago
Message Not Public
Sign In & Join Server To View
Ed
EdOP2y ago
while(true) {

try {
Socket socket = serverSocket.accept();
try {

System.out.println("Client connected.");

ObjectOutputStream outputStream = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream inputStream = new ObjectInputStream(socket.getInputStream());
while (true) {
System.out.println("HELLO?");
RequestObject receivedObject = (RequestObject) inputStream.readObject();
if (receivedObject.type == 1) {
applicationPublicKey = receivedObject.publicKey;
RequestObject responseObject = new RequestObject();
responseObject.setPublicKey(myPair.getPublic());
outputStream.writeObject(responseObject);
} else if (receivedObject.type == 2) {

String msg = decrypt(receivedObject.getText(), myPair.getPrivate());
System.out.println("Encrypted msg: " + Arrays.toString(receivedObject.getText()));
System.out.println("Decrypted msg: " + msg);
}

}
} catch (Exception e) {
e.printStackTrace();
}
}catch (Exception e){
System.out.println("NO CONNECTION");
}
}
while(true) {

try {
Socket socket = serverSocket.accept();
try {

System.out.println("Client connected.");

ObjectOutputStream outputStream = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream inputStream = new ObjectInputStream(socket.getInputStream());
while (true) {
System.out.println("HELLO?");
RequestObject receivedObject = (RequestObject) inputStream.readObject();
if (receivedObject.type == 1) {
applicationPublicKey = receivedObject.publicKey;
RequestObject responseObject = new RequestObject();
responseObject.setPublicKey(myPair.getPublic());
outputStream.writeObject(responseObject);
} else if (receivedObject.type == 2) {

String msg = decrypt(receivedObject.getText(), myPair.getPrivate());
System.out.println("Encrypted msg: " + Arrays.toString(receivedObject.getText()));
System.out.println("Decrypted msg: " + msg);
}

}
} catch (Exception e) {
e.printStackTrace();
}
}catch (Exception e){
System.out.println("NO CONNECTION");
}
}
something like this logically correct? yeah thats probably what i am planning to do
Unknown User
Unknown User2y ago
Message Not Public
Sign In & Join Server To View
Ed
EdOP2y ago
yeah i fixed it its working now Thanks a lot mate i really appreciate it!
JavaBot
JavaBot2y ago
If you are finished with your post, please close it. If you are not, please ignore this message. Note that you will not be able to send further messages here after this post have been closed but you will be able to create new posts.
JavaBot
JavaBot2y ago
Post Closed
This post has been closed by <@351059014341099521>.

Did you find this page helpful?