Java 使用JDBC的群组聊天服务器

Java 使用JDBC的群组聊天服务器,java,mysql,jdbc,server,client,Java,Mysql,Jdbc,Server,Client,我知道那里有无穷无尽的聊天服务器,但我似乎无法将这些解决方案应用到我的代码中。 我的代码的工作方式是启动一个服务器,我可以将任意多个客户端连接到这个服务器,所有这些客户端都可以一起通信。除了最重要的部分,我什么都做得很好。我似乎无法让客户端显示彼此的消息。我尝试使用JDBC,但每次添加都会返回太多错误 public class Client { private static final String host = "localhost"; private static final int po

我知道那里有无穷无尽的聊天服务器,但我似乎无法将这些解决方案应用到我的代码中。 我的代码的工作方式是启动一个服务器,我可以将任意多个客户端连接到这个服务器,所有这些客户端都可以一起通信。除了最重要的部分,我什么都做得很好。我似乎无法让客户端显示彼此的消息。我尝试使用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();
    }
}
}
公共类客户端{
私有静态最终字符串host=“localhost”;
专用静态最终int端口号=4466;
私有字符串用户名;
私有字符串服务器主机;
专用int服务器端口;
专用扫描器用户输入扫描器;
静态按钮输入按钮;
公共区域输出;
公共静态JTextField输入;
静态JFrame;
静态JPanel面板;
公共静态字符串testString=“test”;
公共静态void main(字符串[]args){
字符串readName=null;
扫描仪扫描=新扫描仪(System.in);
System.out.println(“请输入用户名:”);
while(readName==null | | readName.trim().equals(“”){
readName=scan.nextLine();
if(readName.trim()等于(“”){
System.out.println(“无效。请重新输入:”);
}
}
客户端=新客户端(readName、主机、端口号);
客户端.startClient(扫描);
}
专用void startClient(扫描仪扫描){
试一试{
套接字=新套接字(服务器主机、服务器端口);
Thread.sleep(1000);//等待网络通信。
ServerThread ServerThread=新的ServerThread(套接字,用户名);
线程serverAccessThread=新线程(serverThread);
serverAccessThread.start();
while(serverAccessThread.isAlive()){
if(scan.hasNextLine()){
serverThread.addNextMessage(scan.nextLine());
}
}
}捕获(IOEX异常){
System.err.println(“致命连接错误!”);
例如printStackTrace();
}捕获(中断异常例外){
系统输出打印项次(“中断”);
}
}
专用客户端(字符串用户名、字符串主机、int端口号){
this.userName=用户名;
this.serverHost=host;
this.serverPort=portNumber;
}
}
公共类聊天服务器{
专用静态最终int端口号=4466;
专用int服务器端口;
私人名单客户;
公共静态void main(字符串[]args){
ChatServer服务器=新的ChatServer(端口号);
server.startServer();
}
公共聊天服务器(int端口号){
this.serverPort=portNumber;
}
公共列表getClients(){
返回客户;
}
私有void startServer(){
clients=newarraylist();
ServerSocket ServerSocket=null;
试一试{
serverSocket=新的serverSocket(serverPort);
接受客户端(服务器套接字);
}捕获(IOE异常){
System.err.println(“无法侦听端口:“+serverPort”);
系统出口(1);
}
}
专用void AcceptClient(服务器套接字服务器套接字){
最终JFrame=新JFrame(“服务器窗口”);
框架。设置尺寸(600400);
frame.getContentPane().setBackground(Color.BLACK);
//--------------------------------------//
//展示
JPanel display=新的JPanel();
JTextArea EditArea 2=新的JTextArea(22,52);
显示.添加(编辑区2);
frame.add(显示);
显示.背景(颜色.黑色);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
帧设置位置(2000100);
框架.立根背景(颜色.黑色);
frame.setVisible(true);
editArea2.append(“服务器启动端口=“+serverSocket.getLocalSocketAddress()+”\n”);
while(true){
试一试{
Socket=serverSocket.accept();
editArea2.append(“接受:”+socket.getRemoteSocketAddress()+“\n”);
ClientThread客户端=新的ClientThread(这个,套接字);
线程=新线程(客户端);
thread.start();
客户。添加(客户);
}捕获(IOEX异常){
editArea2.append(“在:+serverPort上接受失败”);
}
}
}   
}
公共类聊天服务器{
专用静态最终int端口号=4466;
专用int服务器端口;
私人名单客户;
公共静态void main(字符串[]args){
ChatServer服务器=新的ChatServer(端口号);
server.startServer();
}
公共聊天服务器(int端口号){
this.serverPort=portNumber;
}
公共列表getClients(){
返回客户;
}
私有void startServer(){
clients=newarraylist();
ServerSocket ServerSocket=null;
试一试{
serverSocket=新的serverSocket(serverPort);
接受客户端(服务器套接字);
}捕获(IOE异常){
System.err.println(“无法侦听端口:“+serverPort”);
系统出口(1);
}
}
专用void AcceptClient(服务器套接字服务器套接字){
最终JFrame=新JFrame(“服务器窗口”);
框架。设置尺寸(600400);
frame.getContentPane().setBackground(Color.BLACK);
//--------------------------------------//
//展示
JPanel display=新的JPanel();
JTextArea EditArea 2=新的JTextArea(22,52);
显示.添加(编辑区2);
frame.add(显示);
显示.背景(颜色.黑色);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
帧设置位置(2000100);
框架.立根背景(颜色.黑色);
frame.setVisible(true);
editArea2.append(“服务器启动端口=“+serverSocket.getLocalSocketAddress()+”\n”);
while(true){
试一试{
Socket=serverSocket.accept();
editArea2.append(“接受:”+socket.getRemoteSocketAddress()+“\n”);
ClientThread客户端=新的ClientThread(这个,套接字);
线程=新线程(客户端);
thread.start();
客户。添加(客户);
}捕获(IOEX异常){
editArea2.append(“在:+serverPort上接受失败”);
}
}
}   
}
公共类ServerThread实现可运行{
私有的