• 聊天室(Java实现)


     

    功能:

      登录

        若用户账号不存在,弹出错误

        若用户密码错误,弹出错误

        若用户账号已在线,弹出错误

          

          

          

      注册

        若用户已注册,弹出错误

             

            

      聊天室

        多人聊天,类似QQ里的群。

        点击右侧的在线用户,可进行一对一聊天。 

          

      一对一聊天

        在聊天室中点击在线用户可进入此窗口。

        发送消息后,对方会收到消息,并弹出一对一聊天窗口 。

          


    说明:

        服务端的IP和端口固定。(代码中使用127.0.0.1作为服务端的IP)

        客户端通过该IP和端口访问服务器。

        客户端向服务器发送消息,服务器根据消息做出不同的处理,并可能向其他客户端发送消息。

        每个客户端都有一个客户端server进程,以接收服务端发来的消息。

        初始化客户端时,启动客户端server进程,监听任意一个可用端口。用户登录时,将本地账户、密码、本地的server进程端口发给服务端,服务端检验用户合法性,若合 法,则更新该账户的IP地址和端口。以后服务端即可向该IP发送消息。


    代码:

       项目工程结构:

        

    Server

     1 package chatroomutil;
     2 
     3 import java.io.BufferedReader;
     4 import java.io.IOException;
     5 import java.io.PrintWriter;
     6 import java.net.ServerSocket;
     7 import java.net.Socket;
     8 
     9 public abstract class Server {
    10     protected ServerSocket sSocket;
    11     public Server() {
    12     }
    13     protected int listen() {
    14         while (true) {
    15             Socket ots = null;
    16             try {
    17                 ots = sSocket.accept();
    18             } catch (IOException e) {
    19                 ChatRoomUtil.showErrorBox("服务器Accept错误");
    20                 System.exit(-1);
    21             }
    22             Thread hThread = new Thread(new handleThread(ots));
    23             hThread.start();
    24         }
    25     }
    26     // 处理消息的进程 的内部类
    27     class handleThread implements Runnable {
    28         Socket ots;
    29         handleThread(Socket ots) {
    30             this.ots = ots;
    31         }
    32         @Override
    33         public void run() {
    34             handleMessage(ots);
    35         }
    36     };
    37     protected abstract String handle(Socket ots,String rMessage);//处理函数,输入收到的消息,返回要发送的消息
    38     private String handleMessage(Socket ots) {
    39         StringBuffer buffer=new StringBuffer();
    40         BufferedReader reader=ChatRoomUtil.getMsgFromSocket(ots,buffer);//获取消息
    41         String rMessage = buffer.toString();
    42         String message=handle(ots,rMessage);//处理消息
    43         PrintWriter writer=ChatRoomUtil.putMesgToSocket(ots, message);//发送消息
    44         ChatRoomUtil.closeSocket(ots,reader,writer);//关闭
    45         return null;
    46     }
    47 }

     ChatRoomUtil

     1 package chatroomutil;
     2 import java.io.BufferedReader;
     3 import java.io.IOException;
     4 import java.io.InputStreamReader;
     5 import java.io.PrintWriter;
     6 import java.net.Socket;
     7 import javax.swing.JOptionPane;
     8 
     9 public class ChatRoomUtil {
    10     public static String showErrorBox(String message) {//显示错误信息对话框
    11         JOptionPane.showMessageDialog(null, message, "错误",
    12                 JOptionPane.ERROR_MESSAGE);
    13         return message;
    14     }
    15     //获取消息
    16     public static BufferedReader getMsgFromSocket(Socket socket,StringBuffer buffer){
    17         BufferedReader reader = null;
    18         try {
    19             reader = new BufferedReader(
    20                     new InputStreamReader(socket.getInputStream()));
    21         } catch (IOException e) {
    22             ChatRoomUtil.showErrorBox("获取Socket输入流错误");
    23             System.exit(-1);
    24         }
    25         try {
    26             String line = "";
    27             while ((line = reader.readLine()) != null) {
    28                 buffer.append(line + "\n");
    29             }
    30             buffer.deleteCharAt(buffer.length()-1);//去掉最后一个回车符
    31         } catch (IOException e) {
    32             ChatRoomUtil.showErrorBox("读取Socket输入流错误");
    33             System.exit(-1);
    34         }
    35         try {
    36             socket.shutdownInput();
    37         } catch (IOException e) {
    38             ChatRoomUtil.showErrorBox("关闭Socket输入时发生错误");
    39             System.exit(-1);
    40         }
    41         return reader; 
    42     }
    43     //发送消息
    44     public static PrintWriter putMesgToSocket(Socket socket,String message){
    45         PrintWriter writer = null;
    46         try {
    47             writer = new PrintWriter(socket.getOutputStream());
    48         } catch (IOException e) {
    49             ChatRoomUtil.showErrorBox("获取Socket输出流错误");
    50             System.exit(-1);
    51         }
    52         writer.println(message);
    53         writer.flush();
    54         try {
    55             socket.shutdownOutput();
    56         } catch (IOException e1) {
    57             ChatRoomUtil.showErrorBox("关闭Socket输出时发生错误");
    58             System.exit(-1);
    59         }
    60         return writer;
    61     }
    62     //关闭socket、输入流、输出流
    63     public static void closeSocket(Socket socket,BufferedReader reader,PrintWriter writer ){
    64         try {
    65             reader.close();
    66         } catch (IOException e) {
    67             ChatRoomUtil.showErrorBox("关闭Scoket输入流时发生错误");
    68             System.exit(-1);
    69         }
    70         writer.close();
    71         try {
    72             socket.close();
    73         } catch (IOException e) {
    74             ChatRoomUtil.showErrorBox("关闭Scoket输出流时发生错误");
    75             System.exit(-1);
    76         }
    77     }
    78 }

     ServerServer

      1 package chatroomserver;
      2 import java.io.BufferedReader;
      3 import java.io.FileNotFoundException;
      4 import java.io.FileReader;
      5 import java.io.IOException;
      6 import java.io.RandomAccessFile;
      7 import java.net.ServerSocket;
      8 import java.net.Socket;
      9 import java.util.Enumeration;
     10 import java.util.Hashtable;
     11 import chatroomsend.Send;
     12 import chatroomutil.ChatRoomUtil;
     13 import chatroomutil.Server;
     14 
     15 public class ServerServer extends Server {
     16     Hashtable<String, User> onlineTable = new Hashtable<String, User>();// 在线用户集合
     17     Hashtable<String, User> offlineTable = new Hashtable<String, User>();// 离线用户集合
     18     // 用户内部类
     19     class User {
     20         String id;
     21         String pwd;
     22         String IP;
     23         int port;
     24         User(String id, String pwd) {
     25             this.id = id;
     26             this.pwd = pwd;
     27         }
     28     }
     29     // 发送进程内部类
     30     class sendThread implements Runnable {
     31         String mesg;
     32         String IP;
     33         int port;
     34         sendThread(String IP, int port, String mesg) {
     35             this.IP = IP;
     36             this.port = port;
     37             this.mesg = mesg;
     38         }
     39         @Override
     40         public void run() {
     41             Send sendClient = new Send();
     42             sendClient.connect(IP, port, 1000);
     43             sendClient.send(mesg);
     44         }
     45     };
     46     public ServerServer(int port) throws IOException {
     47         init(port);
     48         initUsers();
     49         listen();
     50     }
     51     private int init(int port) throws IOException {
     52         try {
     53             sSocket = new ServerSocket(port);//绑定指定端口
     54         } catch (IOException e) {
     55             ChatRoomUtil.showErrorBox("服务器初始化失败,无法绑定端口。");
     56             System.exit(-1);
     57         }
     58         return port;
     59     }
     60     private int initUsers() {//读取Users文件,初始化offlineTable
     61         BufferedReader reader = null;
     62         try {
     63             reader = new BufferedReader(new FileReader("Users.txt"));
     64         } catch (FileNotFoundException e1) {
     65             ChatRoomUtil.showErrorBox("无法找到User文件");
     66             System.exit(-1);
     67         }
     68         String line;
     69         String[] fa;
     70         try {
     71             while ((line = reader.readLine()) != null) {
     72                 fa = line.split(":", 2);
     73                 User f = new User(fa[0], fa[1]);
     74                 offlineTable.put(fa[0], f);
     75             }
     76             reader.close();
     77         } catch (IOException e) {
     78             ChatRoomUtil.showErrorBox("读取User文件错误");
     79             System.exit(-1);
     80         }
     81         return 0;
     82     }
     83     private int saveNewUser(String id, String pwd) {//将新用户写入Users文件最后
     84         try {
     85             RandomAccessFile file = new RandomAccessFile("Users.txt", "rw");
     86             file.seek(file.length());
     87             file.writeBytes(id + ":" + pwd + "\r\n");
     88             file.close();
     89         } catch (FileNotFoundException e) {
     90             ChatRoomUtil.showErrorBox("写入User文件错误");
     91             System.exit(-1);
     92         } catch (IOException e) {
     93             ChatRoomUtil.showErrorBox("写入User文件错误");
     94             System.exit(-1);
     95         }
     96         return 0;
     97     }
     98     String loginCheck(String id, String pwd, String IP, int port) {//检查登录用户的合法性
     99         System.out.println("logi check");
    100         if (onlineTable.containsKey(id))
    101             return "alreadyonline";//该用户已在线
    102         User f = offlineTable.get(id);
    103         if (f == null)
    104             return "nothisid";//无此用户
    105         if (f.pwd.compareTo(pwd) == 0) {
    106             oneUserOnline(id, IP, port);
    107             sendOnlinesToNewOnlineUser(id, IP, port);
    108             sendNewOnlineUserToOnlines(id);
    109             return "yes";//合法
    110         } else {
    111             return "wrong";//密码错误
    112         }
    113     }
    114     int oneUserOnline(String id, String IP, int port) {//一个新用户上线
    115         User f = offlineTable.get(id);
    116         offlineTable.remove(id);
    117         onlineTable.put(id, f);
    118         f.IP = IP;
    119         f.port = port;
    120         return 0;
    121     }
    122     int sendNewOnlineUserToOnlines(String id) {//给所有在线用户发送新上线的用户的id
    123         Enumeration<User> fs = onlineTable.elements();
    124         while (fs.hasMoreElements()) {
    125             User f = fs.nextElement();
    126             if (f.id.compareTo(id) != 0) {
    127                 Thread hThread = new Thread(
    128                         new sendThread(f.IP, f.port, "newf" + id));
    129                 hThread.start();
    130             }
    131         }
    132         return 0;
    133     }
    134     int sendMesg(String mesg) {//向所有在线用户转发一条消息
    135         Enumeration<User> fs = onlineTable.elements();
    136         while (fs.hasMoreElements()) {
    137             User f = fs.nextElement();
    138             Thread hThread = new Thread(
    139                     new sendThread(f.IP, f.port, "mesg" + mesg));
    140             hThread.start();
    141         }
    142         return 0;
    143     }
    144     int sendChat(String id, String mesg) {//向一个用户发送一条一对一聊天的消息
    145         User f = onlineTable.get(id);
    146         Thread hThread = new Thread(
    147                 new sendThread(f.IP, f.port, "chat" + mesg));
    148         hThread.start();
    149         return 0;
    150     }
    151     String newRegisUser(String id, String pwd) {//有新注册的用户
    152         if (onlineTable.containsKey(id) || offlineTable.containsKey(id)) {
    153             return "no";
    154         }
    155         offlineTable.put(id, new User(id, pwd));
    156         saveNewUser(id, pwd);
    157         return "yes";
    158     }
    159     int sendOnlinesToNewOnlineUser(String id, String IP, int port) {//给新上线的用户发送所有已在线用户的id
    160         if (onlineTable.isEmpty() || onlineTable.size() == 1) {
    161             return 0;
    162         }
    163         StringBuffer strBuf = new StringBuffer();
    164         Enumeration<User> fs = onlineTable.elements();
    165         while (fs.hasMoreElements()) {
    166             User f = fs.nextElement();
    167             if (f.id.compareTo(id) != 0) {
    168                 strBuf.append(f.id);
    169                 strBuf.append(";");
    170             }
    171         }
    172         String str = strBuf.toString();
    173         Thread hThread = new Thread(new sendThread(IP, port, "newf" + str));
    174         hThread.start();
    175         return 0;
    176     }
    177     int oneUserOffline(String id) {//有一个用户下线,将其下线消息发送给所有在线用户
    178         Enumeration<User> fs = onlineTable.elements();
    179         while (fs.hasMoreElements()) {
    180             User f = fs.nextElement();
    181             if (f.id.compareTo(id) == 0) {
    182                 onlineTable.remove(id);
    183                 offlineTable.put(id, f);
    184             } else {
    185                 Thread hThread = new Thread(
    186                         new sendThread(f.IP, f.port, "offl" + id));
    187                 hThread.start();
    188             }
    189         }
    190         return 0;
    191     }
    192     protected  String handle(Socket ots,String rMessage){
    193         System.out.println("handle");
    194         if (rMessage.startsWith("regi")) {//注册
    195             rMessage = rMessage.substring("regi".length());
    196             String id = rMessage.substring(0, rMessage.indexOf(','));
    197             String pwd = rMessage.substring(rMessage.indexOf(',') + 1);
    198             return newRegisUser(id, pwd);
    199         }
    200         if (rMessage.startsWith("logi")) {//登录
    201             System.out.println("logi");
    202             rMessage = rMessage.substring("logi".length());
    203             String id = rMessage.substring(0, rMessage.indexOf(','));
    204             String pwd = rMessage.substring(rMessage.indexOf(',') + 1,
    205                     rMessage.lastIndexOf(','));
    206             String portstr = rMessage.substring(rMessage.lastIndexOf(',') + 1);
    207             int port = new Integer(portstr);
    208             String IP = ots.getInetAddress().getHostAddress();
    209             return loginCheck(id, pwd, IP, port);
    210         }
    211         if (rMessage.startsWith("mesg")) {//聊天室消息
    212             String mesg = rMessage.substring(("mesg").length());
    213             sendMesg(mesg);
    214             return "getm";
    215         }
    216         if (rMessage.startsWith("chat")) {//一对一消息
    217             String chat = rMessage.substring(("chat").length());
    218             String id = chat.substring(0, chat.indexOf(':'));
    219             String mesg = chat.substring(chat.indexOf(':') + 1);
    220             sendChat(id, mesg);
    221             return "getm";
    222         }
    223         if (rMessage.startsWith("offl")) {//下线
    224             String id = rMessage.substring(("offl").length());
    225             oneUserOffline(id);
    226             return "getm";
    227         }
    228         return "getm";
    229     }
    230 
    231     public static void main(String[] args) {
    232         try {
    233             new ServerServer(65142);
    234         } catch (IOException e) {
    235             e.printStackTrace();
    236         }
    237     }
    238 }

     Send

     1 package chatroomsend;
     2 import java.io.BufferedReader;
     3 import java.io.IOException;
     4 import java.io.PrintWriter;
     5 import java.net.InetSocketAddress;
     6 import java.net.Socket;
     7 import chatroomutil.ChatRoomUtil;
     8 
     9 public class Send {
    10     Socket socket;
    11     public Send() {
    12         super();
    13         socket = new Socket();
    14     }
    15     public int connect(String IP, int port, int timeout) {//连接
    16         try {
    17             socket.connect(new InetSocketAddress(IP, port), timeout);
    18         } catch (IOException e) {
    19             return -1;
    20         }
    21         return 0;
    22     }
    23     public String send(String message) {
    24         PrintWriter writer=ChatRoomUtil.putMesgToSocket(socket, message);
    25         StringBuffer buffer=new StringBuffer();
    26         BufferedReader reader=ChatRoomUtil.getMsgFromSocket(socket,buffer);
    27         String rMessage = buffer.toString();
    28         ChatRoomUtil.closeSocket(socket,reader,writer);
    29         return rMessage;
    30     }
    31 }

     LoginBox

      1 package chatroomclient;
      2 import java.awt.*;
      3 import java.awt.event.ActionEvent;
      4 import java.awt.event.ActionListener;
      5 import java.awt.event.MouseEvent;
      6 import java.awt.event.MouseListener;
      7 import java.io.IOException;
      8 import javax.swing.*;
      9 import chatroomsend.Send;
     10 import chatroomutil.ChatRoomUtil;
     11 
     12 public class LoginBox extends JFrame implements ActionListener, MouseListener {
     13     private static final long serialVersionUID = -329711894663212488L;
     14     ClientServer myServer;
     15     String serverIP;
     16     int serverPort;
     17     JLabel l_account = new JLabel();
     18     JLabel l_password = new JLabel();
     19     JLabel l_regist = new JLabel();
     20     JTextField j_account = new JTextField();
     21     JPasswordField j_password = new JPasswordField();
     22     JButton submit = new JButton();
     23     JButton cancel = new JButton();
     24     JLabel clearAccount = new JLabel();
     25     JLabel clearPassword = new JLabel();
     26     public LoginBox(String ip, int port) {
     27         super("登录");
     28         try {
     29             myServer = new ClientServer(serverIP, serverPort);
     30             Thread myServerThread = new Thread(myServer);
     31             myServerThread.start();
     32         } catch (IOException e) {
     33             ChatRoomUtil.showErrorBox("服务器进程初始化失败,无法绑定端口。");
     34             System.exit(-1);
     35         }
     36         serverIP = ip;
     37         serverPort = port;
     38         setLayout(null);
     39         l_account.setVisible(true);
     40         l_account.setBounds(80, 40, 50, 30);
     41         l_account.setText("账号:");
     42         l_password.setVisible(true);
     43         l_password.setBounds(80, 80, 50, 30);
     44         l_password.setText("密码:");
     45         j_account.setBounds(130, 40, 150, 30);
     46         j_password.setBounds(130, 80, 150, 30);
     47         clearAccount.setBounds(280, 42, 26, 26);
     48         clearPassword.setBounds(280, 82, 26, 26);
     49         submit.setBounds(100, 130, 80, 30);
     50         submit.setText("登录");
     51         cancel.setText("取消");
     52         clearAccount.setText("X");
     53         clearPassword.setText("X");
     54         clearAccount.setOpaque(true);
     55         clearPassword.setOpaque(true);
     56         clearAccount.setBackground(Color.LIGHT_GRAY);
     57         clearPassword.setBackground(Color.LIGHT_GRAY);
     58         clearAccount.setHorizontalAlignment(JLabel.CENTER);
     59         clearPassword.setHorizontalAlignment(JLabel.CENTER);
     60         submit.setBackground(Color.LIGHT_GRAY);
     61         cancel.setBackground(Color.LIGHT_GRAY);
     62         submit.addActionListener(this);
     63         cancel.addActionListener(this);
     64         cancel.setBounds(190, 130, 80, 30);
     65         l_regist.setBounds(270, 200, 70, 30);
     66         l_regist.setText("没有账号?");
     67         this.add(l_account);
     68         this.add(l_password);
     69         this.add(j_account);
     70         this.add(j_password);
     71         this.add(submit);
     72         this.add(cancel);
     73         this.add(l_regist);
     74         this.add(clearAccount);
     75         this.add(clearPassword);
     76         setBounds(480, 240, 370, 270);
     77         setVisible(true);
     78         setResizable(false);
     79         this.setDefaultCloseOperation(EXIT_ON_CLOSE);
     80         validate();
     81         l_regist.addMouseListener(this);
     82         clearAccount.addMouseListener(this);
     83         clearPassword.addMouseListener(this);
     84     }
     85     String checkPwd(String id, String pwd) {
     86         Send sendClient = new Send();
     87         sendClient.connect(serverIP, serverPort, 1000);
     88         String ret= sendClient
     89                 .send("logi" + id + "," + pwd + "," + myServer.getMyServerPort());
     90         if (ret.compareTo("yes") == 0) {
     91             myServer.chatRoom = new ChatRoom(id, serverIP, serverPort);
     92             dispose();
     93         } else if (ret.compareTo("wrong") == 0) {
     94             ChatRoomUtil.showErrorBox("登录失败,密码有误。");
     95         } else if (ret.compareTo("alreadyonline") == 0) {
     96             ChatRoomUtil.showErrorBox("登录失败,该账号已在线");
     97         } else if (ret.compareTo("nothisid") == 0) {
     98             ChatRoomUtil.showErrorBox("登录失败,账号不存在。");
     99             new RegisBox(serverIP, serverPort,
    100                     myServer.getMyServerPort());
    101         }
    102         return ret;
    103     }
    104     @Override
    105     public void actionPerformed(ActionEvent e) {
    106         Object t = e.getSource();
    107         if (e.getSource().getClass() == JButton.class) {
    108             JButton button = (JButton) (t);
    109             if (button.getText().compareTo("登录") == 0) {
    110                 String id = j_account.getText();
    111                 String pwd = String.valueOf(j_password.getPassword());
    112                 if (id.compareTo("") == 0 || pwd.compareTo("") == 0) {
    113                     ChatRoomUtil.showErrorBox("账号与密码均不能为空");
    114                     return;
    115                 }
    116                 checkPwd(id, pwd);
    117             }
    118             if (button.getText().compareTo("取消") == 0) {
    119                 dispose();
    120                 System.exit(0);
    121             }
    122         }
    123     }
    124     @Override
    125     public void mouseClicked(MouseEvent e) {
    126         if (e.getSource().equals(l_regist)) {
    127             new RegisBox(serverIP, serverPort,
    128                     myServer.getMyServerPort());
    129         }
    130         if (e.getSource().equals(clearAccount)) {
    131             j_account.setText("");
    132         }
    133         if (e.getSource().equals(clearPassword)) {
    134             j_password.setText("");
    135         }
    136     }
    137     @Override
    138     public void mousePressed(MouseEvent e) {
    139     }
    140     @Override
    141     public void mouseReleased(MouseEvent e) {
    142     }
    143 
    144     @Override
    145     public void mouseEntered(MouseEvent e) {
    146         Object x = e.getSource();
    147         if (x.equals(l_regist)) {
    148             JLabel l = (JLabel) x;
    149             l.setForeground(Color.blue);
    150         }
    151         if (x.equals(clearAccount) || x.equals(clearPassword)) {
    152             JLabel l = (JLabel) x;
    153             l.setBackground(Color.GRAY);
    154         }
    155     }
    156 
    157     @Override
    158     public void mouseExited(MouseEvent e) {
    159         Object x = e.getSource();
    160         if (x.equals(l_regist)) {
    161             JLabel l = (JLabel) x;
    162             l.setForeground(Color.BLACK);
    163         }
    164         if (x.equals(clearAccount) || x.equals(clearPassword)) {
    165             JLabel l = (JLabel) x;
    166             l.setBackground(Color.LIGHT_GRAY);
    167         }
    168     }
    169     public static void main(String[] args) {
    170         String serverIP = "127.0.0.1";
    171         int serverPort = 65142;
    172         new LoginBox(serverIP, serverPort);
    173     }
    174 }

     RegisBox

      1 package chatroomclient;
      2 import java.awt.*;
      3 import java.awt.event.ActionEvent;
      4 import java.awt.event.ActionListener;
      5 import javax.swing.*;
      6 import chatroomsend.Send;
      7 import chatroomutil.ChatRoomUtil;
      8 public class RegisBox extends JFrame implements ActionListener {
      9     private static final long serialVersionUID = 5795626909275119718L;
     10     String serverIP;
     11     int serverPort;
     12     int myServerPort;
     13     JLabel id_label = new JLabel();
     14     JLabel pwd_label = new JLabel();
     15     JLabel pwdCheck_label = new JLabel();
     16     JLabel num_label = new JLabel();
     17     JLabel firstName_label = new JLabel();
     18     JLabel lastName_label = new JLabel();
     19     JLabel age_label = new JLabel();
     20     JLabel sex_label = new JLabel();
     21     JTextField id_text = new JTextField();
     22     JPasswordField pwd_text = new JPasswordField();
     23     JPasswordField pwdCheck_text = new JPasswordField();
     24     JTextField num_text = new JTextField();
     25     JTextField firstName_text = new JTextField();
     26     JTextField lastName_text = new JTextField();
     27     JTextField age_text = new JTextField();
     28     JComboBox sex_box = new JComboBox();
     29     JButton cancel = new JButton();
     30     JButton regis = new JButton();
     31     public RegisBox(String serverIP, int serverPort, int myServerPort) {
     32         super();
     33         this.serverIP = serverIP;
     34         this.serverPort = serverPort;
     35         this.myServerPort = myServerPort;
     36         setLayout(null);
     37         setTitle("注册");
     38         id_label.setBounds(60, 23, 50, 20);
     39         pwd_label.setBounds(60, 53, 50, 20);
     40         pwdCheck_label.setBounds(50, 83, 70, 20);
     41         num_label.setBounds(60, 113, 50, 20);
     42         firstName_label.setBounds(60, 143, 50, 20);
     43         lastName_label.setBounds(60, 173, 50, 20);
     44         age_label.setBounds(60, 203, 50, 20);
     45         sex_label.setBounds(60, 233, 50, 20);
     46         id_text.setBounds(130, 20, 200, 26);
     47         pwd_text.setBounds(130, 50, 200, 26);
     48         pwdCheck_text.setBounds(130, 80, 200, 26);
     49         num_text.setBounds(130, 110, 200, 26);
     50         firstName_text.setBounds(130, 140, 200, 26);
     51         lastName_text.setBounds(130, 170, 200, 26);
     52         age_text.setBounds(130, 200, 200, 26);
     53         sex_box.setBounds(130, 230, 200, 26);
     54         regis.setBounds(190, 270, 70, 30);
     55         cancel.setBounds(270, 270, 70, 30);
     56         id_label.setText("账号");
     57         pwd_label.setText("密码");
     58         pwdCheck_label.setText("密码确认");
     59         num_label.setText("编号");
     60         firstName_label.setText("名");
     61         lastName_label.setText("姓");
     62         age_label.setText("年龄");
     63         sex_label.setText("性别");
     64         sex_box.addItem("男");
     65         sex_box.addItem("女");
     66         regis.setText("提交");
     67         cancel.setText("取消");
     68         regis.setBackground(Color.LIGHT_GRAY);
     69         cancel.setBackground(Color.LIGHT_GRAY);
     70         sex_box.setBackground(Color.LIGHT_GRAY);
     71         regis.addActionListener(this);
     72         cancel.addActionListener(this);
     73         this.add(id_label);
     74         this.add(pwd_label);
     75         this.add(pwdCheck_label);
     76         this.add(num_label);
     77         this.add(firstName_label);
     78         this.add(lastName_label);
     79         this.add(age_label);
     80         this.add(sex_label);
     81         this.add(id_text);
     82         this.add(pwd_text);
     83         this.add(pwdCheck_text);
     84         this.add(num_text);
     85         this.add(firstName_text);
     86         this.add(lastName_text);
     87         this.add(age_text);
     88         this.add(sex_box);
     89         this.add(regis);
     90         this.add(cancel);
     91         setBounds(200, 200, 500, 400);
     92         validate();
     93         setResizable(false);
     94         setVisible(true);
     95     }
     96     boolean regis(String serverIP, int serverPort, String id, String pwd,
     97             int myServerPort) {
     98         Send sendClient = new Send();
     99         sendClient.connect(serverIP, serverPort, 1000);
    100         if (sendClient.send("regi" + id + "," + pwd).compareTo("yes") == 0) {
    101             return true;
    102         }
    103         return false;
    104     }
    105     boolean check() {
    106         String id = id_text.getText();
    107         String pwd = String.valueOf(pwd_text.getPassword());
    108         String pwdc = String.valueOf(pwdCheck_text.getPassword());
    109         String fName = firstName_text.getText();
    110         String lName = lastName_text.getText();
    111         String age = age_text.getText();
    112         String num = num_text.getText();
    113         String sex = sex_box.getSelectedItem().toString();
    114         if (id.compareTo("") == 0) {
    115             ChatRoomUtil.showErrorBox("账号不能为空");
    116             return false;
    117         }
    118         if (pwd.compareTo("") == 0) {
    119             ChatRoomUtil.showErrorBox("密码不能为空");
    120             return false;
    121         }
    122         if (pwdc.compareTo("") == 0) {
    123             ChatRoomUtil.showErrorBox("请确认密码");
    124             return false;
    125         }
    126         if (pwd.compareTo(pwdc) != 0) {
    127             ChatRoomUtil.showErrorBox("两次输入的密码不符");
    128             return false;
    129         }
    130         if (num.compareTo("") == 0) {
    131             ChatRoomUtil.showErrorBox("编号不能为空");
    132             return false;
    133         }
    134         if (fName.compareTo("") == 0) {
    135             ChatRoomUtil.showErrorBox("名不能为空");
    136             return false;
    137         }
    138         if (lName.compareTo("") == 0) {
    139             ChatRoomUtil.showErrorBox("姓不能为空");
    140             return false;
    141         }
    142         if (age.compareTo("") == 0) {
    143             ChatRoomUtil.showErrorBox("年龄不能为空");
    144             return false;
    145         }
    146         if (sex.compareTo("") == 0) {
    147             ChatRoomUtil.showErrorBox("性别不能为空");
    148             return false;
    149         }
    150         if (regis(serverIP, serverPort, id, pwd, myServerPort)) {
    151             dispose();
    152         } else {
    153             ChatRoomUtil.showErrorBox("注册失败。该用户已存在");
    154             return false;
    155         }
    156         return true;
    157     }
    158     @Override
    159     public void actionPerformed(ActionEvent e) {
    160         Object t = e.getSource();
    161         if (e.getSource().getClass() == JButton.class) {
    162             JButton button = (JButton) (t);
    163             if (button.getText().compareTo("提交") == 0) {
    164                 check();
    165             }
    166             if (button.getText().compareTo("取消") == 0) {
    167                 dispose();
    168             }
    169         }
    170     }
    171 }

     ClientServer

     1 package chatroomclient;
     2 import java.io.IOException;
     3 import java.net.ServerSocket;
     4 import java.net.Socket;
     5 import chatroomutil.ChatRoomUtil;
     6 import chatroomutil.Server;
     7 
     8 public class ClientServer extends Server implements Runnable {
     9     ChatRoom chatRoom;
    10     private int myPort;
    11     public ClientServer(String serverIP, int serverPort) throws IOException {
    12         super();
    13         myPort = init();
    14     }
    15     int getMyServerPort() {
    16         return myPort;
    17     }
    18     private int createServerSocket(int i) throws IOException {//绑定端口i
    19         if (i >= 65536) {
    20             ChatRoomUtil.showErrorBox("ClientServer无端口可绑定");
    21             System.exit(-1);
    22         }
    23         try {
    24             sSocket = new ServerSocket(i);
    25         } catch (IOException e) {
    26             return createServerSocket(i + 1);
    27         }
    28         return i;
    29     }
    30     private int init() throws IOException {
    31         int port = createServerSocket(1025);
    32         return port;
    33     }
    34     @Override
    35     protected String handle(Socket ots,String rMessage){
    36         String message = "getm";
    37         if (rMessage.startsWith("newf")) {
    38             while (chatRoom == null) {
    39                 try {
    40                     Thread.sleep(300);
    41                 } catch (InterruptedException e) {
    42                     ChatRoomUtil.showErrorBox("ClientServer在Sleep时出错");
    43                     System.exit(-1);
    44                 }
    45             }
    46             String ids = rMessage.substring(("newf").length());
    47             String[] idArray = ids.split(";");
    48             chatRoom.addFriend(idArray);
    49         }
    50         if (rMessage.startsWith("offl")) {
    51             String name = rMessage.substring(("offl").length());
    52             chatRoom.removeFriend(name);
    53         }
    54         if (rMessage.startsWith("mesg")) {
    55             String mesg = rMessage.substring(("mesg").length());
    56             chatRoom.addRecord(mesg);
    57         }
    58         if (rMessage.startsWith("chat")) {
    59             String chat = rMessage.substring(("chat").length());
    60             String id = chat.substring(0, chat.indexOf(':'));
    61             String mesg = chat.substring(chat.indexOf(':') + 1);
    62             chatRoom.dialogAddRecord(id, mesg);
    63         }
    64         return message;
    65     }
    66     @Override
    67     public void run() {
    68         listen();
    69     }
    70 }

     ChatRoom

      1 package chatroomclient;
      2 import java.awt.*;
      3 import java.awt.event.ActionEvent;
      4 import java.awt.event.ActionListener;
      5 import java.awt.event.MouseEvent;
      6 import java.awt.event.MouseListener;
      7 import java.awt.event.WindowAdapter;
      8 import java.awt.event.WindowEvent;
      9 import java.util.HashSet;
     10 import java.util.Hashtable;
     11 import java.util.Iterator;
     12 import java.util.TimerTask;
     13 import javax.swing.*;
     14 import javax.swing.event.CaretEvent;
     15 import javax.swing.event.CaretListener;
     16 import chatroomsend.Send;
     17 import chatroomutil.ChatRoomUtil;
     18 
     19 public class ChatRoom extends JFrame implements ActionListener, MouseListener {
     20     private static final long serialVersionUID = -9016166784223701159L;
     21     String myId;
     22     String serverIP;
     23     int serverPort;
     24     JLabel chatRoomLabel = new JLabel();
     25     JLabel onlineLabel = new JLabel();
     26     JTextArea chatArea = new JTextArea();
     27     JPanel onlineArea = new JPanel();
     28     JTextArea sendArea = new JTextArea(5, 20);
     29     JButton sendButton = new JButton();
     30     JScrollPane chatScroll = new JScrollPane(chatArea);
     31     JScrollPane onlineScroll = new JScrollPane(onlineArea);
     32     JScrollPane sendScroll = new JScrollPane(sendArea);
     33     JPanel chatPanel = new JPanel();
     34     JPanel onlinePanel = new JPanel();
     35     JPanel sendPanel = new JPanel();
     36     JPanel chatAndOnlinePanel = new JPanel();
     37     HashSet<String> friends = new HashSet<String>();
     38     Hashtable<String, ChatDialog> chatDialogs = new Hashtable<String, ChatDialog>();
     39     BorderLayout mainLayout = new BorderLayout();
     40     BorderLayout chatLayout = new BorderLayout();
     41     BorderLayout onlineLayout = new BorderLayout();
     42     BorderLayout sendLayout = new BorderLayout();
     43     BorderLayout chatAndOnlineLayout = new BorderLayout();
     44     FlowLayout onlineAreaLayout = new FlowLayout();
     45     public ChatRoom(String id, String serverIP, int port) {
     46         super("聊天室   " + id);
     47         this.myId = id;
     48         this.serverIP = serverIP;
     49         this.serverPort = port;
     50         mainLayout.setVgap(5);
     51         sendLayout.setHgap(10);
     52         chatAndOnlineLayout.setHgap(15);
     53         onlineAreaLayout.setVgap(1);
     54         this.setLayout(mainLayout);
     55         chatPanel.setLayout(chatLayout);
     56         onlinePanel.setLayout(onlineLayout);
     57         sendPanel.setLayout(sendLayout);
     58         chatAndOnlinePanel.setLayout(chatAndOnlineLayout);
     59         chatArea.setLineWrap(true);
     60         sendArea.setLineWrap(true);
     61         onlineArea.setLayout(onlineAreaLayout);
     62         onlineArea.setPreferredSize(new Dimension(130, 200));
     63         sendButton.setText("   发送    ");
     64         sendButton.setBackground(Color.LIGHT_GRAY);
     65         sendButton.addActionListener(this);
     66         onlineLabel.setText("在线好友(点击可开始聊天)");
     67         chatRoomLabel.setText("聊天");
     68         chatArea.setEditable(false);
     69         chatArea.setBackground(new Color(230, 230, 230));
     70         chatPanel.add(chatRoomLabel, BorderLayout.NORTH);
     71         chatPanel.add(chatScroll, BorderLayout.CENTER);
     72         onlinePanel.add(onlineLabel, BorderLayout.NORTH);
     73         onlinePanel.add(onlineScroll, BorderLayout.CENTER);
     74         sendPanel.add(sendScroll, BorderLayout.CENTER);
     75         sendPanel.add(sendButton, BorderLayout.EAST);
     76         chatAndOnlinePanel.add(chatPanel, BorderLayout.CENTER);
     77         chatAndOnlinePanel.add(onlinePanel, BorderLayout.EAST);
     78         this.add(sendPanel, BorderLayout.SOUTH);
     79         this.add(chatAndOnlinePanel, BorderLayout.CENTER);
     80         friends.add(myId);
     81         this.setBounds(200, 200, 600, 650);
     82         setVisible(true);
     83         reFreshOnlineArea();
     84         this.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
     85         this.addWindowListener(new WindowAdapter() {
     86             public void windowClosing(WindowEvent e) {//点击关闭按钮时发送下线消息
     87                 sendOffLine();
     88                 System.exit(0);
     89             }
     90         });
     91         sendArea.addCaretListener(new CaretListener() {
     92             @Override
     93             public void caretUpdate(CaretEvent e) {
     94                 String str = sendArea.getText();
     95                 if (str.length() > 5000) {
     96                     ChatRoomUtil.showErrorBox("字数过多,超出限制。");
     97                 }
     98             }
     99         });
    100         new java.util.Timer().schedule(new TimerTask() {//定时刷新界面
    101             public void run() {
    102                 repaint();
    103             }
    104         }, 400, 400);
    105     }
    106     int reFreshOnlineArea() {//刷新当前在线用户
    107         int size = friends.size();
    108         onlineArea.removeAll();
    109         Iterator<String> it = friends.iterator();
    110         while (it.hasNext()) {
    111             String str = it.next();
    112             String id = str;
    113             JLabel label = new JLabel(id);
    114             label.addMouseListener(this);
    115             label.setPreferredSize(new Dimension(130, 20));
    116             label.setBackground(Color.GRAY);
    117             label.setForeground(Color.WHITE);
    118             label.setHorizontalAlignment(JLabel.CENTER);
    119             label.setOpaque(true);
    120             onlineArea.add(label);
    121         }
    122         onlineArea.setPreferredSize(new Dimension(130, size * 22));
    123         this.repaint();
    124         this.validate();
    125         return 0;
    126     }
    127     int sendOffLine() {//发送下线消息
    128         Send sendClient = new Send();
    129         sendClient.connect(serverIP, serverPort, 1000);
    130         sendClient.send("offl" + myId);
    131         return 0;
    132     }
    133     public int addFriend(String[] fs) {//添加上线的用户
    134         for (int i = 0; i < fs.length; i++) {
    135             friends.add(fs[i]);
    136         }
    137         reFreshOnlineArea();
    138         return 0;
    139     }
    140     public int removeFriend(String friendID) {//移除一个用户(已下线)
    141         friends.remove(friendID);
    142         reFreshOnlineArea();
    143         return 0;
    144     }
    145     public int addRecord(String mesg) {//添加聊天记录
    146         chatArea.append(mesg + "\n");
    147         chatArea.setCaretPosition(chatArea.getText().length());
    148         this.validate();
    149         return 0;
    150     }
    151     public int dialogAddRecord(String id, String mesg) {//给一对一聊天增加聊天记录
    152         if (chatDialogs.containsKey(id) == false) {
    153             chatDialogs.put(id,
    154                     new ChatDialog(this, myId, id, serverIP, serverPort));
    155         }
    156         chatDialogs.get(id).addRecord(mesg);
    157         return 0;
    158     }
    159     int removeDialog(String id) {//移除一对一聊天
    160         chatDialogs.remove(id);
    161         return 0;
    162     }
    163     private String sendMessage(String mesg) {//发送群聊消息
    164         Send sendClient = new Send();
    165         sendClient.connect(serverIP, serverPort, 1000);
    166         String getm = sendClient.send("mesg" + myId + ":  \n" + mesg);
    167         return getm;
    168     }
    169     @Override
    170     public void actionPerformed(ActionEvent e) {
    171         if (e.getSource().getClass() == JButton.class) {
    172             sendMessage(sendArea.getText());
    173             sendArea.setText("");
    174         }
    175     }
    176     @Override
    177     public void mouseClicked(MouseEvent e) {
    178         if (e.getSource().getClass() == JLabel.class) {
    179             JLabel l = (JLabel) e.getSource();
    180             if (l.getText().compareTo(myId) == 0) {
    181                 return;
    182             }
    183             if (chatDialogs.containsKey(l.getText())) {
    184                 return;
    185             }
    186             chatDialogs.put(l.getText(), new ChatDialog(this, myId, l.getText(),
    187                     serverIP, serverPort));
    188         }
    189     }
    190     @Override
    191     public void mouseEntered(MouseEvent e) {
    192         if (e.getSource().getClass() == JLabel.class) {
    193             JLabel l = (JLabel) e.getSource();
    194             l.setBackground(Color.LIGHT_GRAY);
    195             l.setForeground(Color.BLACK);
    196         }
    197     }
    198     @Override
    199     public void mouseExited(MouseEvent e) {
    200         if (e.getSource().getClass() == JLabel.class) {
    201             JLabel l = (JLabel) e.getSource();
    202             l.setBackground(Color.GRAY);
    203             l.setForeground(Color.WHITE);
    204         }
    205     }
    206     @Override
    207     public void mousePressed(MouseEvent e) {
    208     }
    209     @Override
    210     public void mouseReleased(MouseEvent e) {
    211     }
    212 }

     ChatDialog

      1 package chatroomclient;
      2 import java.awt.*;
      3 import java.awt.event.ActionEvent;
      4 import java.awt.event.ActionListener;
      5 import java.awt.event.WindowAdapter;
      6 import java.awt.event.WindowEvent;
      7 import java.util.HashSet;
      8 import java.util.TimerTask;
      9 import javax.swing.*;
     10 import javax.swing.event.CaretEvent;
     11 import javax.swing.event.CaretListener;
     12 import chatroomsend.Send;
     13 import chatroomutil.ChatRoomUtil;
     14 
     15 public class ChatDialog extends JFrame implements ActionListener {
     16     private static final long serialVersionUID = 1437996471885472344L;
     17     String myId;
     18     String otsId;
     19     String serverIP;
     20     int serverPort;
     21     JLabel chatRoomLabel = new JLabel();
     22     JTextArea chatArea = new JTextArea();
     23     JTextArea sendArea = new JTextArea(5, 20);
     24     JButton sendButton = new JButton();
     25     JScrollPane chatScroll = new JScrollPane(chatArea);
     26     JScrollPane sendScroll = new JScrollPane(sendArea);
     27     JPanel chatPanel = new JPanel();
     28     JPanel sendPanel = new JPanel();
     29     HashSet<String> friends = new HashSet<String>();
     30     BorderLayout mainLayout = new BorderLayout();
     31     BorderLayout chatLayout = new BorderLayout();
     32     BorderLayout sendLayout = new BorderLayout();
     33     ChatRoom chatRoom;
     34     public ChatDialog(final ChatRoom chatRoom, String id, final String otsId,
     35             String serverIP, int port) {
     36         super(id + "与" + otsId + "聊天");
     37         this.chatRoom = chatRoom;
     38         this.myId = id;
     39         this.otsId = otsId;
     40         this.serverIP = serverIP;
     41         this.serverPort = port;
     42         mainLayout.setVgap(5);
     43         sendLayout.setHgap(10);
     44         this.setLayout(mainLayout);
     45         chatPanel.setLayout(chatLayout);
     46         sendPanel.setLayout(sendLayout);
     47         chatArea.setLineWrap(true);
     48         sendArea.setLineWrap(true);
     49         sendButton.setText("   发送    ");
     50         sendButton.setBackground(Color.LIGHT_GRAY);
     51         sendButton.addActionListener(this);
     52         chatRoomLabel.setText("聊天");
     53         chatArea.setEditable(false);
     54         chatArea.setBackground(new Color(230, 230, 230));
     55         chatPanel.add(chatRoomLabel, BorderLayout.NORTH);
     56         chatPanel.add(chatScroll, BorderLayout.CENTER);
     57         sendPanel.add(sendScroll, BorderLayout.CENTER);
     58         sendPanel.add(sendButton, BorderLayout.EAST);
     59         this.add(sendPanel, BorderLayout.SOUTH);
     60         this.add(chatPanel, BorderLayout.CENTER);
     61         this.setBounds(200, 200, 530, 600);
     62         setVisible(true);
     63         this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
     64         sendArea.addCaretListener(new CaretListener() {
     65             @Override
     66             public void caretUpdate(CaretEvent e) {
     67                 String str = sendArea.getText();
     68                 if (str.length() > 5000) {
     69                     ChatRoomUtil.showErrorBox("字数过多,超出限制。");
     70                 }
     71             }
     72         });
     73         this.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
     74         this.addWindowListener(new WindowAdapter() {
     75             public void windowClosing(WindowEvent e) {//关闭窗口后,ChatRoom要移除该对话
     76                 chatRoom.removeDialog(otsId);
     77                 dispose();
     78             }
     79         });
     80         new java.util.Timer().schedule(new TimerTask() {
     81             public void run() {
     82                 repaint();
     83             }
     84         }, 400, 400);
     85     }
     86     public int addRecord(String mesg) {
     87         chatArea.append(mesg + "\n");
     88         chatArea.setCaretPosition(chatArea.getText().length());
     89         this.validate();
     90         return 0;
     91     }
     92     private String sendMessage(String mesg) {
     93         Send sendClient = new Send();
     94         sendClient.connect(serverIP, serverPort, 1000);
     95         String getm = sendClient.send(
     96                 "chat" + otsId + ":" + myId + ":" + myId + ":   \n" + mesg);
     97         addRecord(myId + ":   \n" + mesg);
     98         return getm;
     99     }
    100     @Override
    101     public void actionPerformed(ActionEvent e) {
    102         if (e.getSource().getClass() == JButton.class) {
    103             sendMessage(sendArea.getText());
    104             sendArea.setText("");
    105         }
    106     }
    107 }

    Users.txt

      1 1:1
      2 2:2
      3 3:3
      4 4:4
      5 5:5
      6 6:6
      7 7:7
      8 8:8
      9 9:9
     10 10:10
     11 11:11
     12 12:12
     13 13:13
     14 14:14
     15 15:15
     16 16:16
     17 17:17
     18 18:18
     19 19:19
     20 20:20
     21 21:21
     22 22:22
     23 23:23
     24 24:24
     25 25:25
     26 26:26
     27 27:27
     28 28:28
     29 29:29
     30 30:30
     31 31:31
     32 32:32
     33 33:33
     34 34:34
     35 35:35
     36 36:36
     37 37:37
     38 38:38
     39 39:39
     40 40:40
     41 41:41
     42 42:42
     43 43:43
     44 44:44
     45 45:45
     46 46:46
     47 47:47
     48 48:48
     49 49:49
     50 50:50
     51 51:51
     52 52:52
     53 53:53
     54 54:54
     55 55:55
     56 56:56
     57 57:57
     58 58:58
     59 59:59
     60 60:60
     61 61:61
     62 62:62
     63 63:63
     64 64:64
     65 65:65
     66 66:66
     67 67:67
     68 68:68
     69 69:69
     70 70:70
     71 71:71
     72 72:72
     73 73:73
     74 74:74
     75 75:75
     76 76:76
     77 77:77
     78 78:78
     79 79:79
     80 80:80
     81 81:81
     82 82:82
     83 83:83
     84 84:84
     85 85:85
     86 86:86
     87 87:87
     88 88:88
     89 89:89
     90 90:90
     91 91:91
     92 92:92
     93 93:93
     94 94:94
     95 95:95
     96 96:96
     97 aa:aa
     98 qq:qq
     99 ww:ww
    100 ee:ee
    101 guochengxin:guochengxin
    102 huoda:huoda
    103 zhangfa:zhangfa
    104 hanyu:hanyu
    105 maxuewei:maxuewei
    106 lizeyu:lizeyu

    End

    写于大三下实训期间

    随笔写于2016.7.13

  • 相关阅读:
    NumPy数组基本的索引和切片
    赫夫曼树编码解码实例(C)
    深度优先迷宫求解实例(C)
    创建ndarray的方法
    【学习笔记】计算机网络-利用TELNET进行SMTP的邮件发送
    【学习笔记】非递归实现先后根遍历二叉树
    【学习笔记】计算机网络-DNS层次查询
    【学习笔记】计算机网络-网络常用命令(一)
    【学习笔记】计算机网络-Ping命令(一)
    Win10下Wireshark找不到接口的解决办法
  • 原文地址:https://www.cnblogs.com/maxuewei2/p/5665298.html
Copyright © 2020-2023  润新知