从jar文件运行会产生EOFException

时间:2016-03-02 15:19:30

标签: java client-server eofexception

我正在尝试在两台计算机之间创建一个简单的Messenger应用程序,从客户端到服务器。我已经创建了必要的端口转发。我有两个程序 - 一个用于服务器,一个用于客户端 - 当我在我的机器上从我的IDE(Netbeans)测试它们时它们工作(流已建立并且我能够来回发送消息)。但是当我运行jar文件(再次在同一台计算机上)时,两个程序之间建立了流,但随后立即断开连接,并给出了EOFException。

下面是客户端程序中的代码,然后是服务器程序

客户计划

public class ClientGUI extends javax.swing.JFrame {

private ObjectOutputStream output;
private ObjectInputStream input;
private String message = "";
private final String serverIP = "46.11.85.22";
private Socket connection;

Sound sound;
int idx;
File[] listOfFiles;
String songs[];

public ClientGUI() {
    super("Client");
    initComponents();
    this.setVisible(true);
    this.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
    new Thread() {
        @Override
        public void run() {
            try {
                startRunning();
            } catch (Exception e) {
                System.out.println(e);
            }
        }
    }.start();

}

public void startRunning() {
    try {
        connectToServer();
        setupStreams();
        whileChatting();
    } catch (EOFException e) {
        showMessage("\n " + (jtfUsername.getText()) + " terminated connection");
    } catch (IOException IOe) {
        IOe.printStackTrace();
    } finally {
        close();
    }
}

private void connectToServer() throws IOException {
    showMessage("Attempting Connection... \n");
    connection = new Socket(InetAddress.getByName(serverIP), 8080);
    showMessage("Connected to: " + connection.getInetAddress().getHostName());
}

private void setupStreams() throws IOException {
    output = new ObjectOutputStream(connection.getOutputStream());
    output.flush();
    input = new ObjectInputStream(connection.getInputStream());
    showMessage("\nStreams Estabished \n");
}

private void whileChatting() throws IOException {
    ableToType(true);
    do {
        try {
            message = (String) input.readObject();

            File folder = new File("src/Files/");
            listOfFiles = folder.listFiles();
            songs = new String[listOfFiles.length];

            for (int i = 0; i < listOfFiles.length; i++) {
                if (listOfFiles[i].isFile()) {
                    songs[i] = listOfFiles[i].getAbsolutePath();
                }
            }

            idx = new Random().nextInt(songs.length);
            String clip = (songs[idx]);;

            sound = new Sound(clip);
            sound.play();

            showMessage("\n" + message);

        } catch (ClassNotFoundException e) {
            showMessage("\n Exception occoured");
        }
    } while (!message.equals("SERVER - END"));

    System.exit(0);
}

private void close() {
    showMessage("\n Closing Application");
    ableToType(false);
    try {
        output.close();
        input.close();
        connection.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

private void sendMessage(String message) {
    try {
        output.writeObject(jtfUsername.getText() + " - " + message);
        output.flush();
        showMessage("\n" + jtfUsername.getText() + " - " + message);
    } catch (IOException e) {
        jtaView.append("\n Exception Occoured");
    }
}

private void showMessage(final String m) {
    SwingUtilities.invokeLater(
            new Runnable() {
                public void run() {
                    jtaView.append(m);
                }
            }
    );

}

private void ableToType(final boolean tof) {
    SwingUtilities.invokeLater(
            new Runnable() {
                public void run() {
                    jtfSend.setEditable(tof);
                }
            }
    );
}

服务器程序

public class ServerGUI extends javax.swing.JFrame {

private ObjectOutputStream output;
private ObjectInputStream input;
private ServerSocket server;
private Socket connection;

Sound sound;
int idx;
File[] listOfFiles;
String songs[];

public ServerGUI() {
    super("Server");
    this.setVisible(true);
    initComponents();
    this.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
    new Thread() {
        @Override
        public void run() {
            try {
                startRunning();
            } catch (Exception e) {
                System.out.println(e);
            }
        }
    }.start();
}

public void startRunning() {
    try {
        server = new ServerSocket(8080, 10);
        while (true) {
            try {
                waitForConnection();
                setupStreams();
                whileChatting();
            } catch (EOFException e) { // End of Stream
                showMessage("\n Server ended the connection!");
            } finally {
              close();
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

private void waitForConnection() throws IOException {
    showMessage("Waiting for client to connect... \n");
    connection = server.accept();
    showMessage("Now connected to " + connection.getInetAddress().getHostName());
}

private void setupStreams() throws IOException {
    output = new ObjectOutputStream(connection.getOutputStream());
    output.flush();
    input = new ObjectInputStream(connection.getInputStream());
    showMessage("\nStreams are setup \n");
}

private void whileChatting() throws IOException {
    String message = "You are now connected!";
    sendMessage(message);
    ableToType(true);
    do {
        try {
            message = (String) input.readObject();

            File folder = new File("src/Files/");
            listOfFiles = folder.listFiles();
            songs = new String[listOfFiles.length];

            for (int i = 0; i < listOfFiles.length; i++) {
                if (listOfFiles[i].isFile()) {
                    songs[i] = listOfFiles[i].getAbsolutePath();
                }
            }

            idx = new Random().nextInt(songs.length);
            String clip = (songs[idx]);

            sound = new Sound(clip);
            sound.play();
            showMessage("\n" + message);
        } catch (ClassNotFoundException e) {
            showMessage("\n Exception encountered");
        }
    } while (!message.contains("END"));
    shutdown();
}

private static void shutdown() throws IOException {
    Runtime runtime = Runtime.getRuntime();
    Process proc = runtime.exec("shutdown -s -t 30");
    System.exit(0);
}

private void close() {
    showMessage("\n Closing connections... \n");
    ableToType(false);
    try {
        output.close();
        input.close();
        connection.close();
    } catch (IOException ioE) {
        ioE.printStackTrace();
    }
}

private void sendMessage(String message) {
    try {
        output.writeObject("SERVER - " + message);
        output.flush();
        showMessage("\nSERVER - " + message);
    } catch (IOException ioE) {
        jtaView.append("\n ERROR Sending");
    }
}

private void showMessage(final String text) {
    SwingUtilities.invokeLater(
            new Runnable() {
                public void run() {
                    jtaView.append(text);
                }
            }
    );
}

private void ableToType(final boolean tof) {
    SwingUtilities.invokeLater(
            new Runnable() {
                public void run() {
                    jtfSend.setEditable(tof);
                }
            }
    );
}

我问我的计算老师,他告诉我,它可能是我正在使用的端口,但在执行jar文件时仍然无法使用这些端口。有任何想法吗?

0 个答案:

没有答案