Java Swing的界面,在线聊天室,一共三个类ChatRoomServer、 ChatRoomGUI和ChatRoomClient,其中ChatRoomServer和 ChatRoomGUI可以运行,运行时,先运行ChatRoomServer类,然后运行ChatRoomGUI类。
ChatRoomServer类
- package com.zuoshangs.code.chatroom;
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.io.PrintWriter;
- import java.net.ServerSocket;
- import java.net.Socket;
- import java.util.HashMap;
- import java.util.Map;
- public class ChatRoomServer {
- private ServerSocket ss;
- private Map<String,Socket> allOnlineUser;
- public ChatRoomServer(){
- try {
- ss=new ServerSocket(8989);
- allOnlineUser=new HashMap<String,Socket>();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- public void startService(){
- while(true){
- try {
- Socket s=ss.accept();
- new ChatRoomServerThread(s).start();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- public static void main(String[] args){
- new ChatRoomServer().startService();
- }
- class ChatRoomServerThread extends Thread{
- private Socket s;
- private BufferedReader br;
- private PrintWriter pw;
- public ChatRoomServerThread(Socket s){
- this.s=s;
- try {
- pw=new PrintWriter(s.getOutputStream());
- br=new BufferedReader(new InputStreamReader(s.getInputStream()));
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- public void run(){
- try {
- while(true){
- String mes=br.readLine();
- if(mes.indexOf(“%LOGIN%”)==0){
- String userName=mes.split(“:”)[1];
- if(allOnlineUser.containsKey(userName)){
- pw.println(“LOGIN_FAIL”);
- pw.flush();
- }else{
- allOnlineUser.put(mes.split(“:”)[1],s);
- pw.println(“LOGIN_OK”);
- pw.flush();
- sendCurrentUserList();
- }
- }else if(mes.indexOf(“%MESS%”)==0){
- sendMessage(mes);
- }else if(mes.indexOf(“%EXIT%”)==0){
- allOnlineUser.remove(mes.split(“:”)[1]);
- sendCurrentUserList();
- break;
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- }finally{
- if(s!=null)try{s.close();}catch(IOException e){}
- }
- }
- public void sendMessage(String mesg)throws IOException{
- String toUser=mesg.split(“:”)[2];
- if(toUser.equals(“所有人”)){
- for(Socket temp:allOnlineUser.values()){
- PrintWriter pw=new PrintWriter(temp.getOutputStream());
- pw.println(mesg);
- pw.flush();
- }
- }else{
- Socket temps=allOnlineUser.get(toUser);
- if(temps==null){
- System.out.println(“人名未找到!”);
- return ;
- }
- PrintWriter pw=new PrintWriter(temps.getOutputStream());
- pw.println(mesg);
- pw.flush();
- }
- }
- public void sendCurrentUserList()throws IOException{
- StringBuffer sb=new StringBuffer();
- for(String str:allOnlineUser.keySet()){
- sb.append(str+“,”);
- }
- for(Socket temp:allOnlineUser.values()){
- PrintWriter pw=new PrintWriter(temp.getOutputStream());
- pw.println(“%USER_LIST%:”+sb.toString());
- pw.flush();
- }
- }
- }
- }
ChatRoomGUI类
- package com.zuoshangs.code.chatroom;
- import java.awt.BorderLayout;
- import java.awt.Color;
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener;
- import java.awt.event.WindowAdapter;
- import java.awt.event.WindowEvent;
- import java.util.Date;
- import java.util.HashSet;
- import java.util.List;
- import java.util.Set;
- import javax.swing.BoxLayout;
- import javax.swing.JButton;
- import javax.swing.JComboBox;
- import javax.swing.JFrame;
- import javax.swing.JLabel;
- import javax.swing.JOptionPane;
- import javax.swing.JPanel;
- import javax.swing.JScrollPane;
- import javax.swing.JTextArea;
- import javax.swing.JTextField;
- public class ChatRoomGUI extends JFrame implements ActionListener{
- private static final long serialVersionUID = 1L;
- private JTextArea area;
- private JButton send;
- private JTextField field;
- private JLabel label;
- private ChatRoomClient client;
- private String currentUser;
- private String[] onLineUserList;
- private JComboBox box;
- private JPanel eastPanel;
- private Boolean flag=null;
- public ChatRoomGUI(){
- super(“网络聊天室客户端v1.0″);
- client=new ChatRoomClient(“127.0.0.1″,8989);
- do {
- currentUser = JOptionPane.showInputDialog(“请输入用户名:”);
- client.send(“%LOGIN%:”+currentUser);
- String str=client.read();
- if(str.equals(“LOGIN_OK”)){
- break;
- }
- JOptionPane.showMessageDialog(this, currentUser+“用户名已经存在,请重新输入!”);
- } while (true);
- area=new JTextArea(20,40);
- send=new JButton(“发送”);
- field=new JTextField(25);
- label=new JLabel(currentUser+“:”);
- box=new JComboBox();
- onLineUserList=new String[0];
- init();
- addEventHandler();
- }
- private void init(){
- JScrollPane jsp=new JScrollPane(area);
- JPanel panel=new JPanel();
- eastPanel=new JPanel();
- eastPanel.setLayout(new BoxLayout(eastPanel,BoxLayout.Y_AXIS));
- JScrollPane jsp2=new JScrollPane(eastPanel);
- refreshGUIUserList();
- panel.add(label);
- panel.add(new JLabel(“对”));
- panel.add(box);
- panel.add(new JLabel(“说:”));
- panel.add(field);
- panel.add(send);
- this.add(jsp,BorderLayout.CENTER);
- this.add(panel,BorderLayout.SOUTH);
- this.add(jsp2,BorderLayout.EAST);
- }
- class ButtonAction implements ActionListener{
- public void actionPerformed(ActionEvent e) {
- String userName=e.getActionCommand();
- box.setSelectedItem(userName);
- }
- }
- public void actionPerformed(ActionEvent e) {
- String str=field.getText();
- if(str==null || str.trim().equals(“”)){
- JOptionPane.showMessageDialog(this, “不能发送空消息!”);
- }
- client.send(“%MESS%:”+currentUser+“:”+box.getSelectedItem()+“:”+str);
- field.setText(“”);
- }
- private void addEventHandler(){
- send.addActionListener(this);
- field.addActionListener(this);
- this.addWindowListener(new WindowAdapter(){
- public void windowClosing(WindowEvent e) {
- int op=JOptionPane.showConfirmDialog(ChatRoomGUI.this,“确定要退出聊天室吗?”,“确认退出”,JOptionPane.OK_CANCEL_OPTION);
- if(op==JOptionPane.OK_OPTION){
- client.send(“%EXIT%:”+currentUser);
- try {
- Thread.sleep(300);
- } catch (InterruptedException e1) {
- e1.printStackTrace();
- }
- System.exit(0);
- }
- }
- });
- }
- public void showMe(){
- this.pack();
- this.setVisible(true);
- this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
- new ReadMessageThread().start();
- }
- public static void main(String[] arfs){
- new ChatRoomGUI().showMe();
- }
- public void refreshGUIUserList(){
- box.removeAllItems();
- box.addItem(“所有人”);
- for(String user:onLineUserList){
- box.addItem(user);
- }
- eastPanel.removeAll();
- eastPanel.add(new JLabel(“在线用户列表:”));
- JButton button;
- ActionListener lis=new ButtonAction();
- eastPanel.add(button=new JButton(“所有人”));
- button.setBackground(Color.WHITE);
- button.addActionListener(lis);
- for(String user:onLineUserList){
- eastPanel.add(button=new JButton(user));
- button.setBackground(Color.WHITE);
- button.addActionListener(lis);
- }
- }
- class ReadMessageThread extends Thread{
- public void run(){
- while(true){
- System.out.println(“Thread start!”);
- String mesg=client.read();
- String[] ss=mesg.split(“:”);
- if(ss[0].equals(“%MESS%”)){
- area.append(mesg+“\n”);
- }else if(ss[0].equals(“%USER_LIST%”)){
- onLineUserList=ss[1].split(“,”);
- refreshGUIUserList();
- }
- }
- }
- }
- }
ChatRoomClient类
- package com.zuoshangs.code.chatroom;
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.io.PrintWriter;
- import java.net.Socket;
- import java.net.UnknownHostException;
- public class ChatRoomClient {
- private Socket s;
- private BufferedReader br;
- private PrintWriter pw;
- public ChatRoomClient(String host,int port){
- try {
- s=new Socket(host,port);
- br=new BufferedReader(new InputStreamReader(s.getInputStream()));
- pw=new PrintWriter(s.getOutputStream());
- } catch (UnknownHostException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- public void send(String mesg){
- pw.println(mesg);
- pw.flush();
- }
- public String read(){
- try {
- return br.readLine();
- } catch (Exception e) {
- e.printStackTrace();
- }
- return null;
- }
- }







谢谢博主了!!复制走啦!!