Как заставить Java TCP Server и клиентское приложение зацикливаться, пока не будет выполнено определенное количество запросов - PullRequest
0 голосов
/ 15 сентября 2018

Я написал как сервер TCP, так и клиентское приложение TCP в Eclipse.Клиент получает пользовательский ввод в виде строки, затем отправляет его на сервер, который его использует, и отправляет обратно.Они должны продолжать цикл до тех пор, пока сервер не получит определенное количество запросов, и в этом случае он закрывает соединение между сокетами и останавливается.К сожалению, кажется, что это происходит только один раз.После кода я приведу пример вывода того, о чем я говорю.

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


public class TCPServer {

public static void main(String argv[]) throws Exception {
    String clientSentence;
    String capitalizedSentence;
    ServerSocket welcomeSocket = new ServerSocket(6789);
    int requests = 0;
    while (true) {
        Socket connectionSocket = welcomeSocket.accept();
        BufferedReader inFromClient = new BufferedReader (new InputStreamReader( connectionSocket.getInputStream()));
        DataOutputStream outToClient = new DataOutputStream (connectionSocket.getOutputStream());
        do {

            clientSentence = inFromClient.readLine();
            capitalizedSentence = clientSentence.toUpperCase() + '\n';
            outToClient.writeBytes(capitalizedSentence);
            outToClient.flush();
            requests++;
        }
        while(requests < 10);
        outToClient.writeBytes("REQUEST LIMIT REACHED");

        }

}

}

и клиент

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

public class TCPClient {

public static void main(String argv[]) throws Exception {
    String sentence;
    String modifiedSentence;
    BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
    //Creates socket, replace the hostnmae/ip address with the ipaddress of the computer running the server application.
    Socket clientSocket = new Socket("10.69.88.130", 6789);
    DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
    BufferedReader inFromServer = new BufferedReader(new InputStreamReader (clientSocket.getInputStream()));
    do {
        System.out.print("TO SERVER: ");
        sentence = inFromUser.readLine();
        outToServer.writeBytes(sentence + '\n');
        outToServer.flush();
        modifiedSentence = inFromServer.readLine();
        System.out.println("FROM SERVER: " + modifiedSentence);
    }
    while (!modifiedSentence.equals("REQUEST LIMIT REACHED"));
    System.out.println(modifiedSentence);
    clientSocket.close();
    }

}

и, наконец, вывод, который я получаю

TO SERVER: testa
FROM SERVER: TESTA
TO SERVER: testb
(nothing else is displayed after this line)

1 Ответ

0 голосов
/ 15 сентября 2018

Хорошо, ваш код работает (вроде).Вы получаете успешный запуск, затем вы перезапускаете свой клиент, не перезагружая сервер.Ваше request -значение не сбрасывается в 0 и после перезапуска клиента первый запрос, который ваш клиент делает, является номером 10 для вашего сервера.Так почему же этот запрос поступает?Поскольку вы сначала очищаете строку, а затем проверяете свой счетчик.

Я немного изменил ваш сервер.Может быть, это то, что вы ищете?

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


public class TCPServer {

    public static void main(String argv[]) throws Exception {
        String clientSentence;
        String capitalizedSentence;
        ServerSocket welcomeSocket = new ServerSocket(6789);
        int requests = 0;
        while (true) {
            Socket connectionSocket = welcomeSocket.accept();
            BufferedReader inFromClient = new BufferedReader (new InputStreamReader( connectionSocket.getInputStream()));
            DataOutputStream outToClient = new DataOutputStream (connectionSocket.getOutputStream());
            while (requests < 10) {

                clientSentence = inFromClient.readLine();
                capitalizedSentence = clientSentence.toUpperCase();
                outToClient.writeBytes(capitalizedSentence + " Request: " + requests +  '\n');
                outToClient.flush();
                requests++;
            }
            outToClient.writeBytes("REQUEST LIMIT REACHED");
            requests = 0;
        }

    }

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