Многопоточность в java (swing)

182
16 января 2018, 12:41

У меня есть серверная и клиентская часть. С сервера я отправляю данные клиентам. Проблема в том, что клиенты по очереди получают данные (пока не завершится первый поток, второй не начнёт работу). Как мне сделать одновременную (параллельную) работу клиентов с сервером? Что именно исправить в коде?

Код Сервера:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Server extends JFrame {
    private JPanel panel1;
    private JTextField textField1;
    private JButton отправитьButton;
    private JTextArea textArea1;
    public Server() {
        отправитьButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                Thread t = new Thread(new Runnable(){
                    @Override
                    public void run() {
                        final int PORT = 2535;
                        try {
                            ServerSocket chatSocket = new ServerSocket(PORT);
                            while (true) {
                                Socket acceptchat = chatSocket.accept();
                                PrintStream printStream = new PrintStream(acceptchat.getOutputStream());
                                printStream.println(textField1.getText());
                                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(acceptchat.getInputStream()));
                                String text = bufferedReader.readLine();
                                textArea1.setText(textArea1.getText() + "\n" + text);
                            }
                        } catch (Exception x) {
                            x.printStackTrace();
                        }
                    }
                });
                t.start();
            }
        });
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame("Server");
                frame.setContentPane(new Server().panel1);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setPreferredSize(new Dimension(500, 200));
                frame.pack();
                frame.setVisible(true);
            }
        });
    }
}

Код Клиента:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
public class Client extends JFrame {
    private JPanel panel1;
    private JTextField textField1;
    private JButton подключитьсяButton;
    Socket socket = null;
    public Client() {
        подключитьсяButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                Thread thread = new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            if (подключитьсяButton.getText().equals("Подключиться")) {
                                socket = new Socket("localhost", 2535);
                                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                                try {
                                    String text = bufferedReader.readLine();
                                    textField1.setText(text);
                                    подключитьсяButton.setText("Отправить сообщение");
                                } catch (IOException e1) {
                                    e1.printStackTrace();
                                }
                            } else if (подключитьсяButton.getText().equals("Отправить сообщение")) {
                                PrintStream printStream = new PrintStream(socket.getOutputStream());
                                printStream.println("Cообщение было доставлено!");
                            }
                        } catch (IOException e1) {
                            e1.printStackTrace();
                        }
                    }
                });
                thread.start();
            }
        });
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame("Client");
                frame.setContentPane(new Client().panel1);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setPreferredSize(new Dimension(500, 200));
                frame.pack();
                frame.setVisible(true);
            }
        });
    }
}
Answer 1

Классическое решение. Создать один поток "слушатель", который будет определять подключился ли очередной клиент к серверу и после подключения передавать работу с клиентом другому, специально созданному для этого, потоку "обработчику".

Так как поток "обработчик" создаётся динамически для каждого клиента, таких потоков может быть произвольное количество в пределах возможностей аппаратной части сервера.

Разумеется, что после отключения клиента, его поток "обработчик" необходимо завершить.

READ ALSO
Jasperstudio задать имена отчетов

Jasperstudio задать имена отчетов

В JasperStudio выводится отчет, таких отчетов набирается множество, они объединяются в приложении в один файл пдфЕсли просматривать во вьюверах...

147
Не выполняется условие if, хотя else выполняется

Не выполняется условие if, хотя else выполняется

Почему-то не выводит сообщение о том, что книга взята и не удаляет её из списка доступных книг, хотя условие else выполняется и выводит, что книги...

172
Загрузить изображение с ImageView на public_html

Загрузить изображение с ImageView на public_html

Мне нужно с ImageView загрузить изображение в хостинг, в одну из папок public_htmlКак можно, задав bitmap с ImageView и путь на ftp, загрузить изображение?

166
Как делается такая(как на гифке) анимация в Android?

Как делается такая(как на гифке) анимация в Android?

Здравствуйте, подскажите куда смотреть\что читать, чтобы сделать такую анимацию перехода Активити в View элемент

170