javaGUI實(shí)現(xiàn)多人聊天功能
本文實(shí)例為大家分享了javaGUI實(shí)現(xiàn)多人聊天的具體代碼,供大家參考,具體內(nèi)容如下
服務(wù)器
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;//服務(wù)器啟動(dòng)標(biāo)志 ? ? StringBuffer sb = new StringBuffer(); ? ? ServerSocket serverSocket; ? ? //創(chuàng)建服務(wù)器端的顯示窗口 ? ? public void creatFrame(){ ? ? ? ? this.setTitle("聊天室-服務(wù)器端"); ? ? ? ? this.setSize(500,500); ? ? ? ? this.setLocationRelativeTo(null); ? ? ? ? this.setResizable(false); ? ? ? ? this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); ? ? ? ? //創(chuàng)建一個(gè)面板 ? ? ? ? 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,"確定要關(guān)閉服務(wù)器嗎?", ? ? ? ? ? ? ? ? ? ? ? ? "操作提示",JOptionPane.OK_CANCEL_OPTION); ? ? ? ? ? ? ? ? if(res == 0){ ? ? ? ? ? ? ? ? ? ? try { ? ? ? ? ? ? ? ? ? ? ? ? dispose(); ? ? ? ? ? ? ? ? ? ? ? ? serverSocket.close(); ? ? ? ? ? ? ? ? ? ? } catch (IOException ioException) { ? ? ? ? ? ? ? ? ? ? ? ? ioException.printStackTrace(); ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? }); ? ? } ? ? //啟動(dòng)服務(wù)器,創(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); ? ? ? ? ? ? ? ? //為每一個(gè)客戶端開啟一個(gè)線程,監(jiān)聽客戶端發(fā)來的消息 ? ? ? ? ? ? ? ? new ServerThread(socket).start(); ? ? ? ? ? ? } ? ? ? ? } catch (BindException b) { ? ? ? ? ? ? b.printStackTrace(); ? ? ? ? ? ? System.out.println("服務(wù)器端口被占用"); ? ? ? ? ? ? System.exit(0); ? ? ? ? } catch (IOException e) { ? ? ? ? ? ? e.printStackTrace(); ? ? ? ? ? ? System.out.println("服務(wù)器啟動(dòng)失敗"); ? ? ? ? ? ? serverFlag = false; ? ? ? ? } ? ? } ? ? //創(chuàng)建一個(gè)內(nèi)部類,開啟一個(gè)線程,接收消息 ? ? 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()); ? ? ? ? ? ? ? ? ? ? //從服務(wù)器端向客戶端發(fā)送消息 ? ? ? ? ? ? ? ? ? ? if(socketArrayList.size() > 0){ ? ? ? ? ? ? ? ? ? ? ? ? Iterator<Socket> it = socketArrayList.iterator(); ? ? ? ? ? ? ? ? ? ? ? ? while (it.hasNext()){ ? ? ? ? ? ? ? ? ? ? ? ? ? ? Socket soc = it.next(); ? ? ? ? ? ? ? ? ? ? ? ? ? ? if(soc.isClosed()){//當(dāng)客戶端某個(gè)socket已經(jīng)為關(guān)閉狀態(tài),移除此socket ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? it.remove(); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? continue; ? ? ? ? ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? ? ? ? ? //客戶端socket如果沒有關(guān)閉,向客戶端發(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(); ? ? } }
客戶端
注意:要在自己的電腦上運(yùn)行多次客戶端需要勾選如下選項(xiàng)
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)建一個(gè)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; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? //預(yù)留2.0版本 與數(shù)據(jù)庫交互 ? ? ? ? ? ? ? ? //連接服務(wù)器,創(chuàng)建Socket對象 ? ? ? ? ? ? ? ? try { ? ? ? ? ? ? ? ? ? ? Socket socket = new Socket("192.168.31.179",9998);//該地址為要連接的服務(wù)器的地址 ? ? ? ? ? ? ? ? ? ? new ClientFrame(socket,account).creatFrame(); ? ? ? ? ? ? ? ? ? ? dispose(); //釋放當(dāng)前登錄窗口 ? ? ? ? ? ? ? ? } catch (IOException ioException) { ? ? ? ? ? ? ? ? ? ? ioException.printStackTrace(); ? ? ? ? ? ? ? ? ? ? JOptionPane.showMessageDialog(null,"服務(wù)器連接失敗", ? ? ? ? ? ? ? ? ? ? ? ? ? ? "操作提示",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ù)據(jù)輸出字節(jié)流 ? ? DataInputStream in;//數(shù)據(jù)輸入字節(jié)流 ? ? JTextArea msgArea; ? ? //創(chuàng)建聊天窗口時(shí),初始化數(shù)據(jù) ? ? 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)建一個(gè)面板 ? ? ? ? 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(); //獲得客戶端輸入的聊天內(nèi)容 ? ? ? ? ? ? ? ? if(m.length() == 0){ ? ? ? ? ? ? ? ? ? ? JOptionPane.showMessageDialog(null,"不能發(fā)送空白消息"); ? ? ? ? ? ? ? ? ? ? return; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? //向服務(wù)器發(fā)送消息 ? ? ? ? ? ? ? ? try { ? ? ? ? ? ? ? ? ? ? String ms = account+":"+DateUtil.dateStr(new Date())+"\n"+m; ? ? ? ? ? ? ? ? ? ? out.writeUTF(ms);//向服務(wù)器發(fā)送消息 ? ? ? ? ? ? ? ? ? ? out.flush(); ? ? ? ? ? ? ? ? ? ? msg.setText("");//發(fā)送成功,清空聊天文本框 ? ? ? ? ? ? ? ? } catch (IOException ioException) { ? ? ? ? ? ? ? ? ? ? ioException.printStackTrace(); ? ? ? ? ? ? ? ? ? ? JOptionPane.showMessageDialog(null,"服務(wù)器連接失敗"); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? }); ? ? ? ? //聊天窗口添加事件監(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(); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? }); ? ? ? ? //啟動(dòng)一個(gè)線程,監(jiān)聽服務(wù)器是否向客戶端發(fā)送了消息 ? ? ? ? new ClientThread(socket).start(); ? ? } ? ? //創(chuàng)建一個(gè)內(nèi)部類 ? ? class ClientThread extends Thread{ ? ? ? ? //接收從服務(wù)器發(fā)來的消息 ? ? ? ? Socket socket; ? ? ? ? boolean serverFlag = true; ? ? ? ? public ClientThread(Socket socket){ ? ? ? ? ? ? this.socket = socket; ? ? ? ? } ? ? ? ? @Override ? ? ? ? public void run(){ ? ? ? ? ? ? //監(jiān)聽接收服務(wù)器發(fā)來的消息 ? ? ? ? ? ? while (serverFlag){ ? ? ? ? ? ? ? ? try { ? ? ? ? ? ? ? ? ? ? String ms = in.readUTF(); ? ? ? ? ? ? ? ? ? ? msgArea.setText(ms); ? ? ? ? ? ? ? ? } catch (IOException e) { ? ? ? ? ? ? ? ? ? ? System.out.println("客戶端"+account+"下線了"); ? ? ? ? ? ? ? ? ? ? serverFlag = false; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? } ? ? } }
3.運(yùn)行客戶端
package com.ff.chat.chatclient.frame; public class ClientRun { ? ? public static void main(String[] args) { ? ? ? ? new LoginFrame().creatFrame(); ? ? } }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 使用Java和WebSocket實(shí)現(xiàn)網(wǎng)頁聊天室實(shí)例代碼
- java socket實(shí)現(xiàn)聊天室 java實(shí)現(xiàn)多人聊天功能
- java聊天室的實(shí)現(xiàn)代碼
- java實(shí)現(xiàn)自動(dòng)回復(fù)聊天機(jī)器人
- 基于Java Socket實(shí)現(xiàn)一個(gè)簡易在線聊天功能(一)
- Java基于socket實(shí)現(xiàn)簡易聊天室實(shí)例
- java Socket實(shí)現(xiàn)網(wǎng)頁版在線聊天
- java中UDP簡單聊天程序?qū)嵗a
- java實(shí)現(xiàn)一個(gè)簡單TCPSocket聊天室功能分享
- 基于java編寫局域網(wǎng)多人聊天室
相關(guān)文章
Java實(shí)現(xiàn)讀取163郵箱,qq郵箱的郵件內(nèi)容
這篇文章主要利用Java語言實(shí)現(xiàn)讀取163郵箱和qq郵箱的郵件內(nèi)容,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起動(dòng)手試一試2022-02-02SpringBoot中利用AOP和攔截器實(shí)現(xiàn)自定義注解
本文將通過攔截器+AOP實(shí)現(xiàn)自定義注解,在這里攔截器充當(dāng)在指定注解處要執(zhí)行的方法,aop負(fù)責(zé)將攔截器的方法和要注解生效的地方做一個(gè)織入,感興趣的可以嘗試一下2022-06-06Java?Stream對象并行處理方法parallel()代碼示例
在Java中Stream是一種用于處理集合數(shù)據(jù)的流式操作API,它提供了一種簡潔、靈活、高效的方式來對集合進(jìn)行各種操作,下面這篇文章主要給大家介紹了關(guān)于Java?Stream對象并行處理方法parallel()的相關(guān)資料,需要的朋友可以參考下2023-11-11SpringCloud Config使用本地倉庫及map注入
這篇文章主要介紹了SpringCloud Config使用本地倉庫及map注入,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09springboot配置項(xiàng)目啟動(dòng)后自動(dòng)打開瀏覽器訪問項(xiàng)目方式
這篇文章主要介紹了springboot配置項(xiàng)目啟動(dòng)后自動(dòng)打開瀏覽器訪問項(xiàng)目方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01java搭建一個(gè)Socket服務(wù)器響應(yīng)多用戶訪問
本篇文章主要介紹了java搭建一個(gè)Socket服務(wù)器響應(yīng)多用戶訪問,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-02-02