Ядро Java swingWorker работает, но не получено или передано сообщение
Несколько дней назад я попытался создать сервер – клиент или клиентский сервер в качестве эксперимента, чтобы узнать о сокете, используя stream, но затем мне сказали, что я должен использовать swingWorker. Я сделал некоторые исследования, как использовать и реализовал его как практику, но он все еще не работает. stream swingWorker не похож, что он работает, даже если я получаю соединение и использовал .excute (). Если вы, ребята, можете помочь определить, где я делаю неправильно, это будет здорово. Класс SwingWorker находится в методе startSever () и startClient ().
private void startServer() { SwingWorker runningServer = new SwingWorker(){ protected Void doInBackground() { try { listeningSocket = new ServerSocket(port); System.out.println("waiting for connection"); connection = listeningSocket.accept(); connected = true; System.out.println("Connected"); String incomeMessage =null; while(connected){ inStream = connection.getInputStream(); inDataStream = new DataInputStream(inStream); if (myMessage !=null){ outStream = connection.getOutputStream(); outDataStream = new DataOutputStream(outStream); outDataStream.writeUTF(myMessage); } if((incomeMessage = inDataStream.readUTF())!=null){ clientMessage = incomeMessage; publish(clientMessage); incomeMessage =null; } } } catch (IOException e) { clientMessage = "Connection Lost"; } return null; } runningServer.execute(); }
- Как использовать SwingWorker?
- SwingWorker в Java
- Остановить / отменить stream SwingWorker?
- Невозможно обновить JProgressBar из classа SwingWorker
- Как обмениваться данными с двумя (2) classами SwingWorker в Java
- MVC Progress Bar Threading
- Несколько графиков на нескольких фигурах с использованием jFreeChart
- SwingWorker, done () выполняется до завершения вызовов ()
- JButton ActionListener - обновление GUI только после нажатия JButton
- Проблемы с SwingWorker и JProgressBar
- Как заставить пример SwingWorker работать правильно?
- SwingWorker не обновляет JProgressBar без Thread.sleep () в пользовательской диалоговой панели
- SwingWorker не отвечает
Вот ОЧЕНЬ простой пример.
В основном, поскольку для программы требуется асинхронная связь (т. Е. Вы должны иметь возможность читать из сокета и писать одновременно), вам необходимо разгрузить каждый stream в отдельный stream.
Процесс управления в этом примере, ну, не существует. Реально, у вас должен быть какой-то менеджер «соединений», который мог бы чисто закрыть выходные и входные streamи, чтобы, например, когда пользователь вводил «bye», выходной stream мог бы сообщить диспетчеру соединений, что соединение должно быть прекращено. Затем он сообщит, что входной stream перестает читать любое новое сообщение и заканчивается …
клиент
public class Client { public static void main(String[] args) { try { Socket master = new Socket("localhost", 8900); new Thread(new InputHandler(master)).start(); new Thread(new OuputHandler(master)).start(); } catch (Exception ex) { ex.printStackTrace(); } } public static class InputHandler implements Runnable { private Socket socket; public InputHandler(Socket socket) { this.socket = socket; } @Override public void run() { boolean commune = true; BufferedReader reader = null; try { reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); while (commune) { String text = reader.readLine(); System.out.println("\n " + text); if (text.toLowerCase().equals("bye")) { commune = false; } } } catch (Exception exp) { exp.printStackTrace(); } finally { try { reader.close(); } catch (Exception e) { } try { socket.close(); } catch (Exception e) { } } } } public static class OuputHandler implements Runnable { private Socket socket; public OuputHandler(Socket socket) { this.socket = socket; } @Override public void run() { boolean commune = true; BufferedWriter writer = null; try { writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); Scanner scanner = new Scanner(System.in); while (commune) { System.out.print("> "); String text = scanner.nextLine(); writer.write(text); writer.newLine(); writer.flush(); if (text.equalsIgnoreCase("bye")) { commune = false; } } } catch (Exception exp) { exp.printStackTrace(); } finally { try { writer.close(); } catch (Exception e) { } try { socket.close(); } catch (Exception e) { } } } } }
сервер
public class Server { public static void main(String[] args) { try { ServerSocket master = new ServerSocket(8900); Socket socket = master.accept(); new Thread(new InputHandler(socket)).start(); new Thread(new OuputHandler(socket)).start(); } catch (Exception ex) { ex.printStackTrace(); } } public static class InputHandler implements Runnable { private Socket socket; public InputHandler(Socket socket) { this.socket = socket; } @Override public void run() { boolean commune = true; BufferedReader reader = null; try { reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); while (commune) { String text = reader.readLine(); System.out.println("\n " + text); if (text.toLowerCase().equals("bye")) { commune = false; } } } catch (Exception exp) { exp.printStackTrace(); } finally { try { reader.close(); } catch (Exception e) { } try { socket.close(); } catch (Exception e) { } } } } public static class OuputHandler implements Runnable { private Socket socket; public OuputHandler(Socket socket) { this.socket = socket; } @Override public void run() { boolean commune = true; BufferedWriter writer = null; try { writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); Scanner scanner = new Scanner(System.in); while (commune) { System.out.print("> "); String text = scanner.next(); writer.write(text); writer.newLine(); writer.flush(); if (text.equalsIgnoreCase("bye")) { commune = false; } } } catch (Exception exp) { exp.printStackTrace(); } finally { try { writer.close(); } catch (Exception e) { } try { socket.close(); } catch (Exception e) { } } } } }
Обновление (скулить)
Хотя у меня есть исходный код передо мной …
Там очень, очень редко возникает необходимость делать textMessage.addKeyListener(this)
Поскольку вы используете JTextField
, вместо этого вы должны использовать ActionListener
. Для этого есть ряд важных причин, но для вас главным является тот факт, что действие «принять» – это «Look and Feel». Хотя большинство систем действительно используют « Ввод», поскольку «принимают» действие, это не гарантия.
Посмотрите, как написать прослушиватель действий для получения дополнительной информации.
Учитывая общую сложность того, что вы пытаетесь сделать, +1 для общей хорошей попытки!
В этом примере следующие изменения работают с одним клиентом telnet.
private PrintWriter out; ... public void keyPressed(KeyEvent e) { if (e.getKeyChar() == KeyEvent.VK_ENTER) { myMessage = friendLabel + textMessage.getText(); if (out != null) { out.println(myMessage); } ... } ... protected Void doInBackground() { try { listeningSocket = new ServerSocket(port); System.out.println("Waiting for connection"); connection = listeningSocket.accept(); connected = true; System.out.println("Connected"); Scanner in = new Scanner(connection.getInputStream()); out = new PrintWriter(connection.getOutputStream(), true); publish("Connected"); while (true) { publish(in.nextLine()); } } catch (IOException e) { clientMessage = "Connection Lost"; try { connection.close(); System.out.println("Closed"); } catch (IOException e1) { e1.printStackTrace(); connected = false; } } return null; }
Я вижу, что ваш порт сервера – 8900, а ваш порт – 8900. Я не уверен, имеет ли значение, работает ли сервер и клиент на одном компьютере …