javaGUI實現(xiàn)多人聊天功能
更新時間:2022年09月15日 16:27:03 作者:段茜琳
這篇文章主要為大家詳細介紹了javaGUI實現(xiàn)多人聊天功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了javaGUI實現(xiàn)多人聊天的具體代碼,供大家參考,具體內容如下
服務器
package com.ff.chat.chatserver.frame;
import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.net.BindException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Iterator;
public class ServerFrame extends JFrame {
? ? JTextArea msgArea;
? ? ArrayList<Socket> socketArrayList = new ArrayList<>();
? ? boolean serverFlag = true;//服務器啟動標志
? ? StringBuffer sb = new StringBuffer();
? ? ServerSocket serverSocket;
? ? //創(chuàng)建服務器端的顯示窗口
? ? public void creatFrame(){
? ? ? ? this.setTitle("聊天室-服務器端");
? ? ? ? this.setSize(500,500);
? ? ? ? this.setLocationRelativeTo(null);
? ? ? ? this.setResizable(false);
? ? ? ? this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
? ? ? ? //創(chuàng)建一個面板
? ? ? ? JPanel jp = new JPanel(new BorderLayout());
? ? ? ? //中間面板
? ? ? ? JPanel centerPanel = new JPanel();
? ? ? ? msgArea = new JTextArea(30,40);
? ? ? ? msgArea.setEditable(false);
? ? ? ? JScrollPane jsp = new JScrollPane(msgArea);
? ? ? ? centerPanel.add(jsp);
? ? ? ? jp.add(centerPanel);
? ? ? ? this.add(jp);
? ? ? ? this.setVisible(true);
? ? ? ? this.addWindowListener(new WindowAdapter() {
? ? ? ? ? ? @Override
? ? ? ? ? ? public void windowClosing(WindowEvent e) {
? ? ? ? ? ? ? ? int res = JOptionPane.showConfirmDialog(null,"確定要關閉服務器嗎?",
? ? ? ? ? ? ? ? ? ? ? ? "操作提示",JOptionPane.OK_CANCEL_OPTION);
? ? ? ? ? ? ? ? if(res == 0){
? ? ? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? ? ? dispose();
? ? ? ? ? ? ? ? ? ? ? ? serverSocket.close();
? ? ? ? ? ? ? ? ? ? } catch (IOException ioException) {
? ? ? ? ? ? ? ? ? ? ? ? ioException.printStackTrace();
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? });
? ? }
? ? //啟動服務器,創(chuàng)建ServerSocket
? ? public void startServer(){
? ? ? ? try {
? ? ? ? ? ? //創(chuàng)建ServerSocket
? ? ? ? ? ? serverSocket = new ServerSocket(9998);
? ? ? ? ? ? System.out.println("等待客戶端連接");
? ? ? ? ? ? //循環(huán)監(jiān)聽客戶端連接
? ? ? ? ? ? while (serverFlag){
? ? ? ? ? ? ? ? if(serverSocket.isClosed()){
? ? ? ? ? ? ? ? ? ? serverFlag = false;
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? Socket socket = serverSocket.accept();
? ? ? ? ? ? ? ? System.out.println("客戶端連接成功");
? ? ? ? ? ? ? ? socketArrayList.add(socket);
? ? ? ? ? ? ? ? //為每一個客戶端開啟一個線程,監(jiān)聽客戶端發(fā)來的消息
? ? ? ? ? ? ? ? new ServerThread(socket).start();
? ? ? ? ? ? }
? ? ? ? } catch (BindException b) {
? ? ? ? ? ? b.printStackTrace();
? ? ? ? ? ? System.out.println("服務器端口被占用");
? ? ? ? ? ? System.exit(0);
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? System.out.println("服務器啟動失敗");
? ? ? ? ? ? serverFlag = false;
? ? ? ? }
? ? }
? ? //創(chuàng)建一個內部類,開啟一個線程,接收消息
? ? class ServerThread extends Thread{
? ? ? ? Socket socket;
? ? ? ? DataInputStream in;
? ? ? ? DataOutputStream out;
? ? ? ? boolean clientFlag = true;
? ? ? ? public ServerThread(Socket socket){
? ? ? ? ? ? this.socket = socket;
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? this.in = new DataInputStream(socket.getInputStream());
? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? @Override
? ? ? ? public void run() {
? ? ? ? ? ? //監(jiān)聽接收客戶端發(fā)送的消息
? ? ? ? ? ? while (clientFlag){
? ? ? ? ? ? ? ? if(socket.isClosed()){
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? String msg = in.readUTF();//讀到客戶端發(fā)送的消息
? ? ? ? ? ? ? ? ? ? sb.append(msg+"\n");
? ? ? ? ? ? ? ? ? ? System.out.println(sb);
? ? ? ? ? ? ? ? ? ? msgArea.setText(sb.toString());
? ? ? ? ? ? ? ? ? ? //從服務器端向客戶端發(fā)送消息
? ? ? ? ? ? ? ? ? ? if(socketArrayList.size() > 0){
? ? ? ? ? ? ? ? ? ? ? ? Iterator<Socket> it = socketArrayList.iterator();
? ? ? ? ? ? ? ? ? ? ? ? while (it.hasNext()){
? ? ? ? ? ? ? ? ? ? ? ? ? ? Socket soc = it.next();
? ? ? ? ? ? ? ? ? ? ? ? ? ? if(soc.isClosed()){//當客戶端某個socket已經為關閉狀態(tài),移除此socket
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? it.remove();
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? continue;
? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? //客戶端socket如果沒有關閉,向客戶端發(fā)送消息
? ? ? ? ? ? ? ? ? ? ? ? ? ? out = new DataOutputStream(soc.getOutputStream());
? ? ? ? ? ? ? ? ? ? ? ? ? ? out.writeUTF(sb.toString());
? ? ? ? ? ? ? ? ? ? ? ? ? ? out.flush();
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? } catch (EOFException ef){
? ? ? ? ? ? ? ? ? ? System.out.println("ip為:"+socket.getInetAddress()+"的客戶端下線了");
? ? ? ? ? ? ? ? ? ? clientFlag = false;
? ? ? ? ? ? ? ? }catch (IOException e) {
? ? ? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? }
}package com.ff.chat.chatserver.frame;
public class ServerRun {
? ? public static void main(String[] args) {
? ? ? ? ServerFrame serverFrame = new ServerFrame();
? ? ? ? serverFrame.creatFrame();
? ? ? ? serverFrame.startServer();
? ? }
}客戶端
注意:要在自己的電腦上運行多次客戶端需要勾選如下選項

1.登錄界面
package com.ff.chat.chatclient.frame;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.Socket;
public class LoginFrame extends JFrame {
? ? JTextField accountField = null;
? ? //創(chuàng)建窗口
? ? public void creatFrame(){
? ? ? ? this.setTitle("聊天窗口");
? ? ? ? this.setSize(400,400);
? ? ? ? this.setResizable(false);
? ? ? ? this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
? ? ? ? this.setLocationRelativeTo(null);
? ? ? ? /*
? ? ? ? * 創(chuàng)建一個4行1列的面板
? ? ? ? * */
? ? ? ? JPanel jp = new JPanel(new GridLayout(4,1));
? ? ? ? //歡迎登陸面板
? ? ? ? JPanel welcomePanel = new JPanel();
? ? ? ? JLabel welcomLabel = new JLabel("歡迎登陸");
? ? ? ? welcomePanel.add(welcomLabel);
? ? ? ? //賬號面板
? ? ? ? JPanel accountPanel = new JPanel();
? ? ? ? JLabel accountLabel = new JLabel("賬號");
? ? ? ? accountField = new JTextField(15);
? ? ? ? accountPanel.add(accountLabel);
? ? ? ? accountPanel.add(accountField);
? ? ? ? //密碼面板
? ? ? ? JPanel passwordPanel = new JPanel();
? ? ? ? JLabel passwordLabel = new JLabel("密碼");
? ? ? ? JPasswordField passwordField = new JPasswordField(15);
? ? ? ? passwordPanel.add(passwordLabel);
? ? ? ? passwordPanel.add(passwordField);
? ? ? ? //登錄按鈕面板
? ? ? ? JPanel btnPanel = new JPanel();
? ? ? ? JButton loginBtn = new JButton("登錄");
? ? ? ? JButton regBtn = new JButton("注冊");
? ? ? ? btnPanel.add(loginBtn);
? ? ? ? btnPanel.add(regBtn);
? ? ? ? jp.add(welcomePanel);
? ? ? ? jp.add(accountPanel);
? ? ? ? jp.add(passwordPanel);
? ? ? ? jp.add(btnPanel);
? ? ? ? this.add(jp);
? ? ? ? this.setVisible(true);
? ? ? ? //組件綁定事件監(jiān)聽
? ? ? ? loginBtn.addActionListener(new ActionListener() {
? ? ? ? ? ? @Override
? ? ? ? ? ? public void actionPerformed(ActionEvent e) {
? ? ? ? ? ? ? ? //獲得賬號密碼
? ? ? ? ? ? ? ? String account = accountField.getText();
? ? ? ? ? ? ? ? String password = new String(passwordField.getPassword());
? ? ? ? ? ? ? ? if(account.length() == 0){
? ? ? ? ? ? ? ? ? ? JOptionPane.showMessageDialog(null,"賬號不能為空",
? ? ? ? ? ? ? ? ? ? ? ? ? ? "操作提示",JOptionPane.WARNING_MESSAGE);
? ? ? ? ? ? ? ? ? ? return;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? if(password.length() == 0){
? ? ? ? ? ? ? ? ? ? JOptionPane.showMessageDialog(null,"密碼不能為空",
? ? ? ? ? ? ? ? ? ? ? ? ? ? "操作提示",JOptionPane.WARNING_MESSAGE);
? ? ? ? ? ? ? ? ? ? return;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? //預留2.0版本 與數(shù)據庫交互
? ? ? ? ? ? ? ? //連接服務器,創(chuàng)建Socket對象
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? Socket socket = new Socket("192.168.31.179",9998);//該地址為要連接的服務器的地址
? ? ? ? ? ? ? ? ? ? new ClientFrame(socket,account).creatFrame();
? ? ? ? ? ? ? ? ? ? dispose(); //釋放當前登錄窗口
? ? ? ? ? ? ? ? } catch (IOException ioException) {
? ? ? ? ? ? ? ? ? ? ioException.printStackTrace();
? ? ? ? ? ? ? ? ? ? JOptionPane.showMessageDialog(null,"服務器連接失敗",
? ? ? ? ? ? ? ? ? ? ? ? ? ? "操作提示",JOptionPane.WARNING_MESSAGE);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? });
? ? }
}2.聊天界面
package com.ff.chat.chatclient.frame;
import com.ff.chat.chatclient.utils.DateUtil;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Date;
public class ClientFrame extends JFrame {
? ? String account;
? ? Socket socket;
? ? DataOutputStream out;//數(shù)據輸出字節(jié)流
? ? DataInputStream in;//數(shù)據輸入字節(jié)流
? ? JTextArea msgArea;
? ? //創(chuàng)建聊天窗口時,初始化數(shù)據
? ? public ClientFrame(Socket socket,String account){
? ? ? ? this.socket = socket;
? ? ? ? this.account = account;
? ? ? ? try {
? ? ? ? ? ? out = new DataOutputStream(socket.getOutputStream());
? ? ? ? ? ? in = new DataInputStream(socket.getInputStream());
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }
? ? //創(chuàng)建聊天窗口
? ? public void creatFrame(){
? ? ? ? this.setTitle("聊天窗口-"+account);
? ? ? ? this.setSize(500,500);
? ? ? ? this.setResizable(false);
? ? ? ? this.setLocationRelativeTo(null);
? ? ? ? this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
? ? ? ? //創(chuàng)建一個面板
? ? ? ? JPanel jp = new JPanel(new BorderLayout());
? ? ? ? //中間面板
? ? ? ? JPanel centerPanel = new JPanel();
? ? ? ? msgArea = new JTextArea(30,40);
? ? ? ? msgArea.setEditable(false);//不可以直接編輯
? ? ? ? JScrollPane jsp = new JScrollPane(msgArea);
? ? ? ? centerPanel.add(jsp);
? ? ? ? //底部面板
? ? ? ? JPanel bottomPanel = new JPanel();
? ? ? ? JTextField msg = new JTextField(30);
? ? ? ? JButton sendBtn = new JButton("發(fā)送");
? ? ? ? bottomPanel.add(msg);
? ? ? ? bottomPanel.add(sendBtn);
? ? ? ? jp.add(centerPanel);
? ? ? ? jp.add(bottomPanel,BorderLayout.SOUTH);
? ? ? ? this.add(jp);
? ? ? ? this.setVisible(true);
? ? ? ? //發(fā)送按鈕添加監(jiān)聽事件
? ? ? ? sendBtn.addActionListener(new ActionListener() {
? ? ? ? ? ? @Override
? ? ? ? ? ? public void actionPerformed(ActionEvent e) {
? ? ? ? ? ? ? ? String m = msg.getText(); //獲得客戶端輸入的聊天內容
? ? ? ? ? ? ? ? if(m.length() == 0){
? ? ? ? ? ? ? ? ? ? JOptionPane.showMessageDialog(null,"不能發(fā)送空白消息");
? ? ? ? ? ? ? ? ? ? return;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? //向服務器發(fā)送消息
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? String ms = account+":"+DateUtil.dateStr(new Date())+"\n"+m;
? ? ? ? ? ? ? ? ? ? out.writeUTF(ms);//向服務器發(fā)送消息
? ? ? ? ? ? ? ? ? ? out.flush();
? ? ? ? ? ? ? ? ? ? msg.setText("");//發(fā)送成功,清空聊天文本框
? ? ? ? ? ? ? ? } catch (IOException ioException) {
? ? ? ? ? ? ? ? ? ? ioException.printStackTrace();
? ? ? ? ? ? ? ? ? ? JOptionPane.showMessageDialog(null,"服務器連接失敗");
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? });
? ? ? ? //聊天窗口添加事件監(jiān)聽
? ? ? ? this.addWindowListener(new WindowAdapter() {
? ? ? ? ? ? @Override
? ? ? ? ? ? public void windowClosing(WindowEvent e) {
? ? ? ? ? ? ? ? int res = JOptionPane.showConfirmDialog(null,"你確定要退出嗎?",
? ? ? ? ? ? ? ? ? ? ? ? "操作提示",JOptionPane.OK_CANCEL_OPTION);
? ? ? ? ? ? ? ? if(res == 0){
? ? ? ? ? ? ? ? ? ? dispose();
? ? ? ? ? ? ? ? ? ? new LoginFrame().creatFrame();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? socket.close();
? ? ? ? ? ? ? ? } catch (IOException ioException) {
? ? ? ? ? ? ? ? ? ? ioException.printStackTrace();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? });
? ? ? ? //啟動一個線程,監(jiān)聽服務器是否向客戶端發(fā)送了消息
? ? ? ? new ClientThread(socket).start();
? ? }
? ? //創(chuàng)建一個內部類
? ? class ClientThread extends Thread{
? ? ? ? //接收從服務器發(fā)來的消息
? ? ? ? Socket socket;
? ? ? ? boolean serverFlag = true;
? ? ? ? public ClientThread(Socket socket){
? ? ? ? ? ? this.socket = socket;
? ? ? ? }
? ? ? ? @Override
? ? ? ? public void run(){
? ? ? ? ? ? //監(jiān)聽接收服務器發(fā)來的消息
? ? ? ? ? ? while (serverFlag){
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? String ms = in.readUTF();
? ? ? ? ? ? ? ? ? ? msgArea.setText(ms);
? ? ? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? ? ? System.out.println("客戶端"+account+"下線了");
? ? ? ? ? ? ? ? ? ? serverFlag = false;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? }
}3.運行客戶端
package com.ff.chat.chatclient.frame;
public class ClientRun {
? ? public static void main(String[] args) {
? ? ? ? new LoginFrame().creatFrame();
? ? }
}以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
JVM實戰(zhàn)系列之CPU100%和內存100%排查
本文主要介紹了JVM實戰(zhàn)系列之CPU100%和內存100%排查,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-06-06
Spring動態(tài)數(shù)據源實現(xiàn)讀寫分離詳解
這篇文章主要為大家詳細介紹了Spring動態(tài)數(shù)據源實現(xiàn)讀寫分離,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07

