-
简易的 Java Jframe窗体聊天室
说明:如果有一个类,需要有界面的显示,name该类就需要继承 JFrame此时,该类就可以被称为一个“窗体类"
1.定义JFrame窗体中的组件
2.在构造方法中初始化窗体组件
3.使用网络编程完成数据的传输(TCP ,UDP协议)
4.实现“发送”按钮的监听事件
5.实现回车键发送数据
使用工具 :IDEA
1.新建Java空项目-->新建Java module
新建类ServerChatMain
新建类ClientChatMain
新建文件chat.properties
在ServerChatMain 中定义需要用到的属性:
文本域 JTextArea
滚动条 JScrollPane
面板 JPanel
文本框 JTextField
按钮 JButton
输出流 BufferedWriter
客户端的IP地址 clientIp
客户端的Port端口号 clientPort
2.在chat.properties 文件中设置服务器端口号、客户机IP、客户机端口号
serverPort=6666
clientIp=127.0.0.1
clientPort=6666
创建 构造方法 ServerChatMain() ,在著方法中调用构造方法
在构造方法中初始化组件,需要初始化的内容:
- 1.文本域 2.滚动条 3.面板 4.按钮
//初始化组件
jta = new JTextArea();
//设置文本域默认不可编辑
jta.setEditable(false);
//注意:需要将文本域添加到滚动条中,实现滚动效果
jsp = new JScrollPane(jta);
//面板
jp = new JPanel();
//文本框的长度
jtf = new JTextField(15);
//按钮
jb = new JButton("发送");
//注意:需要将输入文本框和按钮添加到面板中
jp.add(jtf);
jp.add(jb);
需要设置的内容
- 文本域大小、标题、位置、关闭、是否可见
//注意:需要将滚动条域面板全部添加到窗体中
this.add(jsp, BorderLayout.CENTER);
this.add(jp, BorderLayout.SOUTH);//窗体的下面(南部)
//注意:需要设置 标题、大小、位置、关闭,是否可见
this.setTitle("聊天框 服务端");
this.setSize(400, 300);
this.setLocation(300, 300);
//窗体关闭,程序就退出
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
3.TCP 服务端 代码:
1.给发送按钮绑定监听事件
2.给文本框绑定监听事件,使用回车进行发送消息
//给发送按钮绑定一个监听绑定事件
jb.addActionListener(this);
//给文本框绑定一个键盘点击事件,使用回车发送信息
jtf.addKeyListener(this);
try {
//1.创建一个服务端的套接字
ServerSocket serverSocket = new ServerSocket(serverPort);
//2.等待客户端的连接
Socket socket =serverSocket.accept();
//3.获取socker 通道的输入流(输入流是实现读取数据的,一行一行读取)
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//4.获取socket 通道的输出流(写出数据,也是写一行换一行,刷新)
bw= new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
String line =null;
//循环读取数据,并拼接到文本域
while((line =br.readLine())!=null){
//如果读取的数据不为空,将读取的数据拼接到文本域中 ,拼接时要换行
jta.append(line + System.lineSeparator());
}
// 5.关闭socket 通道
serverSocket.close();
} catch (IOException e) {
}
4.重写键盘按下时事件的方法
@Override
public void keyPressed(KeyEvent e) {//键盘按下
//回车键
if (e.getKeyCode() == KeyEvent.VK_ENTER) {//判断是不是回车键
//发送数据到socket通道
sendDataToSocket();//调用方法,省代码
}
}
5.定义发送的方法
//定义一个方法,实现将数据发送到socket通道中
private void sendDataToSocket(){
// 1.获取文本框中发送的内容
String text =jtf.getText();
//2.拼接发送的内容
text ="服务端 对 客户端说:" + text;
//3.自己也要显示
jta.append(text + System.lineSeparator());
//4.发送
try {
bw.write(text);
bw.newLine();
bw.flush();//刷新
//5.清空文本框
jtf.setText("");
} catch (IOException e1) {
e1.printStackTrace();
}
}
客户端部分代码:
与服务器端类似,初始化属性、加载外部配置文件、设置聊天框的属性、绑定监听事件、创建socket连接通道,获取输入流、重写键盘事件方法
/属性
//文本域
private JTextArea jta;
//滚动条
private JScrollPane jsp;
//面板
private JPanel jp;
//文本框
private JTextField jtf;
//按钮
private JButton jb;
//输出流
private BufferedWriter bw = null;
//客户端的IP地址
private static String clientIp;
//客户端的Port端口号
private static int clientPort;
//静态代码块加载外部配置文件
static {
Properties prop =new Properties();
try {
// prop.load(new FileReader("chat.properties"));
prop.load(new FileReader("chat.properties"));
clientIp =prop.getProperty("clientIp");
clientPort =Integer.parseInt(prop.getProperty("clientPort"));
} catch (IOException e) {
e.printStackTrace();
}
}
public ClientChatMain() {
//初始化组件
jta = new JTextArea();
//设置文本域默认不可编辑
jta.setEditable(false);
//注意:需要将文本域添加到滚动挑中,实现滚动效果
jsp = new JScrollPane(jta);
//面板
jp = new JPanel();
jtf = new JTextField(10); //文本框的长度
jb = new JButton("发送"); //按钮
//注意:需要将文本框域按钮添加到文本框中
jp.add(jtf);
jp.add(jb);
//注意:需要将滚动条域面板全部添加到窗体中
this.add(jsp, BorderLayout.CENTER);
this.add(jp, BorderLayout.SOUTH);
//注意:需要设置 标题、大小、位置、关闭,是否可见
this.setTitle("聊天框 客户端");
this.setSize(400, 300);
this.setLocation(800, 300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//窗体关闭,程序就退出
this.setVisible(true);
/*******************TCP 客户端 Start*****************/
//给发送按钮绑定一个监听事件
jb.addActionListener(this);
//给文本框绑定键盘事件
jtf.addKeyListener(this);
try {
//1.创建一个服务端的套接字(尝试连接)
Socket socket = new Socket(clientIp, clientPort);
//2.获取socker 通道的输入流
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//3.获取socket 通道的输出流
bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//循环读取数据,并拼接到文本域
String line = null;
while ((line = br.readLine()) != null) {
//读取的数据是line 从br.readLine()中读取的
jta.append(line + System.lineSeparator());
}
//4.关闭socket 通道
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
/*******************TCP 客户端 End*****************/
}
客户端发送消息代码
private void sendDataToSocket() {
//1.获取文本框中需要发送的内容
String text = jtf.getText();
//2.拼接内容
text = "客户端对服务端说:" + text;
//3.自己显示
jta.append(text + System.lineSeparator());
//4.发送
try {
bw.write(text);
bw.newLine();//换行
bw.flush();//刷新
//5.清空
jtf.setText("");
} catch (IOException ex) {
ex.printStackTrace();
}
}
先运行服务器端,在运行客户端
运行结果:
项目文件地址:
简易的JavaJframe窗体聊天室-Java文档类资源-CSDN下载
https://download.csdn.net/download/MushuiQwQ/20909412
出处:https://www.cnblogs.com/dxxbjl/p/15113664.html
最新更新
python爬虫及其可视化
使用python爬取豆瓣电影短评评论内容
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
uniapp/H5 获取手机桌面壁纸 (静态壁纸)
[前端] DNS解析与优化
为什么在js中需要添加addEventListener()?
JS模块化系统
js通过Object.defineProperty() 定义和控制对象
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比