JAVA Sockets вызывается слишком много раз - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь реализовать ServerSocket, но я просто не могу понять, почему код вызывается 3 раза, если я закрываю соединение. Вот мой код:

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

import static java.lang.System.out;

public class Main {


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

        int port = 8080;
        ServerSocket serverSocket = new ServerSocket(port);
        out.println("Listening ..");

        while(true){
            Socket socket = serverSocket.accept();
            out.println("Connected" + socket.getLocalAddress());
            new Thread(new MultiThreadServer(socket)).start();
        }

    }
}



import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

import static java.lang.System.out;

public class MultiThreadServer implements  Runnable{

    Socket clientSocket;

    MultiThreadServer(Socket clientSocket){ this.clientSocket = clientSocket;};

    @Override
    public void run() {

        try{
            out.println("inside thread");
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream()));
            String request = bufferedReader.readLine();
            out.println("request: " + request);
            bufferedReader.close();
            this.clientSocket.close(); //Without this line, the code is only called once
        }catch(IOException e){
            out.println(e);
        }

    }


}

Таким образом, вызов метода close () на clientSocket вызвал бы вызываемый внутри «while (true)» 3 раза, тогда как без вызова метода он был бы вызван один раз. Вот лог с socket.close ():

Listening ..
Connected/0:0:0:0:0:0:0:1
inside thread
request: GET /tttes HTTP/1.1
Connected/0:0:0:0:0:0:0:1
inside thread
request: GET /tttes HTTP/1.1
Connected/0:0:0:0:0:0:0:1
inside thread
request: GET /tttes HTTP/1.1

Вот лог без socket.close ():

Listening ..
Connected/0:0:0:0:0:0:0:1
inside thread
request: GET /tttes HTTP/1.1

1 Ответ

0 голосов
/ 02 ноября 2018

Скорее всего, ваш клиент ожидает данных с вашего сервера и не пытается подключиться снова, пока не закроется предыдущее соединение. Это объясняет поведение, которое вы видите.

Если у вас несколько одновременно работающих клиентов, одно соединение не знает, что вы не собираетесь закрывать соединение для несвязанного соединения.

...