Невозможно выйти из многопоточного чата Java - PullRequest
0 голосов
/ 24 июня 2019

Я следовал руководству по созданию комнаты чата с графическим интерфейсом, которая использует многопоточность.Я хочу добавить ключевое слово, например "\ 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);
        }

Однако, когда я запускаю программу, пользователь не удаляется из чата.Цени любые советы!

1 Ответ

1 голос
/ 24 июня 2019

Это не печать в GUI, потому что вы печатаете с неправильным PrintWriter

out - это то, что печатает в GUI pw печатает в файл / консоль из того, что я вижу.

Попробуйте также

out.println(name + " has disconnected from the chat");

, чтобы выйти из чата и закрыть чат, необходимо закрыть сокетное соединение со стороны сервера с помощью try{..} catch{..} finally{..} для входного потока, выходного потока и сокета, которые затем можно обнаружить на стороне клиента и закрыть клиентский графический интерфейс.

...