Как сломать эту л oop? Я не уверен, поэтому я подключил сервер и поток сервера - PullRequest
0 голосов
/ 29 февраля 2020

Я не совсем уверен, что я делаю неправильно. Я новичок в работе с серверами / сокетами и несколько раз пытался взломать этот l oop, но каждый раз, когда он просто блокирует и не разрешает клиенту доступ к серверу. Это сервер:

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

public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(2999);
        while(true){
            Socket s = ss.accept();
            System.out.println("Client Connected to Server");
            ServerThread th = new ServerThread(s);
            th.start();
        }  

    }

Вот рабочая тема

import org.apache.commons.lang3.StringUtils;

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

public class ServerThread extends Thread {
    private final Socket s;
    public ServerThread(Socket s){
        this.s=s;
    }
    public void run(){

        try {
            username();

        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            readMessageAndPrint();
            if (closeServer(s)==0){
                s.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    private void username() throws IOException {
        InputStreamReader in = new InputStreamReader(s.getInputStream());
        BufferedReader bf = new BufferedReader(in);
        String str;
        try {
            str = bf.readLine();
            String []firstStatement = StringUtils.split(str);
            PrintWriter pr = new PrintWriter(s.getOutputStream());
            pr.println("Hello "+firstStatement[4] +", this is the server. " +
                    "Type 'Hi' to start talking. " +
                    "Type 'Quit' to leave");
            pr.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void readMessageAndPrint() throws IOException {
        while (true) {
            InputStreamReader in = new InputStreamReader(s.getInputStream());
            BufferedReader bf = new BufferedReader(in);
            String str = bf.readLine();
            System.out.println(str);
            if ("Quit".equals(str)) {
                break;
            }

        }
    }
    private static int closeServer(Socket s) throws IOException {
        int numberOfClients = 0;
        while (true) {
            InputStreamReader in = new InputStreamReader(s.getInputStream());
            BufferedReader bf = new BufferedReader(in);
            String str = bf.readLine();
            if ("Quit".equals(str)) {
                numberOfClients--;
            }
            if ("Hi".equals(str)){
                numberOfClients++;
            }
            if (numberOfClients == 0) {
                return 0;
            }
        }
    }


}

Как только все клиенты покидают комнату чата, сервер сбрасывается вместо closin. Я попытался поместить метод close server в то время как l oop, чтобы, если ServerThread.closeServer (s) == 0, l oop ломался, но это просто блокировало клиента, достигающего сервера. Опять же, я новичок в программировании и работе в сети, поэтому любая помощь будет принята.

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