一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - java課程設計做一個多人聊天室(socket+多線程)

java課程設計做一個多人聊天室(socket+多線程)

2021-12-03 14:19Henrik-Yao Java教程

這篇文章主要介紹了我的java課程設計一個多人聊天室(socket+多線程)本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

大一下學期的java期末課程設計,分享一下

 

課設要求

多人聊天工具 服務器要求1:能夠看到所有在線用戶(25%) 服務器要求2:能夠強制用戶下線(25%) 客戶端要求1:能夠看到所有在線用戶(25%) 客戶端要求2:能夠向某個用戶發送消息(25%)

 

相關知識點

1.服務端能夠看到所有在線用戶

服務端繼承了JFrame,實現可視化,通過socket實現服務端與客戶端的連接,服務端每接收一個連接,把傳進來的用戶名和對應的socket連接封裝成一個User對象,把User對象存進一個ArrayList的用戶列表并把User對象通過取用戶名方法取得用戶名存進一個ArrayList的用戶名列表,添加一個JPanel組件,將ArrayList中的內容通過循環顯示JPanel中并布局在窗體的右邊,在每當有人上線或者下線,刷新JPanel組件。

2.服務端能夠強制用戶下線

創建一個布局在窗體的下方的JPanel,在此JPanel中分別添加JLabel用于顯示提示文字,添加JTextField用于獲取服務端想要強制用戶下線的ID,添加JButton用于綁定強制用戶下線的事件監聽,事件監聽中將獲取的JTextField的內容與用戶名列表進行逐一匹配,匹配上則創建JSON格式的鍵值對對象,通過用戶列表循環廣播告知其他用戶,并在用戶列表和用戶名列表中分別刪除該用戶信息。

3.客戶端能夠看到所有在線用戶

客戶端繼承了JFrame,實現可視化,添加了一個布局在窗口右邊的JPanel,把從服務端接收到的用戶名列表中的信息放進去。

4.客戶端要求能夠向某個用戶發送消息

客戶端私發消息通過在消息后面加入-和目標用戶名,傳給服務端,服務端截取目標用戶名,在用戶名列表中判斷是否存在此人,有則判斷是否是私發,私發則向目標用戶發送消息,沒有則向全部用戶發送消息。

5.運用JDBC實現持久化存儲用戶信息

數據庫連接池運用了阿里巴巴的durid,定義一個JDBCUtils類,提供靜態代碼塊加載配置文件,初始化連接池對象,通過Spring框架的JDBCTemplate對象進行sql語句的執行,在UserDao中提供了登錄和注冊方法,登錄方法運用queryForObject方法進行登錄查詢,如果查到返回一個User對象,查不到則返回空,注冊方法直接插入新記錄,此處建表語句中把用戶名設置成了主鍵,保證了用戶名的唯一性,注冊失敗有警告彈窗提示。這里加了一個ChatTest類用于繞過數據庫賬號校驗,可以直接進入客戶端進行連接。

6.使用JSONObject對象封裝數據

在數據的傳輸中運用了鍵值對的形式進行傳輸,客戶端傳輸給服務端的數據包中,通過判斷private鍵的值來確認是否私發,通過username鍵告知服務端客戶端的用戶名,通過msg鍵傳輸具體消息,服務端傳輸給客戶端的數據包中,通過判斷user_list鍵的值來確認在線用戶及人數

7.使用Maven構建管理項目

項目中運用到了JDBC相關內容和JSONObject對象,導入了一些依賴jar包,其中倉庫和配置文件都是用的idea默認配置。

 

類圖

java課程設計做一個多人聊天室(socket+多線程)

 

項目框架

java課程設計做一個多人聊天室(socket+多線程)

 

核心代碼

