利用JAVA实现简单聊天室1.设计思路Java是一种简单的,面向对象的,分布式的,解释的,键壮的,安全的,结构中立的,可移植的,性能很优异的,多线程的,动态的语言。
而且,Java 很小,整个解释器只需215K的RAM。
因此运用JAVA程序编写聊天室,实现简单聊天功能。
程序实现了聊天室的基本功能,其中有:(1)启动服务器:实现网络的连接,为注册进入聊天室做准备。
(2)注册登陆界面:填写基本信息如姓名等,可以供多人进入实现多人聊天功能。
(3)发送信息:为用户发送信息提供平台。
(4)离开界面:使用户退出聊天室。
(5)关闭服务器:断开与网络的连接,彻底退出聊天室。
2.设计方法在设计简单聊天室时,需要编写5个Java源文件:Server.java、Objecting.java、LogIn.java、ClientUser.java、Client.java。
3 程序功能图及程序相关说明(1)主功能框图(2) 聊天室基本功能表4.程序代码是说明程序中引入的包:package Chat;import .*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.*;import java.io.*;(1)服务器端代码中用户自定义类:类名:Server作用:服务器启动继承的接口名:ActionListenerpublic class Server implements ActionListener{定义的对象:count //记录点机关闭按钮次数2次关闭soconly //只有SOCKET,用于群发sockets//所有客户的SOCKETsocket_thread //Socket所在的线乘,用于退出;frame // 定义主窗体panel //定义面板start,stop //启动和停止按钮主要成员方法:public void center //定义小程序查看器的位置public void actionPerformed //定义处理异常机制定义子类:serverRun,Details继承的父类名:Threadclass serverRun extends Thread //启线乘用于接收连入的Socket class Details extends Thread //具体处理消息的线乘,只管发送消息创建一个ServerSocket 对象,用于接受指定端口客户端的信息ServerSocket server = new ServerSocket("1234");接受请求时候,通过accept()方法,得到一个socket对象。
Socket socket = server.accept();通过socket创建流(输入,输出)。
BufferedReaderbr=newBufferedReader(newInputStreamReader(socket.getInputStream()))DataInputStream dis = new DataInputStream(socket.getInputStream());PrintWriter out = new PrintWriter(socket.getOutputStream()); 通过流,来和客户交互。
(2)用户注册代码中相关类:类名:LogIn作用:用户注册登录继承的接口名:ActionListenerpublic class LogIn implements ActionListener定义的对象:Title //定义标题Name //提示输入姓名,添加注册信息Send //提示点击“进入”,进入聊天室构造方法:public LogIn()(3)客户端:①创建一个socket对象,用于连接服务器。
②用socket创建流。
③通过流和服务器进行交互。
④交互完毕,将流和socket关闭。
(4)聊天室:类名:Client作用:实现发送即时信息。
继承的接口名:ActionListenerpublic class Client implements ActionListener构造方法:public Client(String name2)异常处理:public void actionPerformed(ActionEvent e)public void connect()public void actionPerformed(ActionEvent e)定义的子类:ClientSocket继承的父类:Threadclass ClientSocket extends Thread ()5.设计结果与分析5个Java源文件:Server.java、Objecting.java、LogIn.java、ClientUser.java、Client.java。
分别编译这5个Java源文件,或运行“javac *.java”命令,编译全部的源文件,然后运行连接服务器的主类,即运行Server 类。
连接完毕后在运行注册的主函数类,即运行LogIn类。
首先运行启动服务器的文件Server.java,运行结果如下:图1服务器启动成功结果分析:在进入聊天室之前必须先启动服务器,实现服务器端的连接为用户的登录打开“窗口”。
其次运行用户注册登录文件LogIn.java,运行结果如下:图2用户登陆界面结果分析:添加用户信息,输入用户姓名,为用户进入聊天室提供关口。
并且利用以下语句实现如图3的界面 JLabel title=new JLabel("免注册版"); JLabel name=new JLabel("输入姓名");JButton send=new JButton("进入");添加注册信息后点击“进入”按钮,结果如图3图3显示用户已登录结果分析:当服务器启动用户完成信息注册时,在服务期端的界面中会显示当前在线的人员,并且提示客户已连接到服务器,可以进行聊天行为。
图4显示聊天内容结果分析:多个用户进入聊天室之后,用户可以在发送信息的文本框里填写自己的内容,点击“发送信息”按钮,信息会出现在上方的区域内,在界面的右方还可以显示在线人员的姓名,另在线用户可以知道有谁在聊天室内。
聊天结束点击“离开”按钮,结果如图5所示:图5离开聊天室点击服务器中的“停止”按钮,结果如图6.图7.所示:图6 点击“停止”按钮图7终止与服务器端连接结果分析:用户聊天结束点击“离开”按钮之后会在服务器端的界面上自动显示该用户已离开,提时、示服务器执行相关行为。
离开界面:使用户退出聊天室;关闭服务器:断开与网络的连接,彻底退出聊天室。
6.语句实现(1)Server.javapackage Chat;import .*;import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.util.*;import java.io.*;public class Server implements ActionListener{int count=0;Vector soconly=new Vector();HashMap sockets=new HashMap();HashMap socket_thread=new HashMap();ServerSocket serversocket;JFrame frame;JTextArea area=new JTextArea();JPanel panel=new JPanel();JButton start=new JButton("启动");JButton stop=new JButton("停止");public Server() {panel.add(start);panel.add(stop);frame.add(panel,BorderLayout.NORTH);frame.add(area,BorderLayout.CENTER);frame.pack();center();frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);frame.setVisible(true);start.addActionListener(this);stop.addActionListener(this);System.out.println("new");}public void center(){Toolkit toolkit=Toolkit.getDefaultToolkit();Dimension e=toolkit.getScreenSize();int x=e.width/2-(int)(frame.getSize().getWidth()/2);int y=e.height/2-(int)(frame.getSize().getHeight()/2);frame.setLocation(x,y);}public void actionPerformed(ActionEvent e){JButton btn=(JButton)e.getSource();if(btn==start){serverRun serverrun=new serverRun();System.out.println("gogo");serverrun.start();}if(btn==stop){try{Iterator i = soconly.iterator();while (i.hasNext()) {Socket s = (Socket) i.next();ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());Objecting bj=new Objecting();out.writeObject("系统消息-----服务器马上关闭!!!!!!请马上关闭客户端");}count++;if(count==2){System.exit(0);}JOptionPane.showMessageDialog(frame,"已通知客户端,请再次点击关闭按钮关闭");}catch(Exception ex){ex.printStackTrace();}}}class serverRun extends Thread{public void run(){try{System.out.println("开始SERVERRUN");serversocket=new ServerSocket(55555);area.append("服务器启动\n");start.setEnabled(false);while(true){Socket socket=serversocket.accept();System.out.println("连接成功");BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));String name=br.readLine();area.append("服务器接收用户"+name+"的连接\n");soconly.add(socket);Iterator i=soconly.iterator();while(i.hasNext()){Socket s=(Socket)i.next();//获得其他SOCKET的通信口ObjectOutputStream out=newObjectOutputStream(s.getOutputStream());out.writeObject("系统消息-----"+name+"用户进入"+"------"); }V ector v=getList();Iterator j=soconly.iterator();while(j.hasNext()){Socket s = (Socket) j.next();ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());out.writeObject(v);System.out.println("服务器发送用户列表进入"); }Details d=new Details(socket);socket_thread.put(name,d);d.start();}}catch(Exception e){e.printStackTrace();}} }class Details extends Thread{boolean alive=true;ObjectInputStream in;ObjectOutputStream out;Socket socket;Details(Socket socket){this.socket=socket;public void run(){while(alive){try{in = new ObjectInputStream(socket.getInputStream());Objecting objecting=(Objecting)in.readObject();String name=objecting.getKey();String content=objecting.getValue();if(name.equalsIgnoreCase("all")){Iterator i=soconly.iterator();while(i.hasNext()){Socket s=(Socket)i.next();out=new ObjectOutputStream(s.getOutputStream());out.writeObject(content);System.out.println("Send");} }if(name.equalsIgnoreCase("exit")){Details thread=(Details)socket_thread.get(content);thread.alive=false;area.append(content+"离开\n");socket.close();soconly.remove(socket);sockets.remove(content);Iterator i=soconly.iterator();while(i.hasNext()){Socket s=(Socket)i.next();out=new ObjectOutputStream(s.getOutputStream());out.writeObject("系统消息-----"+content+"用户离开"+"------"); }Vector v=getList();Iterator j=soconly.iterator();while(j.hasNext()){Socket s = (Socket) j.next();ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());out.writeObject(v);System.out.println("服务器发送用户列表离开");}}if(!name.equalsIgnoreCase("all")&!name.equalsIgnoreCase("exit")){area.append("处理私聊信息");Socket s=(Socket)sockets.get(name);out=new ObjectOutputStream(s.getOutputStream());out.writeObject(content);}catch(Exception e){e.printStackTrace();}} } }public Vector getList(){Vector v=new Vector();Set set=sockets.keySet();Iterator i=set.iterator();while(i.hasNext()){v.add(i.next());}return v;}public static void main(String args[]){new Server(); } }(2)Objecting.javapackage Chat;import java.io.Serializable;public class Objecting implements Serializable{String key;String value;public Objecting(){ }public Objecting(String key,String value) {this.key =key;this.value=value;}public void setKey(String key) {this.key = key; }public void setValue(String value) {this.value = value; }public String getKey() {return key; }public String getValue() {return value;} }(3)LogIn.javapackage Chat;import javax.swing.*;import java.awt.*;import java.awt.event.*;public class LogIn implements ActionListener{JFrame frame;JLabel title=new JLabel("免注册版");JPanel banner=new JPanel();JTextField text=new JTextField(10);JPanel body=new JPanel();JPanel buttom=new JPanel();JLabel name=new JLabel("输入姓名");JButton send=new JButton("进入");public LogIn() {frame=new JFrame("注册");frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);banner.add(title);body.add(name);body.add(text);buttom.add(send);frame.add(banner,BorderLayout.NORTH);frame.add(body,BorderLayout.CENTER);frame.add(buttom,BorderLayout.SOUTH);frame.pack();center();frame.setVisible(true);send.addActionListener(this); }public void center(){Toolkit toolkit=Toolkit.getDefaultToolkit();Dimension e=toolkit.getScreenSize();int x=e.width/2-(int)(frame.getSize().getWidth()/2);int y=e.height/2-(int)(frame.getSize().getHeight()/2);frame.setLocation(x,y); }public void actionPerformed(ActionEvent e){if(text.getText().equals("")){JOptionPane.showMessageDialog(frame,"姓名不能为空");return;}else{new Client(text.getText());frame.dispose(); } }public static void main(String args[]){new LogIn(); } }(4)ClientUser.javapackage Chat;import java.awt.*;import java.awt.event.*;import javax.swing.*;import .*;import java.io.*;public class ClientUser extends WindowAdapter implements ActionListener,Runnable{public JFrame jf;public JTextField jt;public JTextField name;public JButton connect;public JScrollPane jsp;public JTextArea jta;public JButton jb;public JLabel l;Socket soc;InputStream soc_in;OutputStream soc_out;BufferedReader Bsoc_in;PrintWriter Psoc_out;public ClientUser(){jf=new JFrame("Client Chat Room");jta=new JTextArea(10,30);jta.setEditable(false);jsp=newJScrollPane(jta,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_ SCROLLBAR_AS_NEEDED);jt=new JTextField(30);name=new JTextField(5);l=new JLabel("Please in put your name");connect=new JButton("Connect");connect.addActionListener(this);jt.addActionListener(this);jb=new JButton("Send The Message");jb.addActionListener(this);JPanel jp=new JPanel();JPanel jp2=new JPanel();jp.setLayout(new FlowLayout());jp.add(jt);jp.add(jb);jp2.add(l);jp2.add(name);jp2.add(connect);Container c=jf.getContentPane();c.setLayout(new GridBagLayout());GridBagConstraints gbc=new GridBagConstraints();gbc.gridx=0;gbc.gridy=0;c.add(jp2,gbc);gbc.gridx=0;gbc.gridy=1;c.add(jsp,gbc);gbc.gridy=2;c.add(jp,gbc);jf.pack();jf.setVisible(true); }public static void main(String[] args) {ClientUser cuser=new ClientUser(); }public void windowClosing(WindowEvent e){System.exit(0);}public void actionPerformed(ActionEvent e){if (e.getSource()==connect){if(name.getText().equals("")){new JOptionPane().showMessageDialog(null,"Please in Put your name First!");}else{try{soc=new Socket("localhost",55555);Psoc_out=new PrintWriter(soc.getOutputStream(),true);Bsoc_in=new BufferedReader(new InputStreamReader(soc.getInputStream()));Psoc_out.println(name.getText());}catch(Exception e1){e1.printStackTrace();}name.setEditable(false);new Thread (this).start();} }if(e.getSource()==jt||e.getSource()==jb){jta.append(name.getText()+":"+jt.getText()+"\n");Psoc_out.println(name.getText()+":"+jt.getText());jt.setText("");} }public void run(){String text;while(true){try{text=Bsoc_in.readLine();jta.append(text+"\n");}catch(Exception e){e.printStackTrace();}} }(5)Client.javapackage Chat;import javax.swing.*;import java.awt.*;import java.awt.event.*;import .*;import java.io.*;import java.util.Vector;public class Client implements ActionListener{ClientSocket cs;String name;Socket socket;JFrame frame;JTextArea area=new JTextArea(30,30);JTextField text=new JTextField(30);JButton send=new JButton("发送消息");JButton exit=new JButton("离开");JPanel banner=new JPanel();JPanel panel=new JPanel();List list=new List(35);JPanel right=new JPanel();JLabel welcome=new JLabel();public Client(String name2) {=name2;welcome.setText(name+"----欢迎来到聊天室");area.setEditable(false);frame=new JFrame("聊天室");frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);frame.setResizable(false);banner.add(welcome);frame.add(banner,BorderLayout.NORTH);panel.add(text);panel.add(send);panel.add(exit);frame.add(panel,BorderLayout.SOUTH);frame.add(area,BorderLayout.CENTER);right.add(new JScrollPane(list));frame.add(right,BorderLayout.EAST);frame.pack();center();frame.setVisible(true);connect();send.addActionListener(this);exit.addActionListener(this);list.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){String to=list.getSelectedItem();String content=JOptionPane.showInputDialog(frame,"输入向"+name+"发送的私聊信息","私聊",RMA TION_MESSAGE);if(content==null){return;}else{Objecting o=new Objecting(to,"---私聊信息--"+name+":"+content);try{ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());out.writeObject(o);JOptionPane.showMessageDialog(frame,to+"收到消息");}catch(Exception e2){e2.printStackTrace();}}}});text.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){if(text.getText().equals("")){JOptionPane.showMessageDialog(frame,"消息为空");return;}else{Objecting o=new Objecting("all",name+":"+text.getText())try{ObjectOutputStreamout=new ObjectOutputStream(socket.getOutputStream());out.writeObject(o);text.setText("");}catch(Exception e2){e2.printStackTrace();}} } }); }public void connect(){try{socket = new Socket("localhost",55555);cs=new ClientSocket();cs.start();}catch(Exception e){e.printStackTrace();} }public void center(){Toolkit toolkit=Toolkit.getDefaultToolkit();Dimension e=toolkit.getScreenSize();int x=e.width/2-(int)(frame.getSize().getWidth()/2);int y=e.height/2-(int)(frame.getSize().getHeight()/2);frame.setLocation(x,y);}class ClientSocket extends Thread{ObjectInputStream in;ObjectOutputStream out;PrintWriter pw;public void run(){try{pw = new PrintWriter(socket.getOutputStream(),true);pw.println(name);}catch(Exception e){e.printStackTrace();}while(true){try{in = new ObjectInputStream(socket.getInputStream());Object o=in.readObject();if(o instanceof String){area.append(o.toString()+"\n"); }if(o instanceof Vector){System.out.println("列表操作");Vector v=(Vector)o;list.removeAll();Object []obj=v.toArray();for(int i=0;i<obj.length;i++){System.out.println((String)obj[i]);list.add((String)obj[i]);} }}catch(Exception e){e.printStackTrace();} } } }public void actionPerformed(ActionEvent e){JButton btn=(JButton)e.getSource();if(btn==send){if(text.getText().equals("")){JOptionPane.showMessageDialog(frame,"消息为空");return;}else{Objecting o=new Objecting("all",name+":"+text.getText());try{ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());out.writeObject(o);text.setText("");}catch(Exception e2){e2.printStackTrace();}}}if(btn==exit){Objecting o=new Objecting("exit",name);try{ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());out.writeObject(o);cs.stop();socket.close();}catch(Exception x){x.printStackTrace();}System.exit(0);} } }(5)ServerHost.javapackage Chat;import java.awt.*;import java.awt.event.*;import java.io.*;import .*;import javax.swing.*;import java.util.*;public class ServerHost extends WindowAdapter implements ActionListener,Runnable{ public JFrame jf;public JTextField jt;public JScrollPane jsp;public static JTextArea jta;public JButton jb;HashMap hm=new HashMap();JLabel inof;JTextField name;JCheckBox check;OutputStream soc_out;Vector Thread_vector=new Vector();public ServerHost(){jf=new JFrame("Server Chat Room");jta=new JTextArea(10,30);jta.setEditable(false);jsp=newJScrollPane(jta,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_ SCROLLBAR_AS_NEEDED);jt=new JTextField(30);jt.addActionListener(this);jb=new JButton("Send The Message");jb.addActionListener(this);check=new JCheckBox("Send to all");check.setSelected(true);inof=new JLabel("write the name you want to send");name=new JTextField(5);name.enable(false);JPanel jp=new JPanel();jp.setLayout(new FlowLayout());jp.add(inof);jp.add(name);jp.add(jt);jp.add(jb);jp.add(check);Container c=jf.getContentPane();c.setLayout(new GridBagLayout());GridBagConstraints gbc=new GridBagConstraints();gbc.gridx=0;gbc.gridy=0;c.add(jsp,gbc);gbc.gridy=1;c.add(jp,gbc);jf.pack();jf.setVisible(true);}public void windowClosing(WindowEvent e){System.exit(0); }public static void main(String[] args) {ServerHost sh=new ServerHost();new Thread(sh).start(); }public void run(){ServerSocket ssc=null;try{ssc=new ServerSocket(55555);}catch(Exception e){System.out.print("1");}while(true){try{Socket soc=ssc.accept();BufferedReaderBsoc_in=new BufferedReader(new InputStreamReader(soc.getInputStream()));String s=Bsoc_in.readLine();hm.put(soc,s);ServerThread st=new ServerThread(soc);Thread_vector.addElement(soc);new Thread(st).start();}catch(Exception e){System.out.print("2");}} }public void actionPerformed(ActionEvent e){boolean find=false;String temp="";try{if(check.isSelected()){for(int i=0;i<Thread_vector.size();i++){Socket s=(Socket)(Thread_vector.elementAt(i));PrintWriterPsoc_out=newPrintWriter( s.getOutputStream(),true);temp="Server:"+jt.getText()+"\n";Psoc_out.println("Server:"+jt.getText());Psoc_out.flush(); }jta.append(temp);jt.setText(""); }else{System.out.print("aaaaaaaa");Set shm=hm.keySet();Iterator it=shm.iterator();while(it.hasNext()){Map.Entry me=(Map.Entry)(it.next());String Sstr=(String)(me.getValue());if(Sstr.equals(name.getText())){Socket Smsoc=(Socket)(me.getKey());PrintWriterPsoc_out=newPrintWriter( Smsoc.getOutputStream(),true);Psoc_out.println(name.getText()+jt.getText());find=true; } }if(find==false){new JOptionPane().showMessageDialog(null,"Can not find the Clientuser");} }}catch(Exception e3){e3.printStackTrace();}}}class ServerThread implements Runnable{Socket socket;InputStream soc_in;BufferedReader Bsoc_in;ServerThread(Socket socket){this.socket=socket;}public void run(){try{soc_in=socket.getInputStream();Bsoc_in=new BufferedReader(new InputStreamReader(soc_in));String s=Bsoc_in.readLine();while(true){if(s!=null)ServerHost.jta.append(s+"\n");s=Bsoc_in.readLine();}}catch(Exception e){System.out.print("3");}}}。