Сервер группового чата с использованием JDBC - PullRequest
0 голосов
/ 31 мая 2018

Я знаю, что существуют бесконечные чат-серверы, но я не могу применить решение для своего кода.Мой код работает так, что я запускаю сервер и могу подключить к этому серверу столько клиентов, сколько захочу, и все они будут общаться вместе.У меня все работает, кроме самой важной части.Я не могу заставить клиентов показывать сообщения друг другу.Я пытался использовать JDBC, но каждый раз, когда я добавляю, мне возвращают слишком много ошибок.

public class Client {

private static final String host = "localhost";
private static final int portNumber = 4466;

private String userName;
private String serverHost;
private int serverPort;
private Scanner userInputScanner;
static JButton enterButton;
public static JTextArea output;
public static JTextField input;
static JFrame frame;
static JPanel panel;
public static String testString = "test";

public static void main(String[] args){
    String readName = null;
    Scanner scan = new Scanner(System.in);
    System.out.println("Please input username:");
    while(readName == null || readName.trim().equals("")){
        readName = scan.nextLine();
        if(readName.trim().equals("")){
            System.out.println("Invalid. Please enter again:");
        }
    }

    Client client = new Client(readName, host, portNumber);
    client.startClient(scan);
}


private void startClient(Scanner scan){
    try{

        Socket socket = new Socket(serverHost, serverPort);
        Thread.sleep(1000); // waiting for network communicating.

        ServerThread serverThread = new ServerThread(socket, userName);
        Thread serverAccessThread = new Thread(serverThread);
        serverAccessThread.start();
        while(serverAccessThread.isAlive()){
            if(scan.hasNextLine()){
                serverThread.addNextMessage(scan.nextLine());
            }

        }
    }catch(IOException ex){
        System.err.println("Fatal Connection error!");
        ex.printStackTrace();
    }catch(InterruptedException ex){
        System.out.println("Interrupted");
    }
}

private Client(String userName, String host, int portNumber){
    this.userName = userName;
    this.serverHost = host;
    this.serverPort = portNumber;

}
}



public class ChatServer {

private static final int portNumber = 4466;

private int serverPort;
private List<ClientThread> clients; 

public static void main(String[] args){
    ChatServer server = new ChatServer(portNumber);
    server.startServer();
}

public ChatServer(int portNumber){
    this.serverPort = portNumber;

            }


public List<ClientThread> getClients(){
    return clients;
}

private void startServer(){
    clients = new ArrayList<ClientThread>();
    ServerSocket serverSocket = null;
    try {
        serverSocket = new ServerSocket(serverPort);
        acceptClients(serverSocket);
    } catch (IOException e){
        System.err.println("Could not listen on port: "+serverPort);
        System.exit(1);
    }
}

private void acceptClients(ServerSocket serverSocket){

    final JFrame frame = new JFrame("Server Window");
    frame.setSize(600, 400);
    frame.getContentPane().setBackground( Color.BLACK );
    //--------------------------------------//
    //Display
    JPanel display = new JPanel();
    JTextArea editArea2 = new JTextArea(22,52);
    display.add(editArea2);
    frame.add(display);
    display.setBackground(Color.BLACK);


        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);           
        frame.setLocation(2000, 100);
        frame.setBackground(Color.BLACK);
        frame.setVisible(true);

    editArea2.append("server starts port = " + serverSocket.getLocalSocketAddress() + "\n");
    while(true){
        try{
            Socket socket = serverSocket.accept();
            editArea2.append("accepts : " + socket.getRemoteSocketAddress() + "\n");
            ClientThread client = new ClientThread(this, socket);
            Thread thread = new Thread(client);
            thread.start();
            clients.add(client);
        } catch (IOException ex){
            editArea2.append("Accept failed on : "+serverPort);
        }
    }
}   

}


public class ChatServer {

private static final int portNumber = 4466;

private int serverPort;
private List<ClientThread> clients; 

public static void main(String[] args){
    ChatServer server = new ChatServer(portNumber);
    server.startServer();
}

public ChatServer(int portNumber){
    this.serverPort = portNumber;

            }


public List<ClientThread> getClients(){
    return clients;
}

private void startServer(){
    clients = new ArrayList<ClientThread>();
    ServerSocket serverSocket = null;
    try {
        serverSocket = new ServerSocket(serverPort);
        acceptClients(serverSocket);
    } catch (IOException e){
        System.err.println("Could not listen on port: "+serverPort);
        System.exit(1);
    }
}

private void acceptClients(ServerSocket serverSocket){

    final JFrame frame = new JFrame("Server Window");
    frame.setSize(600, 400);
    frame.getContentPane().setBackground( Color.BLACK );
    //--------------------------------------//
    //Display
    JPanel display = new JPanel();
    JTextArea editArea2 = new JTextArea(22,52);
    display.add(editArea2);
    frame.add(display);
    display.setBackground(Color.BLACK);


        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);           
        frame.setLocation(2000, 100);
        frame.setBackground(Color.BLACK);
        frame.setVisible(true);

