




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
网络聊天应用小程序 姓名: 班级: 学号:功能描述实现网络聊天消息显示框显示发送和接收的消息消息编辑框用于编辑要发送的消息按发送按钮或者快捷键Ctrl+Enter发送发送消息后显示到显示区域,并将发送区域的内容清空后台有线程接收消息当接收消息时要显示到显示区域sendButtonsendAreashowArea总体设计设计界面由于要实现发送和接收两个功能,而且两个功能是并行的,所以要用多线程实现。主线程用于发送,另外开个接收线程在本机某个端口监听,接收发送来的数据。配置初始化界面初始化添加事件监听和活动监听接收消息发送消息显示区域点击发送按钮按下Ctrl+Enter键接收提取文字发送区域添加消息发送详细设计创建多线程方法为new Thread(new ReceiveThread().start();class ReceiveTread implements Runnable Overridepublic void run() /线程要执行的内容DatagramSocket类实现网络通信DatagramSocket ds = new DatagramSocket(port);表示监听本机的port端口DatagramPacket类能封装发送或者接收的数据接收数据DatagramPacket dp = new DatagramPacket(b, size);ds.receive(dp);byte b = dp.getData();String str = new String(b);发送byte b = “content”.getBytes();DatagramPacket dp = new DatagramPacket(b, b.length,InetAddress.getByName(host), port);ds.send(dp);显示private JButton sendButton; /发送按钮private JTextArea sendArea; /发送区域private TextArea showArea; /接收区域往显示区域添加消息showArea.append(message);从发送区域获得要发送的字符String str = sendArea.getText();给发送区域添加键盘监听,用于实现快捷键发送sendArea.addKeyListener(new KeyAdapter();给发送按钮添加活动监听,当点击时发送消息sendButton.addActionListener(new ActionListener();程序代码Chat.javapackage cn.hnist.main;import javax.swing.JFrame;import javax.swing.UIManager;import cn.hnist.controller.Controller;public class Chat public static void main(String args) /设置字体try UIManager.put(swing.boldMetal, Boolean.FALSE);UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName(); catch(Exception e) e.printStackTrace();/初始化窗口JFrame frame = new JFrame(聊天);/设置关闭窗体时退出程序frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/初始化一个Controller类,继承了JPanelController controller = new Controller();/往窗体上加主面板frame.add(controller);/设置窗体frame.setBounds(120,100,controller.getSize().width+20, controller.getSize().height+10);/设置窗体无法调整大小frame.setResizable(false);/设置窗体可见frame.setVisible(true);Controller.javapackage cn.hnist.controller;import java.awt.Color;import java.awt.Font;import java.awt.TextArea;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;import .DatagramPacket;import .DatagramSocket;import .InetAddress;import .UnknownHostException;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Properties;import javax.swing.GroupLayout;import javax.swing.JButton;import javax.swing.JOptionPane;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.LayoutStyle.ComponentPlacement;public class Controller extends javax.swing.JPanel /消除警告private static final long serialVersionUID = 1L;/接收方主机private String host;/接收方端口private int sendPort;/监听本机的端口private int myPort;/昵称private String nickname;private JButton sendButton; /发送按钮private JScrollPane scrollPane; /滚动条private JTextArea sendArea; /发送区域private TextArea showArea; /接收区域private DatagramSocket ds; /发送和接收数据报包的套接字private DatagramPacket receiveDp; /接收数据报包private byte receiveBuf; /接收缓冲区public Controller() /初始化配置initConfig();/初始化显示面板initComponents();/*异常处理 * try catch(Exception e) * */try /在本机某个端口监听 int myPort,myPort的值从配置文件里读取ds = new DatagramSocket(myPort);/初始化byte数组receiveBuf = new byte1024;/初始化接收的数据报包,缓冲区为 receiveBufreceiveDp = new DatagramPacket(receiveBuf, receiveBuf.length); catch (Exception e) /后台打印异常信息e.printStackTrace();/弹出对话框JOptionPane.showMessageDialog(this, 或发送主机错误端口冲突);/抛出运行是异常throw new RuntimeException(配置文件不存在);/开一个新的线程,监听本机某个端口,用于接收信息收new Thread(new ReceiveThread().start();private void initConfig() /*配置文件格式host=localhostmyPort=10000sendPort=10002nickname=xudan*/Properties pro = new Properties();try InputStream in = new FileInputStream(config.ini);pro.load(in);/host=localhost,拿到host的值host = pro.getProperty(host);/由于端口号是int型,将字符串转换成数字sendPort = Integer.parseInt(pro.getProperty(sendPort);myPort = Integer.parseInt(pro.getProperty(myPort);/*解决昵称为中文的乱码问题 * 由于配置文件类型是ANSI,而Java默认码表是ISO8859-1,所以先用ISO8859-1解码再用gb2312编码成string类型*/nickname = new String(pro.getProperty(nickname).getBytes(ISO8859-1),gb2312);/关流in.close(); catch (FileNotFoundException e) e.printStackTrace();JOptionPane.showMessageDialog(this, 配置文件不存在,无法启动);throw new RuntimeException(配置文件不存在); catch (Exception e) e.printStackTrace();JOptionPane.showMessageDialog(this, 配置文件错误);throw new RuntimeException(配置文件错误);private void send() String str = sendArea.getText(); /获得发送区域的文字if (str = null | .equals(str) /如果为空则返回return;byte b = str.getBytes();try DatagramPacket dp = new DatagramPacket(b, b.length,InetAddress.getByName(host), sendPort);addMessage(str);ds.send(dp);sendArea.setText(); /发送玩清空 catch (UnknownHostException e) e.printStackTrace(); catch (IOException e) e.printStackTrace();/由于被两个线程访问,所以必须加synchronized关键字修饰为同步方法,保证线程安全private synchronized void addMessage(String message) /获得当前系统时间Date date = new Date();/以hh:mm:ss格式格式化时间,hh代表时,mm代表分,ss代表秒SimpleDateFormat sdf = new SimpleDateFormat(hh:mm:ss);String time = sdf.format(date);/在消息面板上添加消息showArea.append(nickname + + time + n + message);/添加换行showArea.append(n);private class ReceiveThread implements Runnable Overridepublic void run() String str;try while(true) ds.receive(receiveDp); /阻塞式方法,将接收到的信息保存到receiveDp中str = new String(receiveDp.getData(), 0,receiveDp.getLength();/添加消息方法addMessage(str); catch (Exception e) e.printStackTrace();/初始话面板,由工具生成private void initComponents() showArea = new TextArea();scrollPane = new JScrollPane();sendArea = new JTextArea();sendButton = new JButton();showArea.setBackground(new Color(153, 255, 204);showArea.setEditable(false);showArea.setFont(new Font(黑体, 1, 14);sendArea.setBackground(new Color(153, 153, 255);sendArea.setColumns(20);sendArea.setFont(new Font(楷体, 1, 18);sendArea.setRows(3);/给输入框添加键盘监听sendArea.addKeyListener(new KeyAdapter()Overridepublic void keyPressed(KeyEvent e) /当按下Ctrl+Enter时发送消息if(e.getKeyChar()=KeyEvent.VK_ENTER) /发送方法send(););scrollPane.setViewportView(sendArea);/设置button的内容sendButton.setText(发送);sendButton.addActionListener(new ActionListener() public void actionPerformed(ActionEvent evt) send(););/设置布局GroupLayout layout = new GroupLayout(this);this.setLayout(layout);layout.setHorizontalGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(GroupLayout.Alignment.TRAILING,layout.createSequentialGroup().addGroup(layout.createParallelGroup(GroupLayout.Alignment.TRAILING).addComponent(showArea,GroupLayout.Alignment.LEADING,GroupLayout.DEFAULT_SIZE,390, Short.MAX_VALUE).addCompone
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 土木工程中BIM技术的现状与未来展望
- 陈述句与反问句的转换
- 2024-2025学年度安徽省阜阳市太和县中鑫嘉和实验高级中学高一下学期期中质量检测历史试题(含答案)
- 幼儿故事欢庆元旦
- 如何增强房地产项目的投资吸引力
- 海绵城市建设中的BIM技术应用实例
- BIM技术在市政工程中的应用探讨
- 喷涂作业人员防护口罩专题培训
- 保险公司旅行活动方案
- 保险公司营销活动方案
- 新能源汽车基础知识培训课件
- 客户入厂安全培训
- 浙江省医疗服务价格项目目录
- 《现代家居风格解读》课件
- 信息系统等级保护咨询服务方案
- 建设单位质量安全保证体系
- 智慧社区人脸识别门禁系统改造方案
- 2025年蓝莓行业市场需求分析报告及未来五至十年行业预测报告
- 室内拆除及装修方案
- 移动式活动脚手架专项施工方案
- 学生心理健康一生一策档案表
评论
0/150
提交评论