Programuję prosty wielozwójny system czatu klienta / serwera. Wymagania dotyczące projektu Określ: "Połączenie zdarza się tylko po kliknięciu przycisku Connect. Przycisk rozłączy powinien odłączyć połączenie Ramka. "Zasadniczo mam zaczep przycisku Connect-up i działa Proszę o pomoc, jest to mój pierwszy projekt programowania gniazda i jestem super zakłopotany na tym! Dziękuje wszystkim.

Klient:

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.util.ArrayList;

public class ClientFrame extends Frame {

    public ClientFrame() {
        setSize(500, 500);
        setTitle("Chat Client");
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent We) {
                System.exit(0);
            }
        });
        add(new ClientPanel(), BorderLayout.CENTER);
        setVisible(true);
    }

    public static void main(String[] args) {
        new ClientFrame();
    }

} // end ClientFrame

class ClientPanel extends Panel implements ActionListener, Runnable {

    TextField tf;
    TextArea ta;
    List list;
    Button connect, disconnect;
    Socket socketToServer;
    PrintWriter pw;
    BufferedReader br;
    Thread t;
    String userName;

    public ClientPanel() {
        setLayout(new BorderLayout());
        tf = new TextField();
        ta = new TextArea();
        list = new List();
        connect = new Button("Connect");
        disconnect = new Button("Disconnect");
        Panel bPanel = new Panel();
        bPanel.add(connect);
        disconnect.setEnabled(false);
        bPanel.add(disconnect);

        tf.addActionListener(this);
        add(tf, BorderLayout.NORTH);
        add(ta, BorderLayout.CENTER);
        add(list, BorderLayout.EAST);
        add(bPanel, BorderLayout.SOUTH);

        connect.addActionListener(this);
        disconnect.addActionListener(this);

    } // end ClientPanel constructor

    public void actionPerformed(ActionEvent ae) {
        if (ae.getSource() == tf) {
            System.out.println(tf + " " + tf.getText());
            String temp = tf.getText();

            pw.println(userName + ": " + temp);
            tf.setText("");
        } else if (ae.getSource() == connect) {
            if (tf.getText() == null || tf.getText().equals("")) {
                ta.append("Must enter a name to connect\n");
            } else {
                userName = tf.getText();
                connect.setEnabled(false);
                disconnect.setEnabled(true);
                tf.setText("");
                try {
                    socketToServer = new Socket("127.0.0.1", 3000);
                    pw = new PrintWriter(new OutputStreamWriter(socketToServer.getOutputStream()), true);
                    br = new BufferedReader(new InputStreamReader(socketToServer.getInputStream()));
                } catch (UnknownHostException uhe) {
                    System.out.println(uhe.getMessage());
                } catch (IOException ioe) {
                    System.out.println(ioe.getMessage());
                }
            }

            t = new Thread(this);
            t.start();
            pw.println(userName);
            pw.println(userName + " has entered the chat.");
        } else if (ae.getSource() == disconnect) {
               connect.setEnabled(true);
                disconnect.setEnabled(false);
            try {
                tf.setText("");
                try {
                    socketToServer = new Socket("127.0.0.1", 3000);
                    pw = new PrintWriter(new OutputStreamWriter(socketToServer.getOutputStream()), true);
                    br = new BufferedReader(new InputStreamReader(socketToServer.getInputStream()));
                } catch (UnknownHostException uhe) {
                    System.out.println(uhe.getMessage());
                } catch (IOException ioe) {
                    System.out.println(ioe.getMessage());
                }

                t = new Thread(this);
                t.start();
                pw.println(userName);
                pw.println(userName + " has Disconnected the chat.");
             
                t.interrupt();
                socketToServer.close();
            } catch (IOException ioe) {
                System.out.println(ioe.getMessage());
            }
        }
    } // end actionPerformed

    public void run() {
        try {
            for (;;) {
                try {
                    String temp = br.readLine();
                    ta.append(temp + "\n");

                } catch (IOException ioe) {
                    System.out.println(ioe.getMessage());

                }
                Thread.sleep(10);
            }
        } catch (InterruptedException e) {
            pw.println("Disconnected.");
        }
    } // end run

} // end ClientPanel

Serwer:

import java.io.*;
import java.net.*;
import java.util.ArrayList;
import java.awt.*;

public class ThreadedServerWithPresence {

    public static void main(String[] args) {
        ArrayList<ThreadedHandlerWithPresence> handlers;
        try {
            handlers = new ArrayList<ThreadedHandlerWithPresence>();
            ServerSocket s = new ServerSocket(3000);
            for (;;) {
                Socket incoming = s.accept();
                new ThreadedHandlerWithPresence(incoming,
                        handlers).start();

            }
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

class ThreadedHandlerWithPresence extends Thread {

    Socket incoming;
    ArrayList<ThreadedHandlerWithPresence> handlers;
    PrintWriter pw;
    BufferedReader br;
    String userName;

    public ThreadedHandlerWithPresence(Socket i,
            ArrayList<ThreadedHandlerWithPresence> handlers) {
        incoming = i;
        this.handlers = handlers;
        handlers.add(this);
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserName() {
        return userName;
    }

    public void run() {
        try {
            br = new BufferedReader(new InputStreamReader(incoming.getInputStream()));

            pw = new PrintWriter(new OutputStreamWriter(incoming.getOutputStream()), true);

            String firstLine = br.readLine();
            setUserName(firstLine);

            for (;;) {

                String temp = br.readLine();
                if (temp == null) {
                    break;
                }
                System.out.println("Message read: " + temp);

                for (int i = 0; i < handlers.size(); i++) {
                    handlers.get(i).pw.println(temp);
                }
            }
        } catch (Exception e) {
            System.out.println(e);
        } finally {
            handlers.remove(this);
        }
    }
}
0
Josh 27 lipiec 2020, 13:23

1 odpowiedź

Najlepsza odpowiedź

To proste. Jeśli masz swoją klasę rozszerzoną na ramkę, możesz po prostu przejść klasę klientami do klientPanel w ten sposób:

add(new ClientPanel(this), BorderLayout.CENTER);

W konstruktorze klientpanle możesz zrobić coś takiego:

JFrame clientFrame;

public ClientPanel(JFrame clientFrame) {
this.clientFrame=clientFrame;

Wreszcie zadzwonisz do żądanej metody:

clientFrame.setTitle(userName);
0
Attila jáger 28 lipiec 2020, 12:06