Nano Hash - криптовалюты, майнинг, программирование

Почему клиент зависает после успешного соединения с сервером?

Я пытаюсь создать чат в java, используя Socket и ServerSocket, и клиент и сервер успешно подключаются друг к другу через IP-адреса. Но как только я подключаюсь и пытаюсь ввести что-то в textField, весь чат зависает, и мне приходится выходить из приложения, чтобы остановить его. Знаете ли вы какие-либо причины, по которым это может происходить?

Это сервер

public class Server {

public static void main(String[] args) throws IOException {
    System.out.println("The server is running");
    int clientNumber = 1; 
    ServerSocket listener = new ServerSocket(9092); 
    try{
        while(true){
            new Chat(listener.accept(), clientNumber++).start();
        }
    }finally{
        listener.close(); 
    }
}

private static class Chat extends Thread{
    private Socket socket; 
    private int clientNumber; 

    public Chat(Socket socket, int clientNumber) {
        this.socket = socket; 
        this.clientNumber = clientNumber; 
        System.out.println("You have connected as " + clientNumber +".");
    }

    public void run(){
        try{
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 

            out.println("You can chat with any other people who have connected");
            out.println("To leave just enter a single slash"); 
            out.println(clientNumber + " people have connected.");

            while(true){
                String input = in.readLine(); 
                if(input == null || input.equals("/")){
                    break; 
                }
                out.println("Client #" + clientNumber +":" + input);
            }
        }catch (IOException e) {
            System.out.println("Error handling client# " + clientNumber + ": " + e);
        } finally {
            try {
                socket.close();
            } catch (IOException e) {
                System.out.println("Couldn't close socket");
            }
            System.out.println("Client #" + clientNumber + " has ended the connection");

        }

    }

}

}

Это клиент

public class Client implements KeyListener {

private BufferedReader in; 

private PrintWriter out;

private JFrame frame = new JFrame("Chat Room"); 

private JTextField dataField = new JTextField(100); 

private JTextArea messageArea = new JTextArea(10, 100); 



public Client(){

    messageArea.setEditable(false);

    frame.getContentPane().add(dataField, "South");
    frame.getContentPane().add(messageArea, "Center");

    dataField.addKeyListener(this);

}



public void connectToServer() throws Exception{

    String serverAddress = JOptionPane.showInputDialog(frame,

            "Enter IP Address of the Server:",

            "Welcome to the Capitalization Program",

            JOptionPane.QUESTION_MESSAGE);



    Socket socket = new Socket(serverAddress, 9092); 

    in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

    out = new PrintWriter(socket.getOutputStream()); 



    for(int i =0; i<3; i++){

        messageArea.append(in.readLine() +"\n");

    }

}



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

     Client client = new Client(); 

     client.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

     client.frame.pack(); 

     client.frame.setVisible(true);
     client.connectToServer();

}



@Override
public void keyTyped(KeyEvent e) {
    // TODO Auto-generated method stub

}



@Override
public void keyPressed(KeyEvent e) {
    int c = e.getKeyCode(); 
    if(c == KeyEvent.VK_ENTER) {

        out.println(dataField.getText());

        String response; 

        try{

            response = in.readLine(); 

            if(response == null || response.equals("")){

                System.exit(0);

            }

        } catch (IOException ex){

            response = "Error: " + ex; 

        }

        messageArea.append(response + "\n");

        dataField.setText("");


    }

}



@Override
public void keyReleased(KeyEvent e) {
    // TODO Auto-generated method stub

}

}



Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..