java多人聊天室系统代码实现步骤,java实现简易聊天室

  java多人聊天室系统代码实现步骤,java实现简易聊天室

  编写一个爪哇应用程序,实现图形界面多人聊天室(多线程实现),要求聊天室窗口标题是"欢迎使用(青少年禁看的)X级片或内容聊天室应用",其中(青少年禁看的)X级片或内容是自己的班级姓名学号,如"软件171 张三1234"。

  

客户端

导入Java。awt。borderlayout导入Java。awt。容器;导入Java。awt。流程布局;导入Java。awt。事件。动作事件;导入Java。awt。事件。动作监听器;导入Java。网。服务器套接字;导入Java。网。插座;导入Java。网。unknownhostexception导入javax。挥棒。jbutton导入javax。挥棒。jframe导入javax。挥棒。jlabel导入javax。挥棒。joptionpane导入javax。挥棒。jpanel导入javax。挥棒。jpasswordfield导入javax。挥棒。jscrollpane导入javax。挥棒。jtextarea导入javax。挥棒。jtextfield导入Java。io。*;类登录扩展窗口实现ActionListener{ //用户名JPanel jp1=new JPanel();JLabel jl1=新JLabel(用户名);public JTextField jtf 1=new JTextField(15);//密码JPanel jp2=new JPanel();JLabel jl2=新JLabel(密码);JPasswordField jpf 2=new JPasswordField(15);//登入取消按钮JPanel jp3=new JPanel();JButton jbt1=新JButton(登入);JButton jbt2=新JButton(取消);公共登录(){ //TODO自动生成的构造函数存根this.setTitle(客服端登入窗口);集装箱con=这个。getcontentpane();con . set layout(new flow layout());//用户名jp1。添加(jl1);jp1。添加(JT f1);JT f1。addactionlistener(this);//密码jpf 2。setechochar( * );//用*显示密码框输入的数据jp2。添加(jl2);jp2。添加(jpf 2);jpf 2。addactionlistener(this);//登入取消按钮jp3。添加(jbt 1);jp3。添加(jbt 2);//添加到当前窗口容器con . add(jp1);con . add(jp2);con . add(jp3);this.setSize(500,300);//设置窗体大小setLocationRelativeTo(null);//设置窗口居中这个。setresizable(false);//窗体大小设置为不可改这个。设置可见(真);//窗体设置为可见这个。setdefaultcloseoperation(JFrame .EXIT _ ON _ CLOSE);//光标聚焦在用户框中JT f1。请求焦点();//为登入按钮添加监听器jbt 1。addactionlistener(new action listener(){ @ Override public void action performed(action event e){//TODO自动生成的方法存根字符串名称=JT f1。gettext();字符串密码=新字符串(jpf 2。get password());//获取密码框中的密码尝试{如果(pa

 

  ssword.equals("123")) {                        setVisible(false);                        new Client(jtf1.getText());                    }                    else {                        JOptionPane.showConfirmDialog(null, "用户名或密码错误!",                                "提示",JOptionPane.DEFAULT_OPTION);                    }                } catch (Exception e2) {                    // TODO: handle exception                    e2.printStackTrace();                }            }        });        jbt2.addActionListener(new ActionListener() { //为取消按钮添加监听器                        @Override            public void actionPerformed(ActionEvent e) {                // TODO 自动生成的方法存根                try {                    setVisible(false);                } catch (Exception e2) {                    // TODO: handle exception                }            }        });    }    //移动光标聚集    public void actionPerformed(ActionEvent e) {        Object o=e.getSource();        if(o==jtf1) {            jpf2.requestFocus();        }    }}public class Client extends JFrame  {    public DataOutputStream dos=null;    public DataInputStream dis=null;    public Socket s=null;    public ServerSocket sc=null;    //    public JTextArea jta=new JTextArea(10,20);    public JTextField jtf=new JTextField(20);    public JScrollPane jsp = new JScrollPane(jta);    static final String CONNSTR="127.0.0.1";    public String ClientName="";    //构造函数初始化    Client(String tClientName) throws IOException{        ClientName=tClientName;        this.setTitle("客服端:"+ClientName);        jta.setEditable(false); //文本显示框不可编辑        this.add(jtf,BorderLayout.SOUTH);        this.add(jsp,BorderLayout.CENTER);        //默认的设置是超过文本框才会显示滚动条,以下设置让滚动条一直显示        jsp.setVerticalScrollBarPolicy( JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);        //连接服务器                try {            s=new Socket(CONNSTR,9995);            new ThreadClient(s,this).start();        } catch (Exception e) {            // TODO: handle exception            e.printStackTrace();            JOptionPane.showConfirmDialog(null, "用户连接服务器失败",                    "提示",JOptionPane.DEFAULT_OPTION);        }        //发送登入信息到服务器        String firstStr="""+ClientName+"":"+"登入成功";        DataOutputStream firstdataOutputStream = new DataOutputStream(s.getOutputStream());        //发送用户名到服务端        firstdataOutputStream.writeUTF(firstStr);        firstdataOutputStream.flush();        //        this.setBounds(300,300,300,400);                //this.setSize(500, 300);    //设置窗体大小        setLocationRelativeTo(null); //设置窗口居中        this.setVisible(true);  //窗体设置为可见        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);         jtf.requestFocus();        //                jtf.addActionListener(new ActionListener() {            @Override            public void actionPerformed(ActionEvent e) {                // TODO 自动生成的方法存根                String str=jtf.getText();                try {                    if(str.length()>0) {                        str="""+ClientName+"":"+str;                        sendMessage(str, s);                        jtf.setText("");                    }                } catch (Exception e2) {                    // TODO: handle exception                    e2.printStackTrace();                    str="""+ClientName+"":"+"已退出";                    sendMessage(str,s);                }                            }        });    }    //客服端发送信息到服务器    protected void sendMessage(String message, Socket s) {        try {            DataOutputStream dos = new DataOutputStream(s.getOutputStream());            dos.writeUTF(message);            dos.flush();            } catch (Exception e) {            // TODO: handle exception            e.printStackTrace();        }    }    public static void main(String[] args) {        new Login();    }}//定义线程类,读取服务器发送的信息class ThreadClient extends Thread {    private Socket s;    private Client clientChat;    ThreadClient(Socket socket, Client clientChat) {        this.s = socket;        this.clientChat = clientChat;    }    @Override    public void run() {        String message;        try {            while (true) {                    DataInputStream DataInputStream = new DataInputStream(s.getInputStream());                    message = DataInputStream.readUTF();                    clientChat.jtf.setText("");                    clientChat.jta.append(message+"n");                }        }        catch (IOException e) {            // TODO Auto-generated catch block                e.printStackTrace();                message="""+clientChat.ClientName+"":"+"已退出";                clientChat.sendMessage(message,s);        }    }}

服务端

import java.awt.BorderLayout;import java.io.BufferedReader;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;import java.util.ArrayList;import java.util.Collection;import java.util.Collections;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Scanner;import java.util.Set;import javax.naming.ldap.LdapName;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextArea;public class Server extends JFrame {    //static List<Socket>ls=new ArrayList<Socket>();    //static List<String>lname=new ArrayList<String>();    public static Map<Socket,String> socketsMaps     = Collections.synchronizedMap(new HashMap<Socket,String>());    //    ServerSocket sc=null;    Socket s=null;    public JTextArea jta=new JTextArea(10,20);    public JScrollPane jsp=new JScrollPane(jta);    public String ServerName="服务器";    static int number=1;    Server() throws IOException{        super();        setTitle("服务器");        jta.setEditable(false); //文本显示框不可编辑        this.add(jsp,BorderLayout.CENTER);          //默认的设置是超过文本框才会显示滚动条,以下设置让滚动条一直显示        jsp.setVerticalScrollBarPolicy( JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);        //this.add(jta,BorderLayout.CENTER);  //不需要重复添加        this.setBounds(300,300,300,400);        this.setVisible(true);        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        //    }    public void init() {        int count = 0; // 记录登录到该服务器的客户端个数            try {                sc = new ServerSocket(9995); // 创建一个ServerSocket对象,端口号为1906                jta.append("服务器已启动"+n);                while (true) {                    Socket socket=sc.accept();                    new ThreadServer(socket,this).start();                }            }            catch (Exception e) {                // TODO: handle exception                e.printStackTrace();            }                }        public static void main(String[] args) throws IOException{        new Server().init();    }}class ThreadServer extends Thread {    private Socket ts;    private Server tsr;    ThreadServer(){};    ThreadServer(Socket s,Server sr)    {        this.ts = s;        this.tsr=sr;    }    public void run() {                try {            while(true)            {                DataInputStream dis = new DataInputStream(ts.getInputStream());                String message=dis.readUTF();                if(message.endsWith(":登入成功")) {                    message.replaceAll(":登入成功", "");                    tsr.socketsMaps.put(ts,message);                }                tsr.jta.append(message+n);                Set<Socket> sockets = tsr.socketsMaps.keySet();                for(Socket tts : sockets) {                    DataOutputStream dos = new DataOutputStream(tts.getOutputStream());                    dos.writeUTF(message);                    dos.flush();                }            }        }        catch (IOException e2) {            // TODO: handle exception            e2.printStackTrace();        }    }}

 

  

 

  

 

  以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持盛行IT。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: