bug大王11111 2021-06-21 15:36 采纳率: 50%
浏览 70
已结题

救救我,这女的太惨了,写一半感觉都是错的。。。。

功能要求:用图形化界面实现QQ的部分功能,建立一个网络聊天程序,可以实现多人聊天,并可以保存聊天记录。

(1)多线程聊天程序;

(2)可以接收多人聊天;

(3)可以发送文件;

(4)可以发送图片;

(5)可以保存聊天记录。

  • 写回答

2条回答 默认 最新

  • 关注
    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();
    		}		
    	}
    
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月28日

悬赏问题

  • ¥15 想咨询点问题,与算法转换,负荷预测,数字孪生有关
  • ¥15 C#中的编译平台的区别影响
  • ¥15 软件供应链安全是跟可靠性有关还是跟安全性有关?
  • ¥15 电脑蓝屏logfilessrtsrttrail问题
  • ¥20 关于wordpress建站遇到的问题!(语言-php)(相关搜索:云服务器)
  • ¥15 【求职】怎么找到一个周围人素质都很高不会欺负他人,并且未来月薪能够达到一万以上(技术岗)的工作?希望可以收到写有具体,可靠,已经实践过了的路径的回答?
  • ¥15 Java+vue部署版本反编译
  • ¥100 对反编译和ai熟悉的开发者。
  • ¥15 带序列特征的多输出预测模型
  • ¥15 Python 如何安装 distutils模块