!他咋就被定义了呢
服务端:
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?