Java聊天室

article/2025/10/23 8:45:44

项目介绍:

        Java聊天室是期末设计, 阿里巴巴druid+mysql+多线程+GUI+mvn项目+java Socket

        服务端模块:踢出聊天室:管理员可以踢出发言不当的用户。只有当开启服务端的时候,客户端才能起到作用。

                        

        客户端模块:  注册:用户可以注册账户,通过输入的账户密码往数据库添加数据;

                        登录:通过数据库验证账户和密码,如果一致就可以登录。验证失败就不能登录;

                         新建窗口:用于开启新的客户端;

一.代码设计

Server.java

package Chatroom;import java.awt.image.BufferedImage;
import java.io.*;
import java.net.*;
import java.util.*;
import java.awt.*;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.border.TitledBorder;
import net.sf.json.JSONObject;//继承JFrame实现可视化
public class Server extends JFrame{//用户列表,用于存放连接上的用户信息ArrayList<User> user_list = new ArrayList<>();//用户名列表,用于显示已连接上的用户ArrayList<String> username_list = new ArrayList<>();//消息显示区域JTextArea show_area = new JTextArea();//用户名显示区域JTextArea show_user = new JTextArea(10, 10);//socket的数据输出流DataOutputStream outputStream = null;//socket的数据输入流DataInputStream inputStream = null;//从主函数里面开启服务端public static void main(String[] args) {new Server();}//构造函数public Server() {//设置流式布局setLayout(new BorderLayout());//VERTICAL_SCROLLBAR_AS_NEEDED设置垂直滚动条需要时出现//HORIZONTAL_SCROLLBAR_NEVER设置水平滚动条不出现//创建信息显示区的画布并添加到show_areaJScrollPane panel = new JScrollPane(show_area,ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);//设置信息显示区标题panel.setBorder(new TitledBorder("信息显示区"));//布局到中央add(panel,BorderLayout.CENTER);//设置信息显示区为不可编辑show_area.setEditable(false);//创建用于显示用户的画布final JPanel panel_east = new JPanel();//添加流式布局panel_east.setLayout(new BorderLayout());//设置标题panel_east.setBorder(new TitledBorder("在线用户"));//在用户显示区添加show_uesrpanel_east.add(new JScrollPane(show_user), BorderLayout.CENTER);//设置用户显示区域为不可编辑show_user.setEditable(false);//将显示用户的画布添加到整体布局的右侧add(panel_east, BorderLayout.EAST);//创建关于踢下线用户的画布final JPanel panel_south = new JPanel();//创建标签JLabel label = new JLabel("输入要踢下线用户的ID");//创建输入框JTextField out_area = new JTextField(40);//创建踢下线按钮JButton out_btn = new JButton("踢下线");//依次添加进画布panel_south.add(label);panel_south.add(out_area);panel_south.add(out_btn);//将踢下线用户的画布添加到整体布局的下侧add(panel_south,BorderLayout.SOUTH);//设置踢下线按钮的监听out_btn.addActionListener(e -> {try {//用于存储踢下线用户的名字String out_username;//从输入框中获取踢下线用户名out_username = out_area.getText().trim();//用于判断盖用户是否被踢下线boolean is_out=false;//遍历用户列表依次判断for (int i = 0; i < user_list.size(); i++){//比较用户名,相同则踢下线if(user_list.get(i).getUsername().equals(out_username)){//获取被踢下线用户对象User out_user = user_list.get(i);//使用json封装将要传递的数据JSONObject data = new JSONObject();//封装全体用户名,广播至所有用户data.put("user_list", username_list);//广播的信息内容data.put("msg", out_user.getUsername() + "被管理员踢出\n");//服务端消息显示区显示相应信息show_area.append(out_user.getUsername() + "被你踢出\n");//依次遍历用户列表for (User value : user_list) {try {//获取每个用户列表的socket连接outputStream = new DataOutputStream(value.getSocket().getOutputStream());//传递信息outputStream.writeUTF(data.toString());} catch (IOException ex) {ex.printStackTrace();}}//将被踢用户移出用户列表user_list.remove(i);//将被踢用户移出用户名列表username_list.remove(out_user.getUsername());//刷新在线人数show_user.setText("当前在线人数 " + username_list.size() + " 人\n");//刷新在线用户for (String s : username_list) {show_user.append(s + "\n");}//判断踢出成功is_out=true;break;}}//根据是否踢出成功弹出相应提示if(is_out){JOptionPane.showMessageDialog(null,"踢下线成功","提示",JOptionPane.WARNING_MESSAGE);}if(!is_out){JOptionPane.showMessageDialog(null,"不存在用户","提示",JOptionPane.WARNING_MESSAGE);}//重置输入框out_area.setText("");} catch(Exception ex) {ex.printStackTrace();}});//设置该窗口名setTitle("服务器 ");//引入图片BufferedImage img;
//        try {
//            //根据图片名引入图片
//            img = ImageIO.read(Server.class.getResource("/a.jpg"));
//            //设置其为该窗体logo
//            setIconImage(img);
//        } catch (IOException exception) {
//            exception.printStackTrace();
//        }//设置窗体大小setSize(700, 700);//设置窗体位置可移动setLocationRelativeTo(null);//设置窗体关闭方式setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗体可见setVisible(true);//socket连接相关代码try {//开启socket服务器,绑定端口11111ServerSocket serverSocket = new ServerSocket(11111);//信息显示区打印服务器启动时间show_area.append("服务器启动时间 " + new Date() + "\n");//持续接收连接while (true) {//接收连接Socket socket = serverSocket.accept();//创建用户对象User user = new User();//判断是否连接上if (socket != null) {//获取输入流inputStream = new DataInputStream(socket.getInputStream());//读取输入流String json = inputStream.readUTF();//创建信息对象JSONObject data = JSONObject.fromObject(json);//信息显示区打印用户上线show_area.append("用户 " + data.getString("username") + " 在" + new Date() + "登陆系统"+"\n");//创建新用户user = new User();//存储socket对象user.setSocket(socket);//获取输入流用户名user.setUsername(data.getString("username"));//添加进用户列表user_list.add(user);//添加进用户名列表username_list.add(data.getString("username"));//刷新在线人数show_user.setText("当前在线人数 " + username_list.size() + " 人\n");//刷新在线用户for (String s : username_list) {show_user.append(s + "\n");}}//封装信息对象JSONObject online = new JSONObject();//设置接收信息对象online.put("user_list", username_list);//设置信息内容online.put("msg", user.getUsername() + "上线了");//依次遍历,将信息广播给所有在线用户for (User value : user_list) {//获取输出流outputStream = new DataOutputStream(value.getSocket().getOutputStream());//给所有用户输出上线信息outputStream.writeUTF(online.toString());}//开启新线程,持续接收该socket信息new Thread(new ServerThread(socket)).start();}} catch (IOException ex) {ex.printStackTrace();}}//线程代码class ServerThread implements Runnable {//存放全局变量socketprivate final Socket socket;//构造函数,初始化socketpublic ServerThread(Socket socket) {this.socket = socket;}@Overridepublic void run() {try {//获取输入流DataInputStream inputStream = new DataInputStream(socket.getInputStream());//持续接收信息while (true) {//获取传递进来的信息String json = inputStream.readUTF();//封装成json格式JSONObject data = JSONObject.fromObject(json);//通过json里面的private判断是否私发boolean is_private = false;//私发处理for (int i = 0; i < user_list.size(); i++) {//找到私发对象if (user_list.get(i).getUsername().equals(data.getString("private"))) {//构建私发信息内容String msg = data.getString("time") +"\n" + data.getString("username")+ " 给你发了一条私密消息,其它用户看不到" + "\n"  + data.getString("msg");//用该方法指定对象发送信息send_msg(i, msg);//将发送成功反馈给原用户for (int j = 0; j < user_list.size(); j++) {//找到发信息用户if(user_list.get(j).getUsername().equals(data.getString("username"))){//构建反馈信息内容String msg2 = data.getString("time")+"\n你成功向"+user_list.get(i).getUsername()+"发送了一条私密消息\n" +data.getString("msg");//用该方法指定对象发送信息send_msg(j,msg2);}}//将该操作打印到服务器监视窗show_area.append(data.getString("username") +data.getString("time")+ "私发给"+ data.getString("private") + ":\n" + data.getString("msg") + "\n");//判断是私发is_private = true;break;}}//非私发的情况if (!is_private) {//构建信息内容String msg = data.getString("username") + " " + data.getString("time") + ":\n"+ data.getString("msg");//添加到服务器显示show_area.append(msg + "\n");//依次发给所有在线用户for (int i = 0; i < user_list.size(); ) {send_msg(i, msg);i++;}}}} catch (IOException e) {e.printStackTrace();}}//发送信息给指定用户的方法public void send_msg(int i, String msg) {//构建对象JSONObject data = new JSONObject();//封装信息data.put("user_list", username_list);data.put("msg", msg);//获取目标对象User user = user_list.get(i);try {//获取输出流outputStream = new DataOutputStream(user.getSocket().getOutputStream());//写信息outputStream.writeUTF(data.toString());} catch (IOException e) {//如果没有找到,则说明该用户已经下线User out_user = user_list.get(i);//重复删除操作user_list.remove(i);username_list.remove(out_user.getUsername());//重新构建信息JSONObject out = new JSONObject();out.put("user_list", username_list);out.put("msg", out_user.getUsername() + "下线了\n");//将其下线通知广播给所有用户for (User value : user_list) {try {outputStream = new DataOutputStream(value.getSocket().getOutputStream());outputStream.writeUTF(out.toString());} catch (IOException ex) {ex.printStackTrace();}}}}}}

Client.java

package Chatroom;import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.image.BufferedImage;
import java.io.IOException;public class Client extends JFrame{public static void main(String[] args) {new Client();}public Client(){setTitle("登陆界面");
//        BufferedImage img;
//        try {
//            img = ImageIO.read(Server.class.getResource("src/tag.jpg"));
//            setIconImage(img);
//        } catch (IOException exception) {
//            exception.printStackTrace();
//        }setLayout(null);setSize(500,500);setLocationRelativeTo(null);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setLayout(null);setResizable(false);JLabel username_label = new JLabel("用户名");username_label.setBounds(60,100,100,50);add(username_label);JLabel password_label = new JLabel("密码");password_label.setBounds(60,200,100,50);add(password_label);JTextField username_field = new JTextField();username_field.setBounds(110,100,300,50);add(username_field);JPasswordField password_field = new JPasswordField();password_field.setBounds(110,200,300,50);add(password_field);JButton login = new JButton("登陆");login.setBounds(35,300,100,50);add(login);JButton register = new JButton("注册");register.setBounds(180,300,100,50);add(register);JButton addwindow = new JButton("新建窗口");addwindow.setBounds(320,300,100,50);add(addwindow);setVisible(true);login.addActionListener(e -> {String username = username_field.getText();String password = String.valueOf(password_field.getPassword());if(username.length()!=0 && password.length()!=0){User user = new User();user.setUsername(username);user.setPassword(password);UserDao dao = new UserDao();User u = dao.login(user);if(u!=null){setVisible(false);new Chat(username);}else{JOptionPane.showMessageDialog(null,"登录失败,账号或密码错误","提示",JOptionPane.WARNING_MESSAGE);}}else {JOptionPane.showMessageDialog(null,"登录失败,账号或密码不能为空","提示",JOptionPane.WARNING_MESSAGE);}});register.addActionListener(e -> {setVisible(false);new Register();});addwindow.addActionListener(e -> {setVisible(true);new Client();});}}
 

Register.java

package Chatroom;import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.image.BufferedImage;
import java.io.IOException;public class Register extends JFrame {public Register(){setTitle("注册界面");BufferedImage img;
//        try {
//            img = ImageIO.read(Server.class.getResource("src/tag.jpg"));
//            this.setIconImage(img);
//        } catch (IOException exception) {
//            exception.printStackTrace();
//        }setLayout(null);setSize(500,500);setLocationRelativeTo(null);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setLayout(null);setResizable(false);JLabel username_label = new JLabel("用户名");username_label.setBounds(60,50,100,50);add(username_label);JLabel password_label = new JLabel("密码");password_label.setBounds(60,150,100,50);add(password_label);JLabel password_label2 = new JLabel("请再次输入密码");password_label2.setBounds(20,250,100,50);add(password_label2);JTextField username_field = new JTextField();username_field.setBounds(110,50,300,50);add(username_field);JPasswordField password_field = new JPasswordField();password_field.setBounds(110,150,300,50);add(password_field);JPasswordField password_field2 = new JPasswordField();password_field2.setBounds(110,250,300,50);add(password_field2);JButton register_success = new JButton("注册");register_success.setBounds(130,350,100,50);add(register_success);JButton back = new JButton("返回");back.setBounds(280,350,100,50);add(back);setVisible(true);register_success.addActionListener(e -> {String username = username_field.getText();String password = String.valueOf(password_field.getPassword());String password2 = String.valueOf(password_field2.getPassword());System.out.println(password);System.out.println(password2);if(username.length()==0 || password.length()==0){JOptionPane.showMessageDialog(null,"注册失败,账号或密码不能为空","提示",JOptionPane.WARNING_MESSAGE);}else if (!password.equals(password2)) {JOptionPane.showMessageDialog(null,"注册失败,前后密码不匹配","提示",JOptionPane.WARNING_MESSAGE);}else{System.out.println();System.out.println(password);User user = new User();user.setUsername(username);user.setPassword(password);UserDao dao = new UserDao();int flag = dao.register(user);if(flag!=0){JOptionPane.showMessageDialog(null,"注册成功,欢迎您登录","提示",JOptionPane.WARNING_MESSAGE);}else{//建表语句中设置了user为主键,重复则建表失败JOptionPane.showMessageDialog(null,"注册失败,账号已经存在","提示",JOptionPane.WARNING_MESSAGE);}}});back.addActionListener(e ->{setVisible(false);new Client();});}}

User.java

package Chatroom;import java.net.Socket;public class User {private String username;private String password;private Socket socket;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public Socket getSocket() {return socket;}public void setSocket(Socket socket) {this.socket = socket;}
}

UserDao.java

package Chatroom;import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;public class UserDao {private final JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());public User login(User login_user) {try {//编写sqlString sql = "select * from user where username = ? and password = ?";User user = template.queryForObject(sql,new BeanPropertyRowMapper<User>(User.class),login_user.getUsername(), login_user.getPassword());return user;} catch (DataAccessException e) {e.printStackTrace();return null;}}public int register(User register_user) {try {
//            String sql = "insert into user values (null ,?,?)";String sql = "insert into user values (?,?)";int count = template.update(sql,register_user.getUsername(),register_user.getPassword());return count;} catch (DataAccessException e) {e.printStackTrace();return 0;}}}

Chat.java

package Chatroom;import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.awt.*;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.border.TitledBorder;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
public class Chat extends JFrame{JTextArea show_area = new JTextArea();JTextArea show_user = new JTextArea(10, 10);DataOutputStream outputStream;DataInputStream inputStream;String username;ArrayList<String> username_list = new ArrayList<>();boolean is_stop = false;public Chat(final String username) {this.username = username;final JPanel panel_south = new JPanel();panel_south.setLayout(new BorderLayout());panel_south.setBorder(new TitledBorder("写消息区,若私聊,在内容后添加(-用户名)"));JTextField send_area = new JTextField(40);send_area.setPreferredSize(new Dimension(450,50));panel_south.add(send_area, BorderLayout.CENTER);JButton send_btn = new JButton("发送");panel_south.add(send_btn,BorderLayout.EAST);add(panel_south, BorderLayout.SOUTH);send_area.addKeyListener(new KeyAdapter() {public void keyTyped(KeyEvent e) {if ((char) e.getKeyChar() == KeyEvent.VK_ENTER) {System.out.println("发送消息");SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String time = sdf.format(new Date());String msg = send_area.getText().trim();if (!msg.equals("")) {String[] msg1 = msg.split("-");JSONObject data = new JSONObject();data.put("username", username);data.put("msg", msg1[0]+"\n");data.put("time", time);try {data.put("private", msg1[1]+"\n");} catch (ArrayIndexOutOfBoundsException e1) {data.put("private", "");}try {outputStream.writeUTF(data.toString());} catch (IOException ioException) {ioException.printStackTrace();}}send_area.setText("");}}});send_btn.addActionListener(e -> {try {if (is_stop) {show_area.append("你已被踢出,不能发送消息\n");JOptionPane.showMessageDialog(null,"你已被踢出,不能发送消息,进程已经关闭","提示",JOptionPane.WARNING_MESSAGE);System.exit(0);} else {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String time = sdf.format(new Date());String msg = send_area.getText().trim();if (!msg.equals("")) {String[] msg1 = msg.split("-");JSONObject data = new JSONObject();data.put("username", username);data.put("msg", msg1[0]);data.put("time", time);try {data.put("private", msg1[1]);} catch (ArrayIndexOutOfBoundsException e1) {data.put("private", "");}outputStream.writeUTF(data.toString());}}send_area.setText("");} catch (Exception ex) {ex.printStackTrace();}});JScrollPane panel = new JScrollPane(show_area,ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);panel.setBorder(new TitledBorder("信息显示区"));add(panel,BorderLayout.CENTER);show_area.setEditable(false);final JPanel panel_east = new JPanel();panel_east.setLayout(new BorderLayout());panel_east.setBorder(new TitledBorder("在线用户"));panel_east.add(new JScrollPane(show_user), BorderLayout.CENTER);show_user.setEditable(false);add(panel_east, BorderLayout.EAST);setTitle("用户  " + username);BufferedImage img;
//        try {
//            img = ImageIO.read(Server.class.getResource("src/tag.jpg"));
//            this.setIconImage(img);
//        } catch (IOException exception) {
//            exception.printStackTrace();
//        }setSize(500, 500);setLocationRelativeTo(null);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setVisible(true);JSONObject data = new JSONObject();data.put("username", username);data.put("msg", null);try {Socket socket = new Socket("127.0.0.1", 11111);inputStream = new DataInputStream(socket.getInputStream());outputStream = new DataOutputStream(socket.getOutputStream());outputStream.writeUTF(data.toString());new Thread(new Read()).start();} catch (IOException e) {show_area.append("服务器无响应");JOptionPane.showMessageDialog(null,"服务器无响应","提示",JOptionPane.WARNING_MESSAGE);}}public class Read implements Runnable {@Overridepublic void run() {try {while (true) {String json = inputStream.readUTF();JSONObject data = JSONObject.fromObject(json);String msg = data.getString("msg");if (msg.contains("踢出") && msg.contains(username)) {is_stop = true;show_area.append(username + ",你已经被踢出群聊\n");JOptionPane.showMessageDialog(null,"你已经被踢出群聊","提示",JOptionPane.WARNING_MESSAGE);System.exit(0);} else {show_area.append(msg + "\n");show_area.selectAll();username_list.clear();JSONArray jsonArray = data.getJSONArray("user_list");for (Object o : jsonArray) {username_list.add(o.toString());}show_user.setText("当前在线人数: " + jsonArray.size() + " 人\n");for (String s : username_list) {show_user.append(s + "\n");}}}} catch (Exception e) {e.printStackTrace();}}}}

JDBCUtils

package Chatroom;import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.InputStream;
import java.util.Properties;public class JDBCUtils {private static DataSource ds;static {try {Properties pro = new Properties();InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");pro.load(is);ds = DruidDataSourceFactory.createDataSource(pro);} catch (Exception exception) {exception.printStackTrace();}}public static DataSource getDataSource(){return ds;}}

druid.properties

# druid.properties文件的配置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/plan
username=root
password=123123
# 初始化连接数量
initialSize=5
# 最大连接数
maxActive=10
# 最大超时时间
maxWait=3000

数据库设计

二.效果展示

1.服务端

2. 客户端

3. 注册页面

4.在线群聊

 

 5.在线私聊

 链接:java课程设计-多人聊天工具(socket+多线程)_Henrik-Yao的博客-CSDN博客


http://chatgpt.dhexx.cn/article/MNMj6YBO.shtml

相关文章

用Java实现简易聊天室

说明&#xff1a;如果一个 类&#xff0c;需要有界面的显示&#xff0c;那么该类就需要继承自JFrame&#xff0c;此时&#xff0c;该类就可以被称为一个“窗体类"。 服务端代码&#xff1a; package cn.qy.chat;import javax.swing.*; import java.awt.*; import java.aw…

微信小程序购物车功能实现(干货满满)

微信小程序定制好看的购物车页面&#xff0c;实现购物车功能&#xff0c;希望对您有所帮助&#xff01; 1. 应用场景 2. 思路分析 3. 代码分析 4. 具体实现代码 效果截图&#xff1a; 1.应用场景 适用于商城、秒杀、商品购买等类型的小程序&#xff0c;负责将顾客浏览的商…

微信小程序微商城(八):缓存实现商品购物车功能

IT实战联盟博客&#xff1a;http://blog.100boot.cn 上一篇&#xff1a;微信小程序微商城&#xff08;七&#xff09;&#xff1a;动态API实现商品分类 看效果 购物车.gif 开发计划 1、商品详情页将商品信息放入缓存 2、购物车页面读取缓存获取商品信息 3、购物车商品计算…

微信小程序开发一个小型商城(六、购物车页面)

上一篇文章&#xff1a;微信小程序开发一个小型商城&#xff08;五、商品详情&#xff09; 当我们在商品详情界面中点击添加购物后&#xff0c;会跳转到购物车界面&#xff0c;购物车界面是一个tabbar&#xff0c;在跳转的时候需要加上ope-type。看下购物车的静态页面把&#x…

微信小程序实现一个购物车页面的简易列表效果

本文只是简单的模仿天猫APP的购物车列表的样式效果&#xff0c;并实现了部分事件功能&#xff0c;功能并不完善&#xff0c;请降低期待观看。 天猫APP的购物车效果&#xff1a; 小程序模仿的实现效果&#xff1a; wxml部分的代码&#xff1a; <view wx:if"{{!isCartEmp…

【Python之pymysql库学习】一、分析fetchone()、fetchmany()、fetchall()(保姆级图文+实现代码)

目录 实现效果实现思路实现代码总结 欢迎关注 『Python之pymysql库学习』 系列&#xff0c;持续更新中 欢迎关注 『Python之pymysql库学习』 系列&#xff0c;持续更新中 实现效果 实现思路 其实有半数代码是创建数据库和创建数据表并插入数据这些环境配置部分我都写好了&…

fetchone、fetchall

fetchone(): 该方法获取下一个查询结果集。结果集是一个对象,读取一行结果&#xff0c;读取完指向下一行&#xff0c;到空为止 fetchall():接收全部的返回结果行&#xff0c;到空为止 fetchone() &#xff1a; 返回单个的元组&#xff0c;也就是一条记录(row)&#xff0c;如果没…

python fetchall方法_Python连接MySQL并使用fetchall()方法过滤特殊字符

python3.3从mysql里取出的数据莫名其妙有括号和逗号每天跟自己喜欢的人一起&#xff0c;通电话&#xff0c;旅行&#xff0c;重复一个承诺和梦想&#xff0c;听他第二十八次提起童年往事&#xff0c;每年的同一天和他庆祝生日&#xff0c;每年的情人节圣诞节除夕&#xff0c;也…

pdo fetchAll

作用 fetchAll()方法是获取结果集中的所有行.其返回值是一个包含结果集中所有数据的二维数组。 PDOStatement::fetchAll ([ int $fetch_style [, mixed $fetch_argument[, array$ctor_args array() ]]] ) fetch_style:控制结果的返回方式 PDO::FETCH_ASSOC 关联数组形式 PD…

记录一个常用函数fetchall()的使用过程

fetchall() 作用是返回多个元组&#xff0c;即对应数据库里的多条数据概念&#xff1b; 常见用法是 cursor.execute(‘select * from table’) value cursor.fetchall() 此时&#xff0c;print(value)则会输出以下二维元组&#xff0c;如下图 拓展&#xff1a; 同类函数fet…

Python从Oracle数据库中获取数据——fetchall(),fetchone(),fetchmany()函数功能分析

Python从Oracle数据库中获取数据——fetchall(),fetchone(),fetchmany()函数功能分析 一、fetchall()&#xff0c;fetchone()&#xff0c;fetchmany()简单介绍 1、fetchall()函数,它的返回值是多个元组,即返回多个行记录,如果没有结果,返回的是() 2、fetchone()函数,它的返回…

KITTI数据集可视化(一):点云多种视图的可视化实现

如有错误&#xff0c;恳请指出。 在本地上&#xff0c;可以安装一些软件&#xff0c;比如&#xff1a;Meshlab&#xff0c;CloudCompare等3D查看工具来对点云进行可视化。而这篇博客是将介绍一些代码工具将KITTI数据集进行可视化操作&#xff0c;包括点云鸟瞰图&#xff0c;FOV…

KITTI数据集的点云格式转PCD格式

参考文章&#xff1a;https://blog.csdn.net/xinguihu/article/details/78922005 KITTI数据集应该不用多做介绍了&#xff0c;基本上做自动驾驶的都知道这个东西。最近本人用到这个数据集想看看里面的点云长什么模样&#xff0c;却发现有点别扭&#xff0c;没有直接可以看的工…

使用kitti数据集实现自动驾驶——发布照片、点云、IMU、GPS、显示2D和3D侦测框

本次内容主要是使用kitti数据集来可视化kitti车上一些传感器&#xff08;相机、激光雷达、IMU&#xff09;采集的资料以及对行人和车辆进行检测并在图像中画出行人和车辆的2D框、在点云中画出行人和车辆的3D框。 首先先看看最终实现的效果&#xff1a; 自动驾驶视频 看了上面的…

KITTI数据集-label解析笔记

笔记摘自&#xff1a;KITTI数据集--label解析与传感器间坐标转换参数解析_苏源流的博客-CSDN博客 KITTI数据集是自动驾驶领域最知名的数据集之一。 一、kitti数据集&#xff0c;label解析 16个数代表的含义&#xff1a; 第1个字符串&#xff1a;代表目标的类别 Car, Van, Tru…

16个车辆信息检测数据集收集汇总(简介及链接)

16个车辆信息检测数据集收集汇总&#xff08;简介及链接) 转载自&#xff1a;https://blog.csdn.net/u014546828/article/details/109089621?utm_mediumdistribute.pc_relevant.none-task-blog-baidujs_baidulandingword-1&spm1001.2101.3001.4242 目录 1. UA-DETRAC …

双目网络公开数据集的特性

文章目录 概述SceneFlowKITTI 2012 & 2015ETH3D 2017Middlebury 2014 概述 参考文章&#xff1a;Rethinking Training Strategy in Stereo Matching 主流双目公开数据集有&#xff1a;SceneFlow、KITTI、ETH3D、MB。 各个双目网络主流训练数据视差分布的直方图&#xff1a;…

KITTI数据集下载及介绍

KITTI数据集下载及介绍 KITTI数据集由德国卡尔斯鲁厄理工学院和丰田美国技术研究院联合创办&#xff0c;是目前国际上最大的自动驾驶场景下的计算机视觉算法评测数据集。该数据集用于评测立体图像(stereo)&#xff0c;光流(optical flow)&#xff0c;视觉测距(visual odometry…

KITTI 数据集--下载链接

Visual Odometry / SLAM Evaluation 2012 数据集主页&#xff1a;The KITTI Vision Benchmark Suite (cvlibs.net) 里程计基准由22个立体序列组成&#xff0c;以无损失png格式保存。 11个具有真实轨迹的序列&#xff08;00-10&#xff09;用于训练&#xff0c;11个没有真实…

KITTI数据集下载及解析

KITTI数据集下载及解析 W.P. Xiao, Vision group&#xff0c;SHUSV 版本更新时间更新内容作者1V 1.02020.01.09完成主体内容W.P. Xiao2 文章目录 KITTI Dataset1 简介1.1 数据采集平台1.2 坐标系 2 数据解析2.1 image文件2.2 velodyne文件2.3 calib文件2.4 label文件 3 KITTI可…