he0615 2021-11-08 14:05 采纳率: 66.7%
浏览 59
已结题

java套接字编程实现聊天室

使用Java套接字编程来实现一个简单的聊天室,它可以支持至少两个用户(即客户端)之间的聊天。服务器程序正在等待来自客户端程序的连接。当客户端连接到服务器时,服务器会发送一条“新朋友”消息,以通知以前已经连接到服务器的另一个客户端。然后,可以通过服务器完成两个客户端之间的通信。您可以选择TCP或UDP来实现这些程序。
您应该使用PSFTP将服务器/客户端程序(即本地文件)上传到一个ip地址
您应该使用putty来编译和运行服务器程序。
您应该使用PSFTP或Java编辑器(例如,Netbeans或eclipse)来编译和运行您的客户端程序。

  • 写回答

1条回答 默认 最新

  • 关注
    
    package java3.T16;
    
    import java.awt.BorderLayout;
    import java.awt.FlowLayout;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.net.SocketException;
    import java.net.UnknownHostException;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    /*
     * 用UDP技术实现简单聊天软件
     * */
    import javax.swing.JTextField;
    import javax.swing.JTextPane;
    public class UdpChat extends JFrame implements ActionListener,Runnable{
        
        /*
         * 关键参数
         *     1.自己的IP及端口,
         *     2.对方的IP及端口
         *     3.启动线程的按钮
         *     4.发送信息的按钮
         *     5.聊天内容的文本区域框
         * 
         * */
        JTextField txtSelfAddr,txtSelfPort,txtOtherAddr,txtOtherPort;
        JButton btnStart,btnSend,btnClose;
        //发送信息及接收信息的文本区域框
        JTextPane txtChatMsg,txtReceMsg;
        
        //数据报Socket;
        DatagramSocket socket;
        
        public UdpChat() {
            super("用UDP技术实现简单聊天软件");
            
            //自己的IP
            JLabel lblSelfAddr = new JLabel("自己IP:");
            txtSelfAddr = new JTextField("127.0.0.1",8);
            
            //自己的端口
            JLabel lblSelfPort = new JLabel("自己端口:");
            txtSelfPort = new JTextField("8888",5);
            //对方IP
            JLabel lblOtherAddr = new JLabel("自己端口:");
            txtOtherAddr = new JTextField("127.0.0.1",8);
            //对方端口
            JLabel lblOtherPort = new JLabel("对方端口:");
            txtOtherPort = new JTextField("8889",5);
            //启动线程的按钮
            btnStart = new JButton("启动接收线程");
            //发送信息
            btnSend = new JButton("发送");
            //关闭程序
            btnClose = new JButton("关闭");
            
            //注册按钮事件
            btnStart.addActionListener(this);
            btnSend.addActionListener(this);
            btnClose.addActionListener(this);
            
            
            JPanel northPane = new JPanel(new FlowLayout());
            northPane.add(lblSelfAddr);
            northPane.add(txtSelfAddr);
            northPane.add(lblSelfPort);
            northPane.add(txtSelfPort);
            northPane.add(lblOtherAddr);
            northPane.add(txtOtherAddr);
            northPane.add(lblOtherPort);
            northPane.add(txtOtherPort);
            northPane.add(btnStart);
            add(northPane,BorderLayout.NORTH);
            
            //聊天内容文本框放在中间
            txtChatMsg = new JTextPane();
            txtReceMsg = new JTextPane();
            JPanel centerPane = new JPanel(new GridLayout(2,1,5,10));
            centerPane.add(txtReceMsg);
            centerPane.add(txtChatMsg);
            add(centerPane);
            //发送按钮,关闭按钮放在底部右边
            JPanel southPane = new JPanel(new FlowLayout(FlowLayout.RIGHT));
            southPane.add(btnSend);
            southPane.add(btnClose);
            add(southPane,BorderLayout.SOUTH);
            setSize(800,500);
            setVisible(true);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setLocationRelativeTo(null);
            
        }
        //启动接收线程
        
        
        public static void main(String[] args) {
            UdpChat chat = new UdpChat();
        }
        @Override
        public void actionPerformed(ActionEvent e) {
            if(e.getSource() == btnClose) {
                System.exit(1);
            }else if(e.getSource() == btnStart) {
                //启动线程
                Thread thread = new Thread(this);
                thread.start();
                //把按钮状态设置为不可用状态
                btnStart.setEnabled(false);
            }else if(e.getSource() == btnSend) {
                //获取对方的IP及端口
                String host = txtOtherAddr.getText();
                int port = Integer.parseInt(txtOtherPort.getText());
                
                InetAddress netAddr;
                try {
                    netAddr = InetAddress.getByName(host);
                    //创建发送信息的Socket
                    DatagramSocket socket = new DatagramSocket();
                    //获取发送文本框的内容
                    String msg = txtChatMsg.getText();
                    //创建数据报
                    byte b[] = msg.getBytes();
                    DatagramPacket p = new DatagramPacket(b, b.length,netAddr,port);
                    //发送
                    socket.send(p);
                    System.out.println("发送成功...");
                    //获取接收文本框的内容,同时加入发送的内容
                    msg = txtReceMsg.getText() + "\n发给对方的信息:" + msg; 
                    txtReceMsg.setText(msg);
                    //清空发送框的内容
                    txtChatMsg.setText("");
                    //关闭
                    socket.close();
                    
                } catch (UnknownHostException e1) {
                    e1.printStackTrace();
                } catch (SocketException e1) {
                    e1.printStackTrace();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
                
            }
            
        }
    
    
        @Override
        public void run() {
            //监听是否有信息需要接收
            //获取自己端口
            int port = Integer.parseInt(txtSelfPort.getText());
            byte b[] = new byte[2048];
            int len=0;
            try {
                //创建UDP套接字(DatagramSocket)
                socket = new DatagramSocket(port);
                //接收信息的DatagramPacket对象
                DatagramPacket p = new DatagramPacket(b, b.length);
                while(true) {
                    //接收信息
                    socket.receive(p);
                    //把接收的数据转换为字符串
                    len = p.getLength();
                    String msg = new String(b,0,len);
                    msg = txtReceMsg.getText() + "\n接收对方的信息:" + msg; 
                    txtReceMsg.setText(msg);
                    
                }
                
            } catch (SocketException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }        
        }
    
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月23日
  • 已采纳回答 11月15日
  • 提问应符合社区要求 11月8日
  • 创建了问题 11月8日

悬赏问题

  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 lammps拉伸应力应变曲线分析
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题
  • ¥30 python代码,帮调试,帮帮忙吧
  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建