Я следовал руководству по созданию комнаты чата с графическим интерфейсом, которая использует многопоточность.Я хочу добавить ключевое слово, например "\ EXIT", чтобы, когда пользователь вводит его, они были отключены от чата, а в чат отправлялось сообщение о том, что пользователь ушел.Например:
Бен: Привет
Кэти: Привет
Бен : G2G
Бен : ВЫХОД
Бен покинул чат
Пока, У меня есть это:
Server.java
//ChatServer.java
import java.io.*;
import java.net.*;
import java.util.ArrayList;
import java.net.Socket;
public class ChatServer {
static ArrayList<String> userNames = new ArrayList<String>();
static ArrayList<PrintWriter> printWriters = new ArrayList<PrintWriter>();
public static void main(String[] args) throws Exception{
System.out.println("Press 1 for Console or 2 for GUI");
System.out.println("Waiting for clients...");
ServerSocket ss = new ServerSocket(14001);
while (true){
Socket soc = ss.accept();
System.out.println("Connection established");
ConversationHandler handler = new ConversationHandler(soc);
handler.start();
}
}
}
class ConversationHandler extends Thread
{
Socket socket;
BufferedReader in;
PrintWriter out;
String name;
PrintWriter pw;
static FileWriter fw;
static BufferedWriter bw;
public ConversationHandler(Socket socket) throws IOException {
this.socket = socket;
fw = new FileWriter("C:\\Users\\Abhay\\Desktop\\ChatServer-Logs.txt",true);
bw = new BufferedWriter(fw);
pw = new PrintWriter(bw,true);
}
public void run() {
try {
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(), true);
int count = 0;
while (true){
if(count > 0){
out.println("NAMEALREADYEXISTS");
}
else{
out.println("NAMEREQUIRED");
}
name = in.readLine();
if (name == null){
return;
}
if (!ChatServer.userNames.contains(name)){
ChatServer.userNames.add(name);
break;
}
count++;
}
out.println("NAMEACCEPTED"+name);
ChatServer.printWriters.add(out);
while (true){
String message = in.readLine();
if (message.equals("EXIT")) {
pw.println(name + " has disconnected from the chat");
System.out.println(name + " has disconnected from the chat");
ChatServer.userNames.remove(name);
}
pw.println(name + ": " + message);
for (PrintWriter writer : ChatServer.printWriters) {
writer.println(name + ": " + message);
}
}
}
catch (Exception e){
System.out.println(e);
}
}
}
Client.Java
//ChatClient.java
import javax.swing.*;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.Socket;
public class ChatClient {
static JFrame chatWindow = new JFrame("Chat Application");
static JTextArea chatArea = new JTextArea(22, 40);
static JTextField textField = new JTextField(40);
static JLabel blankLabel = new JLabel(" ");
static JButton sendButton = new JButton("Send");
static BufferedReader in;
static PrintWriter out;
static JLabel nameLabel = new JLabel(" ");
ChatClient() {
chatWindow.setLayout(new FlowLayout());
chatWindow.add(nameLabel);
chatWindow.add(new JScrollPane(chatArea));
chatWindow.add(blankLabel);
chatWindow.add(textField);
chatWindow.add(sendButton);
chatWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
chatWindow.setSize(475, 500);
chatWindow.setVisible(true);
textField.setEditable(false);
chatArea.setEditable(false);
sendButton.addActionListener(new Listener());
textField.addActionListener(new Listener());
}
void startChat() throws Exception {
String ipAddress = JOptionPane.showInputDialog(
chatWindow,
"Enter IP Address:",
"IP Address is Required!",
JOptionPane.PLAIN_MESSAGE);
Socket soc = new Socket(ipAddress, 14001);
in = new BufferedReader(new InputStreamReader(soc.getInputStream()));
out = new PrintWriter(soc.getOutputStream(), true);
while (true){
String str = in.readLine();
if (str.equals("NAMEREQUIRED")){
String name = JOptionPane.showInputDialog(
chatWindow,
"Enter a unique name:",
"Name Required!!",
JOptionPane.PLAIN_MESSAGE);
out.println(name);
}
else if(str.equals("NAMEALREADYEXISTS")){
String name = JOptionPane.showInputDialog(
chatWindow,
"Enter another name:",
"Name Already Exits!!",
JOptionPane.WARNING_MESSAGE);
out.println(name);
}
else if (str.startsWith("NAMEACCEPTED")){
textField.setEditable(true);
nameLabel.setText("You are logged in as: "+str.substring(12));
}
else{
chatArea.append(str + "\n");
}
}
}
public static void main(String[] args) throws Exception {
ChatClient client = new ChatClient();
client.startChat();
}
}
class Listener implements ActionListener
{
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
ChatClient.out.println(ChatClient.textField.getText());
ChatClient.textField.setText("");
}
}
Как вы можетевидите, в Server.java я использовал этот оператор IF.
if (message.equals("EXIT")) {
pw.println(name + " has disconnected from the chat");
System.out.println(name + " has disconnected from the chat");
ChatServer.userNames.remove(name);
}
Однако, когда я запускаю программу, пользователь не удаляется из чата.Цени любые советы!