Java实现简单QQ聊天工具
作者:发光吖 发布时间:2023-11-25 05:54:52
标签:Java,QQ,聊天工具
Java实现简单的类似QQ聊天工具,供大家参考,具体内容如下
所使用到的知识点:
java socket编程之TCP协议
java Swing
简单的java多线程
运行截图:
服务器端实现:
package tcp_server;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
/**
* @author 乔澳
* @version 1.0
* @title: ServerThread
* @projectName 20200222TCPServer
* @description:
* @date 2020/2/27 8:58
*/
public class ServerThread extends Thread{
private User user;
public ServerThread(User user){
this.user = user;
}
@Override
public void run() {
Map<String, User> userMap = Server.userMap;
Set<String> keys = userMap.keySet();
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(user.getSocket().getInputStream()));
while (true) {
String value = reader.readLine();// 客户端发来的一句话
String[] valueAndUser = value.split("@");
//群聊
if (valueAndUser.length == 1) {
Iterator<String> it = keys.iterator();
while (it.hasNext()) {
String key = it.next();
User u = userMap.get(key);
PrintWriter pw = new PrintWriter(u.getSocket().getOutputStream());
pw.println(user.getUsername() + ":" + value + "(来自群消息)");
pw.flush();
}
} else {
//单聊
for (int i = 1; i < valueAndUser.length; i++) {
String username = valueAndUser[i];
User u = userMap.get(username);
PrintWriter pw = new PrintWriter(u.getSocket().getOutputStream());
pw.println(user.getUsername() + ":" + valueAndUser[0] + "(来自私聊)");
pw.flush();
}
}
}
} catch (IOException e) {
System.out.println(user.getUsername()+"下线了");
}
}
}
package tcp_server;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;
/**
* @author 乔澳
* @version 1.0
* @title: Server
* @projectName 20200222TCPServer
* @description:
* @date 2020/2/25 9:12
*/
public class Server {
static Map<String,User> userMap = new HashMap<String, User>();
public static void main(String[] args) {
try {
System.out.println("===server start===");
ServerSocket server = new ServerSocket(9999);
while(true) {
Socket socket = server.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String username = br.readLine();
User user = new User(username,socket);
System.out.println(user.getUsername()+"上线啦");
userMap.put(username,user);
ServerThread thread = new ServerThread(user);
thread.start();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package tcp_server;
import java.net.Socket;
/**
* @author 乔澳
* @version 1.0
* @title: User
* @projectName 20200222TCPServer
* @description:
* @date 2020/2/27 8:23
*/
public class User {
public User(String username, Socket socket) {
this.username = username;
this.socket = socket;
}
private String username;
private Socket socket;
public User() {
}
public String getUsername() {
return username;
}
public Socket getSocket() {
return socket;
}
public void setUsername(String username) {
this.username = username;
}
public void setSocket(Socket socket) {
this.socket = socket;
}
}
客户端实现:
package tcp_client;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
/**
* @author 乔澳
* @version 1.0
* @title: ClientReader
* @projectName 20200222TCPClient
* @description:
* @date 2020/2/26 16:11
*/
public class ClientReader extends Thread {
private Socket socket;
public ClientReader(Socket socket){
this.socket = socket;
}
public void run(){
try {
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader reader = new BufferedReader(isr);
for(;;){
String value = reader.readLine();
System.out.println(value);
}
} catch (IOException e) {
System.out.println("对不起,服务器崩溃了");
}
}
}
package tcp_client;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
/**
* @author 乔澳
* @version 1.0
* @title: ClientWriter
* @projectName 20200222TCPClient
* @description:
* @date 2020/2/26 16:11
*/
public class ClientWriter extends Thread{
private Socket socket;
public ClientWriter(Socket socket){
this.socket = socket;
}
public void run(){
try {
Scanner input = new Scanner(System.in);
OutputStream os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os);
while(true) {
System.out.println("说点什么吧:");
String msg = input.nextLine();
pw.println(msg);
pw.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
package tcp_client;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.Socket;
/**
* @author 乔澳
* @version 1.0
* @title: QQFrame
* @projectName 20200222TCPClient
* @description:
* @date 2020/2/28 9:46
*/
public class QQFrame extends JFrame{
private String name;
private JPanel panel = new JPanel();
private JTextArea mesgArea = new JTextArea();
private JScrollPane mesgPane = new JScrollPane(mesgArea);
private JTextArea speakArea = new JTextArea();
private JScrollPane speakPane = new JScrollPane(speakArea);
private JButton sendBtn = new JButton("发送");
private JButton resetBtn = new JButton("取消");
private Socket socket;
public QQFrame(String name){
super(name);
this.name = name;
this.initOther();
this.initElement();
this.initSelf();
this.connectServer();
this.startReader();
this.initListener();
}
private void connectServer(){
System.out.println("===client start===");
try {
socket = new Socket("127.0.0.1",9999);
PrintWriter pw = new PrintWriter(socket.getOutputStream());
pw.println(name);
pw.flush();
} catch (IOException e) {
JOptionPane.showMessageDialog(this,"服务器连接失败");
//e.printStackTrace();
}
}
private void startReader(){
//启动"读"线程
ClientReader reader = new ClientReader();
reader.start();
}
private void initListener(){
ActionListener listener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
OutputStream os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os);
String msg = speakArea.getText();
if(msg.isEmpty())
return;
pw.println(msg);
pw.flush();
speakArea.setText("");
} catch (IOException ee) {
ee.printStackTrace();
}
}
};
sendBtn.addActionListener(listener);
resetBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
speakArea.setText("");
}
});
}
private void initOther(){
panel.setLayout(null);
mesgArea.setEditable(false);
mesgPane.setBounds(10,10,305,220);
speakPane.setBounds(10,240,305,140);
sendBtn.setBounds(180,390,60,30);
resetBtn.setBounds(260,390,60,30);
}
private void initElement(){
panel.add(mesgPane);
panel.add(speakPane);
panel.add(sendBtn);
panel.add(resetBtn);
this.add(panel);
}
private void initSelf(){
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setBounds(1400,220,350,500);
this.setVisible(true);
}
public static void main(String[] args) {
new QQFrame("乔乔");
new QQFrame("小红");
new QQFrame("小明");
}
//内部类
public class ClientReader extends Thread {
StringBuffer sb = new StringBuffer();
public void run(){
try {
if(socket!=null) {
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader reader = new BufferedReader(isr);
for (; ; ) {
String value = reader.readLine();
sb.append(value + "\n");
mesgArea.setText(sb.toString());
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
来源:https://blog.csdn.net/qq_43598138/article/details/107472148


猜你喜欢
- 1.准备工作第一步就是先要注册一个支付宝的账号(注册这里不说,不是重点),然后登入官方首页,去到应用列表里面找到沙箱应用。基本信息的APPI
- Java实现PC微信扫码支付做一个电商网站支付功能必不可少,那我们今天就来盘一盘微信支付。微信支付官方网站业务流程:开发指引文档支付服务开发
- 1. 前言Spring除了IOC和DI,还有另一个杀手锏功能——Spring AOP。AOP是一种面
- 如下所示://view重绘时回调view.getViewTreeObserver().addOnDrawListener(new OnDra
- 前言使用Java8的新特性Stream流式处理,可以提高对于集合的一些操作效率,再配合lambda表达式,可以极致的简化代码,尤其还有并行流
- Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045~RFC2049,上面有MIME的详细规范。B
- Json的简介JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个
- 1.打开官网稍微学习一下,了解一下spring cloud是个什么东西,大概有哪些组件等https://spring.io/projects
- 几个月前写过一篇博客《xUtils3.0框架学习笔记》 ,上面也有记录通过xUtils实现文件上传的使用方法,代码如下:private vo
- 一个围绕统计分析功能的系统,在最后制作统计分析时需要一个批量点击的功能,用以批量制作echarts图形后生成图片并保存图形和图片。方便后续导
- 原理是使用LinkedHashMap来实现,当缓存超过大小时,将会删除最老的一个元组。实现代码如下所示import java.util.Li
- 1.springboot启动过程中,首先会收集需要加载的bean的定义,作为BeanDefinition对象,添加到BeanFactory中
- 样例代码在讲 Flutter 的盒子模型前,先看看HTML 中的盒子模型。如下图所示,一个页面元素包括了与父级容器的外边距(margin),
- 一、 WillPopScope用法WillPopScope本质是一个widget用于拦截物理按键返回事件(Android的物理返回键和iOS
- 前言本文主要给大家介绍的是java虚拟机的故障处理工具,文中提到这些工具包括:名称主要作用jpsJVM process Status Too
- 先看代码public class MaxHuiWen {public static void main(String[] args) { &
- 一、简介Android的消息机制主要是指Handler的运行机制,那么什么是Handler的运行机制那?通俗的来讲就是,使用Handler将
- 本文实例讲述了java实现单词搜索迷宫游戏。分享给大家供大家参考。具体分析如下:我们在杂志上,经常能够看到找单词的小游戏,在一个二维表格中,
- Java Set集合的遍历及实现类的比较Java中Set集合是一个不包含重复元素的Collection,首先我们先看看遍历方法package
- SpringBoot版本:2.3.2.RELEASESpringBoot Data JPA版本:2.3.2.RELEASEJpaReposi