У меня есть серверная и клиентская часть. С сервера я отправляю данные клиентам. Проблема в том, что клиенты по очереди получают данные (пока не завершится первый поток, второй не начнёт работу). Как мне сделать одновременную (параллельную) работу клиентов с сервером? Что именно исправить в коде?
Код Сервера:
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);
}
});
}
}
Классическое решение. Создать один поток "слушатель", который будет определять подключился ли очередной клиент к серверу и после подключения передавать работу с клиентом другому, специально созданному для этого, потоку "обработчику".
Так как поток "обработчик" создаётся динамически для каждого клиента, таких потоков может быть произвольное количество в пределах возможностей аппаратной части сервера.
Разумеется, что после отключения клиента, его поток "обработчик" необходимо завершить.
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
В JasperStudio выводится отчет, таких отчетов набирается множество, они объединяются в приложении в один файл пдфЕсли просматривать во вьюверах...
Почему-то не выводит сообщение о том, что книга взята и не удаляет её из списка доступных книг, хотя условие else выполняется и выводит, что книги...
Мне нужно с ImageView загрузить изображение в хостинг, в одну из папок public_htmlКак можно, задав bitmap с ImageView и путь на ftp, загрузить изображение?
Здравствуйте, подскажите куда смотреть\что читать, чтобы сделать такую анимацию перехода Активити в View элемент