Не могу ничего считать с InputStream сокета

230
16 сентября 2017, 23:20

Пытаюсь сделать консольный чат на сокетах. В методе run() в классе MessageHandler (внутренний класс класса Client) поток блокируется при попытке чтения из входного потока сокета: message = reader.readLine();. Но ведь данные я туда записываю: writer.println(message);, writer.flush();

Main.java

package main;
import classes.client.Client;
import classes.server.Server;
public class Main {
    public static void main(String[] args) {
        Thread acceptingConnection = new Thread(new Server().new AcceptingConnection());
        acceptingConnection.setName("AcceptingConnectionThread");
        acceptingConnection.start();
        Client.connect();
    }
}

Client.java

package classes.client;
import classes.server.Server;
import java.io.*;
import java.net.*;
import java.util.*;
public class Client {
    private final Socket clientSocket;
    private final String clientName;
    private InputStream  clientInput;
    private OutputStream clientOutput;
    public Client(Socket clientSocket, String clientName) {
        this.clientSocket = clientSocket;
        this.clientName   = clientName;
        try {
            clientInput  = this.clientSocket.getInputStream();
            clientOutput = this.clientSocket.getOutputStream();
        } catch (IOException ex) {
            clientInput  = null;
            clientOutput = null;
            ex.printStackTrace();
        }
    }
    public Socket getClientSocket() {
        return this.clientSocket;
    }
    public String getClientName() {
        return this.clientName;
    }
    public static void connect() {
        try {
            Socket socket = new Socket(InetAddress.getLocalHost(), Server.port);
        } catch (UnknownHostException ex) {
            ex.printStackTrace();
        } catch(IOException ex) {
            ex.printStackTrace();
        }
    }
    public class MessageHandler implements Runnable {
        @Override
        public void run() {
            String message;
            try(Scanner scanner = new Scanner(System.in);
                BufferedReader reader = new BufferedReader(new InputStreamReader(clientInput));
                PrintWriter writer = new PrintWriter(clientOutput)) {
                while(true) {
                    System.out.print("Введите сообщение: ");
                    message = scanner.nextLine();
                    if(!message.isEmpty()) {
                        writer.println(message);
                        writer.flush();
                    }
                    message = reader.readLine();   // Вот тут где-то подвисает!!!
                    if(message != null && !message.isEmpty())
                        System.out.println("Получено сообщение: " + message);
                }
            } catch(IOException ex) {
                ex.printStackTrace();
            }
        }
    }
}

Server.java

package classes.server;
import java.util.*;
import java.io.*;
import java.net.*;
import classes.client.Client;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Server {
    public final static int port = 5555;
    private List<Client> clientList;
    private ServerSocket serverSocket;
    public Server() {
        clientList = new ArrayList<>();
        try {
            serverSocket = new ServerSocket(port);
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
    public class AcceptingConnection implements Runnable {
        @Override
        public void run() {
            try {
                while(true) {
                    Socket clientSocket = serverSocket.accept();
                    System.out.print("Введните свой ник: ");
                    Scanner scanner = new Scanner(System.in);
                    String clientName = scanner.nextLine();
                    Client client = new Client(clientSocket, clientName);
                    clientList.add(client);
                    System.out.println("Вход выполнен! Client: ");
                    System.out.println("\tName: " + clientName);
                    System.out.println("\tInetAdress: " + clientSocket.getInetAddress());
                    System.out.println("Количество подключенных клиентов: " + clientList.size());
                    Thread messageHandle = new Thread(client.new MessageHandler());
                    messageHandle.start();
//                    Thread senderThread = new Thread(client.new Sender());
//                    senderThread.setName("SenderThread");
//                    senderThread.start();
//
//                    Thread receiverThread = new Thread(client.new Receiver());
//                    receiverThread.setName("ReceiverThread");
//                    receiverThread.start();
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }
}
READ ALSO
как парсить файл json в java

как парсить файл json в java

Как в Jave спарсить отсюда http://schedulesumdu

200
обработка результатов запроса hibernate

обработка результатов запроса hibernate

Начинаю изучать javaПодскажите, т

243
Не создается файл на диске [требует правки]

Не создается файл на диске [требует правки]

Знакомлюсь с графическим интерфейсом Java SwingПоявилась такая проблема: при нажатии на кнопку должен создаваться файл на диске, а он создается...

174
Нужно ли всегда проверять аргументы на null

Нужно ли всегда проверять аргументы на null

Здравствуйте! Есть такой вот вопрос - нужно ли всегда поверять аргументы на null? наподобие:

165