Простой многопоточный сокет-сервер не работает (сокет закрыт) - PullRequest
0 голосов
/ 14 января 2019

У меня действительно простой многопоточный сервер в комплекте.

Когда мой клиент вызывает сервер, сервер выдает следующее исключение: java.net.SocketException: сокет закрыт но мой код не закрыл сокет.

Первый сегмент кода - мой клиент. Второй и третий сегменты кода определяют сервер и то, как он обрабатывает запросы. У меня был другой однопоточный клиент-сервер, и он работал правильно. Может ли кто-нибудь помочь взглянуть?

public class SocketClient {
public static void main(String[] args) {
    String hostname = "127.0.0.1";
    int port = 900;

    try{
        Socket socket = new Socket(hostname, port);
        OutputStream output = socket.getOutputStream();
        PrintWriter writer = new PrintWriter(output, true);
        writer.println("GET /");
        writer.println();
        writer.flush();

        InputStream input = socket.getInputStream();

        BufferedReader reader = new BufferedReader(new InputStreamReader(input));

        String line;

        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }
    } catch (UnknownHostException ex) {
            System.out.println("Server not found: " + ex.getMessage());
    } catch (IOException ex) {
            System.out.println("I/O error: " + ex.getMessage());
    }
}

}

public class SimpleHTTPServer {
public static void main(String[] args) throws Exception {
    //create a network socket which can accept connection on certain TCP port
    //create Server which can accept requests
    final ServerSocket server = new ServerSocket(900);
    System.out.println("Listening for connection on port 900...");
    while(true) {
        try (Socket socket = server.accept()) { //creates socket when new request is received
            System.out.println("received request");
            RequestHandler rh = new RequestHandler(socket); //RequestHandler implements runnable interface, pass this object to create Thread
            Thread thread = new Thread(rh);
            thread.start(); //begins run() method defined in rh
        }
    }
}

}

public class RequestHandler implements Runnable {
private Socket socket;
public RequestHandler(Socket socket) {
    this.socket = socket;
}
@Override
public void run() {
    try {
        System.out.println("calling handleRequest");
        handleRequest();
    } catch (Exception e) {
        System.err.println(e);
        try {
            socket.close();
        } catch (IOException e1) {
            System.err.println("Error Closing socket connection");
            System.exit(0);
        }
    }
}
private void handleRequest() throws Exception {
    System.out.println("handleRequest called");
    Date today = new Date();
    String httpResponse = "HTTP/1.1 200 OK\r\n\r\n" + today;
    System.out.println("1st" + httpResponse);
    socket.getOutputStream().write(httpResponse.getBytes("UTF-8"));
    System.out.println("2nd" + httpResponse);
    System.out.println("got a new request");
}

}

1 Ответ

0 голосов
/ 19 января 2019

Я изменил сервер на ниже, и он работает -

public class SimpleHTTPServer {
public static void main(String[] args) throws Exception {
    //create a network socket which can accept connection on certain TCP port
    //create Server which can accept requests
    final ServerSocket server = new ServerSocket(900);
    System.out.println("Listening for connection on port 900...");
    while(true) {
        try { //creates socket when new request is received
            Socket socket = server.accept();
            System.out.println("received request");
            RequestHandler rh = new RequestHandler(socket); //RequestHandler implements runnable interface, pass this object to create Thread
            Thread thread = new Thread(rh);
            thread.start(); //begins run() method defined in rh
//                Date today = new Date();
//                String httpResponse = "HTTP/1.1 200 OK\r\n\r\n" + today;
//                socket.getOutputStream().write(httpResponse.getBytes("UTF-8"));
//                System.out.println("got a new request");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...