Java聊天应用程序

时间:2016-01-08 07:09:30

标签: java

我正在尝试创建一个MultiClient Chat应用程序,在该应用程序中,客户端窗口中实现了聊天。我已经尝试了相同的服务器和客户端代码。一个clint到服务器运行良好,但teo客户端到服务器没有正常运行一个clint通信良好,但第二个客户端没有给出响应。

客户代码

    package server1;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;


public class Clientchatform extends JFrame implements ActionListener  {
    static Socket conn;
    JPanel panel;
    JTextField NewMsg;
    JTextArea ChatHistory;
    JButton Send;
String line;
BufferedReader br;
String response;
BufferedReader  is ;
PrintWriter os;
    public Clientchatform() throws UnknownHostException, IOException {
        panel = new JPanel();
        NewMsg = new JTextField();
        ChatHistory = new JTextArea();
        Send = new JButton("Send");
        this.setSize(500, 500);
        this.setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        panel.setLayout(null);
        this.add(panel);
        ChatHistory.setBounds(20, 20, 450, 360);
        panel.add(ChatHistory);
        NewMsg.setBounds(20, 400, 340, 30);
        panel.add(NewMsg);
        Send.setBounds(375, 400, 95, 30);
        panel.add(Send);
        Send.addActionListener(this);
        conn = new Socket(InetAddress.getLocalHost(), 2000);



        ChatHistory.setText("Connected to Server");
        this.setTitle("Client");
        while (true) {
            try {
                BufferedReader  is  = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                                 br= new BufferedReader(new InputStreamReader(System.in));
                String line = is.readLine();
                ChatHistory.setText(ChatHistory.getText() + 'n' + "Server:"
                        + line);
            } catch (Exception e1) {
                ChatHistory.setText(ChatHistory.getText() + 'n'
                        + "Message sending fail:Network Error");
                try {
                    Thread.sleep(3000);
                    System.exit(0);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        if ((e.getSource() == Send) && (NewMsg.getText() != "")) {

            ChatHistory.setText(ChatHistory.getText() + 'n' + "Me:"
                    + NewMsg.getText());
            try {
                             br= new BufferedReader(new InputStreamReader(System.in));
                 PrintWriter os=new PrintWriter(conn.getOutputStream());

                os.println(NewMsg.getText());
                                os.flush();

            } catch (Exception e1) {
                ChatHistory.append(ChatHistory.getText() + 'n'
                        + "Message sending fail:Network Error");

            }


            NewMsg.setText("");
        }
    }

    public static void main(String[] args) throws UnknownHostException,
            IOException {
        Clientchatform chatForm = new Clientchatform();
    }

}

服务器代码

package server1;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class serverChatform  extends JFrame implements ActionListener  {
    static ServerSocket server;
    static Socket conn;
    JPanel panel;
    JTextField NewMsg;
    JTextArea ChatHistory;
    JButton Send;
    //DataInputStream dis;
    //DataOutputStream dos;
        String line;
        BufferedReader  is ;
        public serverChatform() throws UnknownHostException, IOException {

        panel = new JPanel();
        NewMsg = new JTextField();
        ChatHistory = new JTextArea();
        Send = new JButton("Send");
        this.setSize(500, 500);
        this.setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        panel.setLayout(null);
        this.add(panel);
        ChatHistory.setBounds(20, 20, 450, 360);
        panel.add(ChatHistory);
        NewMsg.setBounds(20, 400, 340, 30);
        panel.add(NewMsg);
        Send.setBounds(375, 400, 95, 30);
        panel.add(Send);
        this.setTitle("Server");
        Send.addActionListener(this);
        server = new ServerSocket(2000, 1, InetAddress.getLocalHost());
        ChatHistory.setText("Waiting for Client");
        conn = server.accept();
             //     ServerThread st=new ServerThread(conn);
               //   st.start();

        ChatHistory.setText(ChatHistory.getText() + 'n' + "Client Found");
        while (true) {
            try {
                BufferedReader  is  = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                                  PrintWriter os=new PrintWriter(conn.getOutputStream());
                 line=is.readLine();
                ChatHistory.append(ChatHistory.getText() + 'n' + "Client:"
                        + line);
            } catch (Exception e1)
                        {
                ChatHistory.setText(ChatHistory.getText() + 'n'
                        + "Message sending fail:Network Error");
                try {
                    Thread.sleep(3000);
                    System.exit(0);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }





    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        if ((e.getSource() == Send) && (NewMsg.getText() != "")) {
            ChatHistory.setText(ChatHistory.getText() + 'n' + "ME:"
                    + NewMsg.getText());
            try {
                 PrintWriter os =new PrintWriter(conn.getOutputStream());
                        os.println(NewMsg.getText());
                                                os.flush();



            } catch (Exception e1) {
                try {
                    Thread.sleep(3000);
                    System.exit(0);
                } catch (InterruptedException e2) {
                    // TODO Auto-generated catch block
                    e2.printStackTrace();
                }
            }

            NewMsg.setText("");
        }
    }

    public static void main(String[] args) throws UnknownHostException,
    IOException {
    new serverChatform();
    }

}

2 个答案:

答案 0 :(得分:0)

你肯定是在正确的轨道上,但我有一个问题让你问自己。

    conn = server.accept();
         //     ServerThread st=new ServerThread(conn);
           //   st.start();

    ChatHistory.setText(ChatHistory.getText() + 'n' + "Client Found");

此代码的执行频率是多少?当然考虑main(),

public static void main(String[] args) throws UnknownHostException,
IOException {
new serverChatform();
}

只被调用一次,因此只会创建一个serverChatform。

由于您似乎自己编写了相当多的代码,因此您似乎已经准备好了解更多内容,但我不打算提供完整的解决方案,而只是提供方向。

接受conn = server.accept();的客户后,您必须创建另一个new serverChatform();。这必须在不同的Thread中发生。怎么做,我作为练习留给你。

答案 1 :(得分:0)

每个连接的客户端都必须在自己的线程中提供。此外,您需要一个持续侦听新客户端连接的线程。这看起来像这样。

List<Socket> clients; // Save the socket for each client
[...]
new Thread(new Runnable(){
    @Override
    public void run() {
        // Thread that runs forever listening for new clients
        while(true){
            Socket conn = server.accept();  
            // new client has connected, store its socket
            clients.add(conn);
            // and start new thread that interacts with this new client
            new Thread(new Runnable(){
                @Override
                public void run() {
                    // SERVE CLIENT HERE!
                }
            }).start();
        }
    }
}).start();