关于#java#网络聊天室

!他咋就被定义了呢

img

img


在做java的网络聊天室项目,客户端这两行代码报错

img

img

服务端:
import java.io.*;
import java.net.*;
import java.util.*;

public class Server {
    private static ArrayList<Socket> clients = new ArrayList<>();
    private static ArrayList<String> usernames = new ArrayList<>();

    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8888);
        System.out.println("Server started.");

        while (true) {
            Socket clientSocket = serverSocket.accept();
            clients.add(clientSocket);
            System.out.println("Client connected from " + clientSocket.getInetAddress().getHostAddress());

            Thread t = new Thread(new ClientHandler(clientSocket));
            t.start();
        }
    }

    private static class ClientHandler implements Runnable {
        private Socket clientSocket;
        private BufferedReader in;
        private PrintWriter out;
        private String username;

        public ClientHandler(Socket socket) {
            this.clientSocket = socket;
        }

        public void run() {
            try {
                in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                out = new PrintWriter(clientSocket.getOutputStream(), true);

                while (true) {
                    out.println("SUBMITNAME");
                    username = in.readLine();
                    if (username == null) {
                        return;
                    }
                    synchronized (usernames) {
                        if (!usernames.contains(username)) {
                            usernames.add(username);
                            break;
                        }
                    }
                }

                out.println("NAMEACCEPTED");
                clients.forEach(socket -> {
                    try {
                        PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
                        writer.println("USERLIST " + String.join(",", usernames));
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                });

                while (true) {
                    String input = in.readLine();
                    if (input == null) {
                        return;
                    }
                    if (input.startsWith("PRIVATE")) {
                        String[] parts = input.split(" ", 3);
                        String recipient = parts[1];
                        String message = parts[2];
                        clients.forEach(socket -> {
                            if (socket != clientSocket && usernames.get(clients.indexOf(socket)).equals(recipient)) {
                                try {
                                    PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
                                    writer.println("PRIVATE " + username + " " + message);
                                } catch (IOException e) {
                                    e.printStackTrace();
                                }
                            }
                        });
                    } else if (input.startsWith("FILE")) {
                        String[] parts = input.split(" ", 3);
                        String recipient = parts[1];
                        String filename = parts[2];
                        clients.forEach(socket -> {
                            if (socket != clientSocket && usernames.get(clients.indexOf(socket)).equals(recipient)) {
                                try {
                                    PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
                                    writer.println("FILE " + username + " " + filename);
                                } catch (IOException e) {
                                    e.printStackTrace();
                                }
                            }
                        });
                    } else {
                        clients.forEach(socket -> {
                            try {
                                PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
                                writer.println("MESSAGE " + username + ": " + input);
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        });
                    }
                }
            } catch (IOException e) {
                System.out.println("Error in client handler: " + e.getMessage());
            } finally {
                if (username != null) {
                    usernames.remove(username);
                }
                if (out != null) {
                    clients.remove(clientSocket);
                }
                try {
                    clientSocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

客户端:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.util.*;

public class Client {
    private static String username;
    private static ArrayList<String> users = new ArrayList<>();
    private static JFrame frame = new JFrame("Chat");
    private static JPanel panel = new JPanel();
    private static JTextArea messageArea = new JTextArea(20, 50);
    private static JTextField messageField = new JTextField(50);
    private static JComboBox<String> userBox = new JComboBox<>();
    private static JButton sendButton = new JButton("Send");
    private static JButton fileButton = new JButton("Send File");
    private static Socket socket;
    private static BufferedReader in;
    private static PrintWriter out;

    public static void main(String[] args) throws IOException {
        String serverAddress = JOptionPane.showInputDialog(frame, "Enter IP address of the server:");
        socket = new Socket(serverAddress, 8888);
        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        out = new PrintWriter(socket.getOutputStream(), true);

        while (true) {
            String line = in.readLine();
            if (line.startsWith("SUBMITNAME")) {
                username = JOptionPane.showInputDialog(frame, "Choose a username:");
                if (username != null) {
                    out.println(username);
                }
            } else if (line.startsWith("NAMEACCEPTED")) {
                frame.setTitle("Chat - " + username);
                messageField.setEditable(true);
            } else if (line.startsWith("USERLIST")) {
                String[] parts = line.split(" ", 2);
                String[] usernames = parts[1].split(",");
                userBox.removeAllItems();
                for (String user : usernames) {
                    if (!user.equals(username)) {
                        userBox.addItem(user);
                        users.add(user);
                    }
                }
            } else if (line.startsWith("MESSAGE")) {
                messageArea.append(line.substring(8) + "\n");
            } else if (line.startsWith("PRIVATE")) {
                String[] parts = line.split(" ", 3);
                String sender = parts[1];
                String message = parts[2];
                messageArea.append("[Private] " + sender + ": " + message + "\n");
            } else if (line.startsWith("FILE")) {
                String[] parts = line.split(" ", 3);
                String sender = parts[1];
                String filename = parts[2];
                int response = JOptionPane.showConfirmDialog(frame, "Do you want to receive file " + filename + " from " + sender + "?");
                if (response == JOptionPane.YES_OPTION) {
                    JFileChooser fileChooser = new JFileChooser();
                    fileChooser.setSelectedFile(new File(filename));
                    int result = fileChooser.showSaveDialog(frame);
                    if (result == JFileChooser.APPROVE_OPTION) {
                        File file = fileChooser.getSelectedFile();
                        try {
                            InputStream inputStream = socket.getInputStream();
                            FileOutputStream fileOutputStream = new FileOutputStream(file);
                            byte[] buffer = new byte[1024];
                            int bytesRead;
                            while ((bytesRead = inputStream.read(buffer)) != -1) {
                                fileOutputStream.write(buffer, 0, bytesRead);
                            }
                            fileOutputStream.close();
                            JOptionPane.showMessageDialog(frame, "File " + filename + " saved successfully.");
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }

    public static void sendMessage() {
        String message = messageField.getText();
        if (message.startsWith("@")) {
            String recipient = (String) userBox.getSelectedItem();
            if (recipient == null) {
                JOptionPane.showMessageDialog(frame, "Please select a user to send a private message to.");
                return;
            }
            out.println("PRIVATE " + recipient + " " + message.substring(1));
        } else if (message.startsWith("#")) {
            String recipient = (String) userBox.getSelectedItem();
            if (recipient == null) {
                JOptionPane.showMessageDialog(frame, "Please select a user to send a file to.");
                return;
            }
            JFileChooser fileChooser = new JFileChooser();
            int result = fileChooser.showOpenDialog(frame);
            if (result == JFileChooser.APPROVE_OPTION) {
                File file = fileChooser.getSelectedFile();
                try {
                    out.println("FILE " + recipient + " " + file.getName());
                    FileInputStream fileInputStream = new FileInputStream(file);
                    OutputStream outputStream = socket.getOutputStream();
                    byte[] buffer = new byte[1024];
                    int bytesRead;
                    while ((bytesRead = fileInputStream.read(buffer)) != -1) {
                        outputStream.write(buffer, 0, bytesRead);
                    }
                    fileInputStream.close();
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        } else {
            out.println(message);
        }
        messageField.setText("");
    }

    public static void main(String[] args) {
        messageArea.setEditable(false);
        messageField.setEditable(false);
        userBox.setPreferredSize(new Dimension(150, 25));
        sendButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                sendMessage();
            }
        });
        fileButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                sendMessage();
            }
        });
        messageField.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                sendMessage();
            }
        });
        panel.add(new JScrollPane(messageArea));
        panel.add(messageField);
        panel.add(userBox);
        panel.add(sendButton);
        panel.add(fileButton);
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setVisible(true);
    }
}


这不是定义了两个main?

img

img