1

I'm doing a school project where we are supposed to create a simplefied Hotel booking system and then use it with a server/client communication. Since I wanted to push the project a bit and do a multithreaded program, I've got a Socket Exception that I'm not sure how to handle. I've searched everywhere for an answer and I know that the exception occours because I'm trying to use a socket that has been closed. But from what I've read on Oracle-docs, their example is doing that as well.

So, is this actually Ok, just that I need to handle the exception? Cause my code runs fine, I just see the exceptions since I've put e.printStackTrace(); in my catch.

My Client class:

package client;

import java.io.*;
import java.net.Socket;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Scanner;

public class Client {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        try {

            Socket client = new Socket("localhost", 6066);

            //System.out.println("Just connected to " + client.getRemoteSocketAddress());

            OutputStream outToServer = client.getOutputStream();
            DataOutputStream out = new DataOutputStream(outToServer);

            InputStream inFromServer = client.getInputStream();
            DataInputStream in = new DataInputStream(inFromServer);

            LocalDate localDate = LocalDate.now();
            String date = DateTimeFormatter.ofPattern("yyy/MM/dd").format(localDate);

            System.out.println(in.readUTF());
            System.out.print("Namn: ");
            String name = sc.nextLine();
            System.out.print("Ålder: ");
            String age = sc.nextLine();

            out.writeUTF(name);
            out.writeUTF(age);
            out.writeUTF(date);

            System.out.println(in.readUTF());


            client.close();
        }catch(IOException e) {
            e.printStackTrace();
        }
    }

}

And my Server class:

package server;

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


public class Server {

    public static void main(String [] args) throws IOException {

        int port = 6066;
        ServerSocket server = new ServerSocket(port);
        while(true) {
            System.out.println("Listening for client..");

            try {

                Socket connectedClient = server.accept();
                ClientHandle ch = new ClientHandle(connectedClient);
                Thread t = new Thread((Runnable) ch);
                t.start();

            }catch (IOException e) {

            }
        }
    }
}

And then my ClientHandle class which has the run() for the server-side:

package server;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.net.*;
import resources.*;

public class ClientHandle implements Runnable{

    Socket connectedClient;
    DataInputStream in;
    DataOutputStream out;

    public ClientHandle(Socket connectedClient) {
        this.connectedClient = connectedClient;
        try{
            this.in = new DataInputStream(this.connectedClient.getInputStream());
            this.out = new DataOutputStream(this.connectedClient.getOutputStream());
        }catch(IOException ex) {

        }
    }

    Hotel hotel = new Hotel();
    Ticket yourTicket = new Ticket();
    Server server = new Server();

    @Override
    public void run() {
            while (true) {
                try {

                    InetAddress host = InetAddress.getLocalHost();
                    System.out.println("Client " + host + " has connected.");

                    out.writeUTF("Välkommen till Hotel Gisslevik!\nVänligen fyll i nedan information för att slutföra din bokning.\n");

                    String yourName = in.readUTF();
                    String age = in.readUTF();
                    int yourAge = Integer.parseInt(age);

                    String date = in.readUTF();
                    yourTicket.setDate(date);

                    Person guest = new Person(yourName, yourAge);
                    hotel.setRooms();
                    Integer room = hotel.getRoom();
                    String rent = "J";

                    if (rent.indexOf("J") >= 0) {
                        yourTicket.setId(yourName);
                        if (hotel.checkIn(guest, room, yourTicket.getId(), yourTicket.getDate())) {
                            String yourId = yourTicket.getId();
                            out.writeUTF("\nDitt rum är nu bokat den " + date + ". \nBokningsnummer: " + yourId);
                        }
                    }

                    out.flush();
                    connectedClient.close();


                }catch (EOFException e) {


                } catch (IOException e) {
                    e.printStackTrace();
                    break;
                }
            }
    }
}

If I just comment e.printStackTrace(); the exceptions doesn't show, but I would like to know how to handle them (if they should be handled). I've been searching the internet for days and checked out tutorials, but I don't find a proper answer to this.

I really appreciate any help you can provide.

1
  • @Pavel Pointless edit rejected. Commented Oct 26, 2017 at 10:41

1 Answer 1

2

Handle java.net.SocketException: Socket closed

Don't close the socket and then continue to use it.

when multithreading?

Irrelevant.

You have connectedClient.close() inside your while (true) loop. Solution: move it outside.

Sign up to request clarification or add additional context in comments.

2 Comments

Oh, I didn't even think of that. Thank you! Is it safe to ignore the java.net.SocketException: Software caused connection abort: socket write error that appers instead?
No, it isn't. That indicates a completely different error. Look up 'Official reasons for Software caused connection abort: socket write error' here.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.