    editArea2.append("server starts port = " + serverSocket.getLocalSocketAddress() + "\n");
    while(true){
        try{
            Socket socket = serverSocket.accept();
            editArea2.append("accepts : " + socket.getRemoteSocketAddress() + "\n");
            ClientThread client = new ClientThread(this, socket);
            Thread thread = new Thread(client);
            thread.start();
            clients.add(client);
        } catch (IOException ex){
            editArea2.append("Accept failed on : "+serverPort);
        }
    }
}   

}

public class ServerThread implements Runnable {
private Socket socket;
private String userName;
private final LinkedList<String> messagesToSend;
private boolean hasMessages = false;

private static String ENTER = "Enter";
static JButton enterButton;
public static JTextArea output;
public static JTextField input;
static JFrame frame;
static JPanel panel, imagePanel;
public static String testString = "test";
String userWord = "";

public JTextField text;

public BufferedReader in ;
public PrintWriter out;
public OutputStream outputStream;

public void addNextMessage(String message){
    synchronized (messagesToSend){
        hasMessages = true;
        messagesToSend.push(message);
    }
}


@Override
public void run(){
    output.append("Welcome to the chat room :" + userName + "\n");

    try{

        //This is where i am going wrong. I can't get the messages to pass the input stream correctly
        OutputStream os = socket.getOutputStream();
        PrintWriter serverOut = new PrintWriter(socket.getOutputStream(), true);
        text= new JTextField();
        String str = text.getText();

        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        str = br.readLine();
        serverOut.println(str);      

        while(!socket.isClosed()){
            if(br.ready() == true){
                {

                    serverOut.println(str);
                    System.out.println(str);
                }
            }
            if(hasMessages)
            {
                String nextSend = "";
                synchronized(messagesToSend){
                    nextSend = messagesToSend.pop();
                    hasMessages = !messagesToSend.isEmpty();
                }
                output.append(userName + " > " + nextSend);
            }
        }
    }
    catch(IOException ex){
        ex.printStackTrace();
    }

}
//creating my JPanel
public ServerThread(Socket socket, String userName){
    this.socket = socket;
    this.userName = userName;
    messagesToSend = new LinkedList<String>();



    frame = new JFrame("Chat Server "+ userName);
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    frame.setSize(600, 400);   
    panel = new JPanel();
    panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
    panel.setOpaque(true);
    ButtonListener buttonListener = new ButtonListener();
    output = new JTextArea(15, 40);
    output.setWrapStyleWord(true);
    output.setEditable(false);
    JScrollPane scroller = new JScrollPane(output);
    scroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
    scroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
    JPanel inputpanel = new JPanel();
    inputpanel.setLayout(new FlowLayout());
    input = new JTextField(20);
    enterButton = new JButton("Send");
    imagePanel = new JPanel();
    imagePanel.setSize(20,20);
    imagePanel.setVisible(true);        
    enterButton.setActionCommand(ENTER);
    enterButton.addActionListener(buttonListener);
    input.setActionCommand(ENTER);
    input.addActionListener(buttonListener);
    DefaultCaret caret = (DefaultCaret) output.getCaret();
    caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
    panel.add(scroller);
    inputpanel.add(imagePanel);
    inputpanel.add(input);
    inputpanel.add(enterButton);
    panel.add(inputpanel);
    frame.getContentPane().add(BorderLayout.CENTER, panel);
    frame.setLocationByPlatform(true);
    frame.setLocationRelativeTo(null);
    frame.pack();
    frame.setVisible(true);
    frame.setResizable(false);
    input.requestFocus();

    final JToolBar toolBar = new JToolBar();

    JButton upload = new JButton("Upload");
    toolBar.add(button);
    toolBar.add(upload);
    frame.getContentPane().add(toolBar, BorderLayout.SOUTH);



 upload.addActionListener(new ActionListener() {

       @Override
       public void actionPerformed(ActionEvent e) {
        JFileChooser fc = new JFileChooser();
        fc.showOpenDialog(null);
        File f = fc.getSelectedFile();
        String filename = f.getAbsolutePath();


         try {
             File file = new File(filename);

             BufferedImage image = ImageIO.read(file);
             ByteArrayOutputStream baos = new ByteArrayOutputStream();
             ImageIO.write(image, "jpg", baos);         




            } catch (IOException e1) {
             // TODO Auto-generated catch block
             e1.printStackTrace();
            }         
           } 

          });
}

public static class ButtonListener implements ActionListener
{

    public void actionPerformed(final ActionEvent ev)
    {
        if (!input.getText().trim().equals(""))
        {
            String cmd = ev.getActionCommand();
            if (ENTER.equals(cmd))
            {
                output.append(input.getText());
                input.getText().trim().equals(testString);                                  
                output.append("\n");                
            }
        }
        input.setText("");
        input.requestFocus();
    }
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...