1.maven配置文件pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.example</groupId>
  <artifactId>MyChat</artifactId>
  <version>1.0-SNAPSHOT</version>

  <properties>
      <maven.compiler.source>15</maven.compiler.source>
      <maven.compiler.target>15</maven.compiler.target>
  </properties>

  <dependencies>
      <dependency>
          <groupId>net.sf.json-lib</groupId>
          <artifactId>json-lib</artifactId>
          <version>2.4</version>
          <classifier>jdk15</classifier>
      </dependency>
      <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>druid</artifactId>
          <version>1.2.3</version>
      </dependency>
      <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>5.1.45</version>
      </dependency>
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-jdbc</artifactId>
          <version>5.3.6</version>
      </dependency>
  </dependencies>

</project>

2.服務器端Server.java

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_area
      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("在線用戶"));
      //在用戶顯示區添加show_uesr
      panel_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服務器,綁定端口11111
          ServerSocket 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 {
      //存放全局變量socket
      private final Socket socket;

      //構造函數,初始化socket
      public ServerThread(Socket socket) {
          this.socket = socket;
      }

      @Override
      public 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();
                  }
              }
          }

      }
  }


}

代碼太多了,懶得注釋了,大家應該看得懂

 

3.客戶端登錄界面Client.java

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("/a.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(130,300,100,50);
      add(login);
      JButton register = new JButton("注冊");
      register.setBounds(280,300,100,50);
      add(register);

      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();
      });
  }

}

4.客戶端注冊界面Register.java

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("/a.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();
      });


  }

}

5.客戶端聊天界面Chat.java

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);
      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_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("/a.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 {
      @Override
      public 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();
          }
      }
  }

}

6.用戶實體User.java

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;
  }
}

7.JDBC工具類

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;
  }


}

8.UserDao.java連接數據庫

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 {
          //編寫sql
          String 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 ,?,?)";
          int count = template.update(sql,register_user.getUsername(),register_user.getPassword());
          return count;
      } catch (DataAccessException e) {
          e.printStackTrace();
          return 0;
      }
  }

}

 

運行結果

java課程設計做一個多人聊天室(socket+多線程) java課程設計做一個多人聊天室(socket+多線程)java課程設計做一個多人聊天室(socket+多線程)java課程設計做一個多人聊天室(socket+多線程)

java課程設計做一個多人聊天室(socket+多線程)

到此這篇關于java課程設計做一個多人聊天室(socket+多線程)的文章就介紹到這了,更多相關java多人聊天室內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/qq_50216270/article/details/119877313

延伸 · 閱讀

精彩推薦
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
主站蜘蛛池模板: 国产资源视频在线观看 | 媳妇和公公小说 | 我被黄总征服的全过程 | 第一次破女视频国产一级 | 国产激情一区二区三区四区 | chinesespank打屁股 | 青青青国产精品国产精品久久久久 | 国产欧美视频一区二区三区 | 亚洲国产精品无码中文在线 | 女女同性做爰xxoo亲吻 | 色综合久久98天天综合 | 免费人成在线观看视频播放 | 精品欧美一区二区三区在线观看 | 日韩无砖专区2020在线 | 茄子香蕉视频 | 国产视频中文字幕 | 欧美高清在线 | 日韩porn| 欧美另类bbbxxxxx另类 | 污黄在线观看 | 青青草原免费在线视频 | 久久精品嫩草影院免费看 | 亚洲成人一区在线 | 国产高清小视频 | 日本免费一区二区三区a区 日本免费三片在线观看 | 喜欢老头吃我奶躁我的动图 | 日韩伦理在线看 | 欧美大陆日韩一区二区三区 | www.爱情岛论坛 | 国产成人在线视频播放 | 亚洲成av人片在线观看天堂无码 | 性夜影院爽黄A爽免费动漫 性色欲情网站IWWW九文堂 | 美女靠逼免费视频 | 国产动作大片 | 波多野结衣女教师在线观看 | 久久久久青草大香线综合精品 | 色噜噜狠狠狠综合曰曰曰88av | 网友自拍咪咪爱 | 国产成人愉拍免费视频 | 欧美视频一区二区三区在线观看 | 国内精品九一在线播放 |