• Java实现简易聊天室


    Java实现简易聊天室

    在学习《Java从入门到精通》这本书,网络通信,基于TCP实现的简易聊天室,我这里对书中的代码略做了修改,做个记录。

    这里先放一下运行效果图,代码放在最后。

    运行效果:

    先启动服务器端:

    启动客户端:

     发送数据:

     主要的功能就是上面那些,在代码中我还添加一些功能,比如说给JTextField添加了焦点监听器,以及输入框为空的检查和提示,但总的来说还是比较简单,如果要实现健壮的聊天室程序还需要再做些修改。

    下面放下代码,比较简单,就服务器端和客户端两个代码。

    服务器端代码:

    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.net.ServerSocket;
    import java.net.Socket;
    import static java.lang.System.out;
    
    public class MyTcp {
        
        private BufferedReader reader;
        private ServerSocket server;
        private Socket socket;
        
        void getServer(){
            try {
                server=new ServerSocket(8998);        //实例化Socket对象
                out.println("服务器套接字已创建成功");
                
                while(true) {
                    out.println("等待客户机的连接");
                    socket=server.accept();           //accept()方法会返回一个和客户端Socket对象相连的Socket对象
                    reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    getClientMessage();
                }
            }catch(Exception e) {
                e.printStackTrace();
            }
        }
        
        //读取客户端发送过来的信息
        private void getClientMessage() {
            try {
                while(true) {
                    //获得客户端信息
                    out.println("客户机:"+reader.readLine());
                }
            }catch(Exception e) {
                e.printStackTrace();
            }
            try {
                if(reader!=null) {
                    reader.close();
                }
                if(socket!=null) {
                    socket.close();
                }
            }catch(Exception e) {
                e.printStackTrace();
            }
        }
    
        
        public static void main(String[] args) {
            MyTcp tcp=new  MyTcp();
            tcp.getServer();
        }
    
    }

    客户端代码:

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Container;
    import java.awt.EventQueue;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.FocusEvent;
    import java.awt.event.FocusListener;
    import java.io.PrintWriter;
    import java.net.Socket;
    
    import javax.swing.JFrame;
    import javax.swing.JOptionPane;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    import javax.swing.JTextField;
    import javax.swing.border.BevelBorder;
    
    public class MyClient extends JFrame{
        
        private PrintWriter writer;
        Socket socket;
        private JTextArea ta=new JTextArea();
        private JTextField tf=new JTextField();
        Container cc;
        
        public MyClient(String title) {
            super(title);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            cc=this.getContentPane();
            
            final JScrollPane scrollPane=new JScrollPane();
            scrollPane.setBorder(new BevelBorder(BevelBorder.RAISED));
            getContentPane().add(scrollPane,BorderLayout.CENTER);
            scrollPane.setViewportView(ta);
            cc.add(tf,"South");
            
            tf.addFocusListener(new JTextFieldListener(tf,"请在此输入内容"));
            tf.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    if(tf.getText().isEmpty()) {
                        JOptionPane.showMessageDialog(MyClient.this, "请输入内容!");
                    }else {
                        writer.println(tf.getText());
                        
                        ta.append(tf.getText()+"
    ");
                        ta.setSelectionEnd(ta.getText().length());
                        tf.setText("");
                    }
                    
                    
                }
            });
        }
        
        //焦点监听器
        class JTextFieldListener implements FocusListener{
            
            private String hintText;          //提示文字
            private JTextField textField;
            
            public JTextFieldListener(JTextField textField,String hintText) {
                this.textField=textField;
                this.hintText=hintText;
                textField.setText(hintText);   //默认直接显示
                textField.setForeground(Color.GRAY);
            }
    
            @Override
            public void focusGained(FocusEvent e) {
                
                //获取焦点时,清空提示内容
                String temp=textField.getText();
                if(temp.equals(hintText)){
                    textField.setText("");
                    textField.setForeground(Color.BLACK);
                }
                
            }
    
            @Override
            public void focusLost(FocusEvent e) {
                
                //失去焦点时,没有输入内容,显示提示内容
                String temp=textField.getText();
                if(temp.equals("")) {
                    textField.setForeground(Color.GRAY);
                    textField.setText(hintText);
                }
                
            }
            
        }
        
        private void connect() {
            ta.append("尝试连接
    ");
            try {
                socket=new Socket("127.0.0.1",8998);
                writer=new PrintWriter(socket.getOutputStream(),true);
                
                ta.append("完成连接
    ");
                
            }catch(Exception e) {
                e.printStackTrace();
            }
        }
    
        public static void main(String[] args) {
            
            //EventQueue事件队列,封装了异步事件指派机制
            EventQueue.invokeLater(new Runnable(){
                public void run() {
                    MyClient client=new MyClient("向服务器发送数据");
                    client.setSize(400,400);
                    client.setVisible(true);
                    client.connect();
                    
                    
                }
            });
    
        }
    
    }

    启动的时候要注意先启动服务器端再启动客户端,不然会报错。

    菜鸟还需要不断学习。

  • 相关阅读:
    Swap Nodes in Pairs
    Remove Nth Node From End of List
    Rotate list
    历届试题_DNA比对
    斐波那契字符串_KMP
    字符串的模式匹配
    理解图像Garbor和HOG特征的提取方法及实例应用
    人眼定位和基于人眼的人脸姿态矫正_转载
    借助百度云API进行人脸识别
    { "result": null, "log_id": 304592860300941982, "error_msg": "image check fail", "cached": 0, "error_code": 222203, "timestamp": 1556030094 }
  • 原文地址:https://www.cnblogs.com/hzauxx/p/11145756.html
Copyright © 2020-2023  润新知