使用javaSwing搭建一个简单的聊天室
这个是因为帮朋友做作业记录一下,现场学习嗄,都忘了。好了不多说了。
1、首先得知道Swing,Swing是一个新型的java窗口工具(还是那么Love Orange W,哈哈哈)
2、聊天室怎么少得了Socket(套接字)
以上就是两个窗口聊天的主要用到底工具(功能)
1、聊天室多人聊天的,所以我们会以客户端和服务端两端就够了
2、我们开始写服务端代码,其实服务端和客户端代码都是一样的,会一个就会两个了,主要的就是在于区分Socket的端口与连接端口区别。不多bb了。上代码
2.1、服务端的代码
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.OutputStream;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;/*** @Author: create_By:* @Data:Created in 2019/12/24 23:26* @Version:* @Acton: QQ服务系统*/
public class QQServerSystem {private JFrame frame; // 窗口private Container container; // 创中的容器对象public JTextArea txtList; // 文本列表框public JTextField txtMsg; // 文本发送框public JButton btn; // 发送按钮public String addMsg = "未连接";public OutputStream os; //发送消息的public QQServerSystem() {frame = new JFrame("九哥的QQ服务端");frame.setBounds(400, 300, 800, 600); //设置窗口大小位置frame.setLayout(new BorderLayout()); //设置样式container = frame.getContentPane(); //窗口生成容器txtList = new JTextArea(5, 20); //生成文本域的大小container.add(txtList, BorderLayout.CENTER); //把文本加入容器中,并设置布局JPanel txtPanel = new JPanel();txtPanel.setLayout(new FlowLayout(FlowLayout.LEADING));txtMsg = new JTextField(60); //设置消息文本行高btn = new JButton("发送");btn.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {//实现给客户端发送消息的功能//1、点击发送获取消息框中的信息String msgText = txtMsg.getText();//2、处理文本if (!"".equals(msgText) && msgText != null) { //判断是有文字的才会做处理//1、显示到自己的连天窗口txtList.append("我: " + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));txtList.append("\r\n");txtList.append(msgText);txtList.append("\r\n");txtMsg.setText("");//2、发送byte[] sendBuf = msgText.getBytes();try {if (os != null) {os.write(sendBuf);}} catch (IOException e1) {e1.printStackTrace();}}}});txtPanel.add(txtMsg); //消息框加入面板中txtPanel.add(btn); //按钮加入面板中container.add(txtPanel, BorderLayout.SOUTH); //把面板加入容器中,并设置布局startServerThread();refreshMsgList();}/* 刷新消息列表 */private void refreshMsgList() {String txt = txtList.getText();txtList.setText(txt + addMsg + "\n");}/* 启动线程 */private void startServerThread() {new ServerListenThread(this).start();}/* 启动面板 */public void start() {frame.setVisible(true); //设置可以显示}
}
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;/*** @Author: create_By:* @Data:Created in 2019/12/24 23:47* @Version:* @Acton: 继承线程让其成为线程类*/
public class ServerListenThread extends Thread {private ServerSocket serverSocket;private Socket socket;private InputStream is;public QQServerSystem qqs;public ServerListenThread(QQServerSystem qqs) {super();this.qqs = qqs;}@Overridepublic void run() {//实现监听8888端口,接收客户端发送的消息,并显示到界面try {serverSocket = new ServerSocket(8888, 1000); //创建服务端套接字并设置端口socket = serverSocket.accept(); //创建套接字is = socket.getInputStream(); //获取输入流qqs.os = socket.getOutputStream(); //获取输出流while (true) {if (socket.isConnected()) {byte[] buff = new byte[1024]; //设置一个临时缓冲区int len = is.read(buff); //从输入流读取字节长度byte[] eBuff = new byte[len]; //根据实际长度,定义一个输入缓冲区System.arraycopy(buff, 0, eBuff, 0, len); //拷贝数据String text = new String(eBuff); //把字节转换字符qqs.txtList.append("对方: " + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));qqs.txtList.append("\r\n");qqs.txtList.append(text);qqs.txtList.append("\r\n");}}} catch (IOException e) {e.printStackTrace();}}
}
public class ServerMain {public static void main(String[] args) {QQServerSystem qs = new QQServerSystem();qs.start();}
}
2.2、客户端的代码
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.OutputStream;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;/*** @Author: create_By:* @Data:Created in 2019/12/24 23:56* @Version:* @Acton: QQ客户端系统*/
public class QQClientSystem{private JFrame frame; //窗口private Container container; //创中的容器对象public JTextArea txtList; //文本列表框public JTextField txtMsg; //文本发送框public JButton btn; //发送按钮public String addMsg = "未连接";public OutputStream os; //用于发送信息。public QQClientSystem() {frame = new JFrame("九哥的QQ客户端");frame.setBounds(400, 300, 800, 600); // 设置窗口大小和位置frame.setLayout(new BorderLayout());container = frame.getContentPane();txtList = new JTextArea(5, 20);container.add(txtList, BorderLayout.CENTER);JPanel txtPanel = new JPanel();txtPanel.setLayout(new FlowLayout(FlowLayout.LEADING));txtMsg = new JTextField(60);btn = new JButton("发送");btn.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// 实现给服务器端发送消息的部分//1、点击发送获取消息框中的信息String msgText = txtMsg.getText();//2、处理文本if(!"".equals(msgText) && msgText != null){ //判断是有文字的才会做处理//2、发送byte[] sendBuf = msgText.getBytes();try {if (os != null){os.write(sendBuf);}} catch (IOException e1) {e1.printStackTrace();}txtList.append("我: " + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));txtList.append("\r\n");txtList.append(msgText);txtList.append("\r\n");txtMsg.setText("");}}});txtPanel.add(txtMsg);txtPanel.add(btn);container.add(txtPanel, BorderLayout.SOUTH);startRequestThread();refreshMsgList();}public void startRequestThread() {new ClientRequestThread(this).start();}public void refreshMsgList() {String str = txtList.getText();txtList.setText(str + addMsg + "\n");}public void start(){frame.setVisible(true);}}
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;/*** @Author: create_By:* @Data:Created in 2019/12/24 23:58* @Version:* @Acton:*/
public class ClientRequestThread extends Thread {private Socket socket;private InputStream is;QQClientSystem qqc;public ClientRequestThread(QQClientSystem qqc) {this.qqc = qqc;}@Overridepublic void run() {// 实现连接服务器的功能,并可以接收服务器端发送的消息,显示到程序界面try {socket = new Socket("localhost", 8888);is = socket.getInputStream();qqc.os = socket.getOutputStream();} catch (IOException e1) {e1.printStackTrace();}while (true) {if (socket.isConnected()) { //已经连接才做以下处理byte[] buff = new byte[1024]; //设置一个临时缓冲区int len = 0; //从输入流读取字节长度try {len = is.read(buff);} catch (IOException e) {e.printStackTrace();}byte[] eBuff = new byte[len]; //根据实际长度,定义一个输入缓冲区System.arraycopy(buff, 0, eBuff, 0, len); //拷贝数据String text = new String(eBuff); //把字节转换字符qqc.txtList.append("对方: " + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));qqc.txtList.append("\r\n");qqc.txtList.append(text);qqc.txtList.append("\r\n");}}}}
public class ClientMain {public static void main(String[] args) {QQClientSystem qc = new QQClientSystem();qc.start();}
}
这个直接复制到自己的代码中运行即可,然后后续的优化自己改下就行了。因为相对简洁,我们只需要学习部分基础功能和知识即可。如果本章对你有所帮助,请点个赞收藏一下,蟹蟹。
使用javaSwing搭建一个简单的聊天室相关推荐
- 使用netty搭建一个简单的聊天室
1.导入maven依赖 <dependency><groupId>io.netty</groupId><artifactId>netty-all< ...
- 用ServletContext做一个简单的聊天室
这里主要是ServletContext的一个特性:ServletContext是一个公共的空间,可以被所有的客户访问.由此可见ServletContext比cookie和session的作用范围要大[ ...
- Netty - 一个简单的聊天室小项目
经过一段时间对Netty的学习,我们对Netty各版本以及像ProtocolBuffers等技术应用都有了不少相关的了解, 我们就用这段时间学到的只是做一个简单的聊天室的小项目来练习自己学到的技术. ...
- python开发一个简单的聊天室
使用python的twisted框架编写一个简单的聊天室 下面是基本架构 基本架构图 -- coding:utf-8 -- from twisted.internet.protocol import ...
- 前端+node实现一个简单的聊天室功能
简单的实现一个聊天室功能 目录 前言 一.了解一下WebSocket 我们有了http协议,为什么会出现ws呢? ws出现之前,我们是怎么实现双向通信的呢? 二.使用到的websocket库 三.聊天 ...
- 使用Unity制作一个简单的聊天室
使用控制台作为一个服务器,在Unity中开发客户端,制作一个简易的聊天室,无论哪个客户端发送消息,其他的客户端都会实时的显示出来. 服务器代码 using System; using System.C ...
- Ubuntu下用apache+perl搭建最简单的聊天室
最近学习了下perl,尝试自己搭建一个聊天室,现已搭建成功,但设计方法很简陋,误见笑,收获在于对apache.html.perl都有了些许认识,后面打算学习LAMP(Linux+Apache+MySQ ...
- Go 实现一个简单的聊天室
创建客户端 先在main方法中创建一个sorcket服务端,这个服务端就像一个酒店 func main() {listen, err := net.Listen("tcp", &q ...
- python 土拨鼠库_为了应对某人的需求,写了一个简单的聊天室内容
Python聊天室 背景 这是一篇水文,同时也是更换markdown后的第一篇,主要是为了测试markdown的情况. 服务器程序 #!/usr/bin/env python # -*- coding ...
- 10分钟教对象搭建了一个多人聊天室~
Demo演示 体验demo链接: http://socket.vjscoder.com/websocket-chatroom/index.html#/ 去github查看完整源码: https://g ...
最新文章
- PyCaret-低代码ML库使用指南
- 机智云明星开发者 | 董程森
- Java VS .NET:Java与.NET的特点对比
- 宝塔环境下配置PM2+NODE+VUE+WEBPACK环境
- 深入理解linux系统的目录结构
- 前端学习(3181):ant-design的button介绍
- 度假式办公环境、值得拥有!珠海金山软件诚聘CV、C++、后端工程师
- redis在应用中使用连接不释放问题解决
- k8s学习: ErrImagePull 和 ImagePullBackOff 怎么办?
- oracle总结: INTERVAL DAY TO SECOND, 但却获得 NUMBER
- 2008年十大最值得关注创业公司
- Verilog(2):与或非运算
- python爬虫爬取必应壁纸
- 虚拟机开启系统蓝屏报错:“终止代码:SYSTEM_SERVICE_ECXEPTION“
- Dreamweaver CS6 Mac破解版
- FPGA数字信号处理(25)数字相关器设计(经典结构)
- docker内debian安装php7.2 configure: error: Cannot find OpenSSL‘s <evp.h>
- 测一测自己的Sql能力之MYSQL的GROUPBY你弄懂了吗?
- rar压缩包解开权限密码,忘记rar压缩包密码怎么办?
- 老子云携手福昕鲲鹏,首次实现3D OFD三维版式文档的重大突破
热门文章
- 我学炒外汇 第二十二篇实战心得
- 三种嵌入式操作系统的分析与比较
- 网课笔记 ☀ 经济学原理课后习题及答案
- panabit之PPPoE认证
- 专访智齿科技徐懿丨企服公司四要素:智能、融合、产品复杂度、客单价
- Autumn源码解读
- python设置word背景色_python 绘图的背景颜色不要_项目分享|5步教你用Python制作朋友圈个性签名...
- 数据库安全性之安全标准
- 【雅思大作文考官范文】——第四篇: 'power of advertising' essay
- unity android录制视频教程,Unity移动端视频录制,Android和IOS都支持