An EOFException is thrown in a listener thread when trying to read the incoming stream from the server (in the string String entry=ois.readUTF(); )

Server:

 package server2; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; public class Server2 { static ArrayList <SimpleServer> servers = new ArrayList <SimpleServer>(); Socket client; public static void main(String[] args) { new Server2().go(); } public void go () { try { ServerSocket server = new ServerSocket(3333); System.out.println("connection accepted"); System.out.println("DataInputStream and DataOutputStream created"); while (!server.isClosed()) { System.out.println("Server reading from channel"); client = server.accept(); SimpleServer s = new SimpleServer(client); servers.add(s); s.start(); System.out.println("Connection accepted."); } } catch (Exception e) { e.printStackTrace(); } } private class SimpleServer extends Thread { private Socket client; private String name; private boolean fl; private DataOutputStream out; private DataInputStream in; public SimpleServer (Socket client) { this.client=client; } private void writeToAll (ArrayList <SimpleServer> serversList, String smth) throws IOException { for (SimpleServer sr : serversList) { sr.out.writeUTF(smth); sr.out.flush(); } } @Override public synchronized void run() { try { out = new DataOutputStream (client.getOutputStream()); in = new DataInputStream (client.getInputStream()); while (true) { //спрашиваем имя клиента 1 раз while (fl==false) { out.writeUTF("write your name"); name=in.readUTF(); writeToAll(servers, name+" came to chat"); out.writeUTF("Welcome to chat "+name+"\n"); System.out.println(name+" came to chat"); fl=true; } String entry=in.readUTF(); writeToAll(servers, name+": "+entry); System.out.println(name+": "+entry); if (entry.equalsIgnoreCase("exit")) { System.out.println("client write EXIT - client disconnectred"); System.out.println("closing connection and channel"); System.out.println("closing connection and channel done"); break; } } in.close(); out.flush(); out.close(); client.close(); this.interrupt(); } catch (Exception e) { e.printStackTrace(); } finally { try { in.close(); out.flush(); out.close(); } catch (Exception e) {} } } } } 

Customer:

 package client; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.ScrollPaneLayout; import javax.swing.SwingUtilities; import javax.swing.border.Border; import javax.swing.border.TitledBorder; public class Client extends JFrame { String name; Socket socket; BufferedReader br; DataOutputStream oos; DataInputStream ois; String in; String outMessage; JFrame mainFrame; JPanel pan; JTextArea area; JScrollPane scrollPane; JTextField message; JButton button; public Client () { mainFrame = new JFrame ("Client v1.0"); pan = new JPanel(); area = new JTextArea(); scrollPane = new JScrollPane (area, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); message = new JTextField(10); button = new JButton ("Send"); } public static void main (String [] args) { new Client().clientwork(); } public void clientwork () { try { socket = new Socket ("localhost", 3333); oos = new DataOutputStream (socket.getOutputStream()); ois = new DataInputStream (socket.getInputStream()); SwingUtilities.invokeLater( ()-> { this.makeFrame(); this.setTextArea("You connect to socket \n"); this.setTextArea("Your's DataInputStream and DataOutputStream are initialized \n"); }); //Запуск потока-слушателя new Thread (new ClientReader()).start(); } catch (Exception e) {e.printStackTrace();} } public synchronized void setTextArea (String text) { area.append(text); } public void makeFrame () { mainFrame.setSize(300, 400); mainFrame.setResizable(false); mainFrame.setVisible(true); mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); mainFrame.add(pan); Border br = BorderFactory.createLineBorder(Color.BLACK, 1); Border br1 = BorderFactory.createTitledBorder(br, "chat window", TitledBorder.CENTER, TitledBorder.ABOVE_TOP ); area.setEditable(false); area.setLineWrap(true); area.setMaximumSize(scrollPane.getMaximumSize()); area.setAlignmentX(Component.CENTER_ALIGNMENT); area.setLineWrap(true); area.setWrapStyleWord(true); message.setMaximumSize(new Dimension(280, 30)); message.setAlignmentX(Component.CENTER_ALIGNMENT); scrollPane.setSize(new Dimension (250,200)); scrollPane.setLayout(new ScrollPaneLayout()); scrollPane.setBorder(br1); pan.setLayout(new BoxLayout(pan, BoxLayout.PAGE_AXIS)); pan.add(Box.createVerticalStrut(10)); pan.add(message); pan.add(scrollPane); pan.add(Box.createRigidArea(new Dimension (200, 40))); pan.add(Box.createVerticalStrut(20)); pan.add(message); button.setAlignmentX(Component.CENTER_ALIGNMENT); pan.add(Box.createVerticalStrut(20)); pan.add(button); pan.add(Box.createVerticalStrut(20)); button.addActionListener(new ActionListener () { @Override public void actionPerformed(ActionEvent e) { try { outMessage=message.getText(); if (outMessage.equalsIgnoreCase("exit")) { setTextArea("client killed connection \n"); setTextArea("Closing connection and channels DONE \n"); oos.flush(); oos.close(); ois.close(); mainFrame.dispose(); socket.close(); } oos.writeUTF(outMessage); oos.flush(); message.setText(""); } catch (Exception ex) { ex.printStackTrace(); try { oos.flush(); oos.close(); ois.close(); mainFrame.dispose(); } catch (IOException exx) {exx.printStackTrace();} } } } ); } public class ClientReader implements Runnable { @Override public void run () { try { while (true) { String entry=ois.readUTF(); setTextArea(entry+"\n"); } } catch (IOException e) { e.printStackTrace(); System.err.println("Exception is here!"); } finally { try {ois.close();} catch (IOException ex) {ex.printStackTrace();} } } } } 

    1 answer 1

    Sorian, figured out. A server sends 2 threads at once:

     writeToAllUnlessThis(servers, name+" came to chat"); out.writeUTF("Welcome to chat "+name+"\n"); 

    The client does not have time to process both, helped a short time delay

     writeToAllUnlessThis(servers, name+" came to chat"); TimeUnit.MILLISECONDS.sleep(50); out.writeUTF("Welcome to chat "+name+"\n");