色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術(shù)文章
文章詳情頁

Java多線程實現(xiàn)多人聊天室功能

瀏覽:2日期:2022-08-09 17:53:08

本文為大家分享了Java多線程實現(xiàn)多人聊天室功能的具體代碼,供大家參考,具體內(nèi)容如下

1.實驗?zāi)康模?p>編寫一個 Java 應(yīng)用程序,實現(xiàn)圖形界面多人聊天室(多線程實現(xiàn)),要求聊天室窗口標(biāo)題是 “歡迎使用 XXX 聊天室應(yīng)用”,其中 XXX 是自己的班級姓名學(xué)號,如“軟件 171 張三 1234”。

2.實驗代碼:

服務(wù)端程序代碼:

ServerChar.java

package works;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;import java.util.Collection;import java.util.Collections;import java.util.HashMap;import java.util.Map;import java.util.Set;public class ServerChat { //定義Map集合用于存儲用戶的Socket以及用戶的名字 key:Socket Value:用戶名 public final static Map<Socket,String> socketsMaps = Collections.synchronizedMap(new HashMap<Socket,String>()); public static void main(String[] args) { // TODO Auto-generated method stub try { // 創(chuàng)建服務(wù)端套接字 ServerSocket serverSocket = new ServerSocket(9999); System.out.println('------服務(wù)端暴露-------'); while (true) { // 監(jiān)聽客戶端套接字,若有客戶端連接,則代碼不會往下執(zhí)行,否則會堵塞在此處。 Socket socket = serverSocket.accept(); // 開啟線程,用于讀取客戶端發(fā)送的信息,并轉(zhuǎn)發(fā)給每一個客戶端 new ThreadServer(socket).start(); } } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } }}class ThreadServer extends Thread { private Socket socket; ThreadServer(){}; ThreadServer(Socket socket) { this.socket = socket; } @Override public void run() { try { while(true) { DataInputStream dataInputStream = new DataInputStream(socket.getInputStream()); String data = dataInputStream.readUTF();if(data.startsWith('①②③④')&&data.endsWith('①②③④')) { //發(fā)送過來的是用戶名 //將Socket以及用戶名字都存放在Map集合中 ServerChat.socketsMaps.put(socket, data.replace('①②③④','')); //獲取所有的key(Socket),將所有用戶的名字發(fā)送至客戶端 Set<Socket> sockets = ServerChat.socketsMaps.keySet(); //獲取所有的用戶的名字,將這些名字拼裝成一個字符串 Collection<String> names = ServerChat.socketsMaps.values(); StringBuffer sbf = new StringBuffer(); for(String userName :names) { sbf.append(userName).append(','); } System.out.println('sbf:'+sbf.toString()); for(Socket soc:sockets) { DataOutputStream dataOutputStream = new DataOutputStream(soc.getOutputStream()); dataOutputStream.writeUTF('①②③④'+sbf.toString()+'①②③④'); dataOutputStream.flush(); } } else{ //發(fā)送過來的是聊天信息 //獲取所有的key(Socket),將所有用戶的名字發(fā)送至客戶端 Set<Socket> sockets = ServerChat.socketsMaps.keySet(); //?⒘奶煨畔⒐悴コ鋈 for(Socket soc:sockets) { DataOutputStream dataOutputStream = new DataOutputStream(soc.getOutputStream()); dataOutputStream.writeUTF('[ '+ServerChat.socketsMaps.get(socket)+' ]說:'+data); dataOutputStream.flush(); } } } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}

客戶端程序代碼:

ClientChar.java

package works;import java.awt.BorderLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import java.net.Socket;import javax.swing.Box;import javax.swing.BoxLayout;import javax.swing.DefaultListModel;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JList;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextArea;public class ClientChat { private JFrame mainWin = new JFrame('聊天窗口'); // 消息展示框 private JTextArea displayTa = new JTextArea(14, 40); // 在線用戶名稱展示框 private DefaultListModel<String> userListModel = new DefaultListModel<>(); private JList<String> userList = new JList<>(userListModel); // 消息發(fā)送框 private JTextArea inputTF = new JTextArea(4, 40); // 消息按鈕 private JButton sendBn = new JButton('發(fā)送'); // 用戶記錄當(dāng)前聊天用戶名 private String curUser; public static void main(String[] args) { new ClientChat().init(); } private void init() { try { // 通過彈出對話框獲取用戶輸入的用戶名 String userName = JOptionPane.showInputDialog(mainWin, '請輸入您的用戶名:'); // 把用戶輸入的用戶名,賦給curUser curUser = userName; mainWin.setTitle(curUser + '的聊天窗口'); // 創(chuàng)建套接字 Socket socket = new Socket('192.168.193.1', 9999); // 向服務(wù)器聲明 DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream()); //發(fā)送用戶名到服務(wù)端 dataOutputStream.writeUTF('①②③④'+userName+'①②③④'); dataOutputStream.flush(); // 開啟線程,用于讀取服務(wù)器發(fā)送的信息 new ThreadClient(socket, this).start(); JPanel bottomPanel = new JPanel(); // 將消息框和按鈕添加到窗口的底端 mainWin.add(bottomPanel, BorderLayout.SOUTH); bottomPanel.add(inputTF); bottomPanel.add(sendBn); ActionListener listener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // 獲取用戶發(fā)送的消息 String message = inputTF.getText(); sendSms(message,socket); } }; // 給發(fā)送消息按鈕綁定點擊事件監(jiān)聽器 sendBn.addActionListener(listener); JPanel centerPanel = new JPanel(); // 將展示消息區(qū)centerPanel添加到窗口的中間 mainWin.add(centerPanel); // 讓展示消息區(qū)可以滾動 centerPanel.add(new JScrollPane(displayTa)); displayTa.setEditable(false); // 用戶列表和是否私聊放到窗口的最右邊 Box rightBox = new Box(BoxLayout.Y_AXIS); userList.setFixedCellWidth(60); userList.setVisibleRowCount(13); rightBox.add(new JLabel('用戶列表:')); rightBox.add(new JScrollPane(userList)); centerPanel.add(rightBox); // 關(guān)閉窗口退出當(dāng)前程序 mainWin.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); mainWin.pack(); // swing加上這句就可以擁有關(guān)閉窗口的功能 mainWin.setVisible(true); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } //點擊發(fā)送后將消息發(fā)送到服務(wù)器 protected void sendSms(String sms, Socket socket) { try { //發(fā)送聊天消息到服務(wù)端 DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream()); dataOutputStream.writeUTF(sms); dataOutputStream.flush(); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } public DefaultListModel<String> getUserListModel() { return userListModel; } public JTextArea getDisplayTa() { return displayTa; } public JTextArea getInputTF() { return inputTF; }}// 定義線程類,用來讀取服務(wù)器發(fā)送的信息class ThreadClient extends Thread { private Socket socket; private ClientChat clientChat; ThreadClient() { } ThreadClient(Socket socket, ClientChat clientChat) { this.socket = socket; this.clientChat = clientChat; } @Override public void run() { try { while (true) { DataInputStream DataInputStream = new DataInputStream(socket.getInputStream()); String message = DataInputStream.readUTF(); if(message.startsWith('①②③④')&&message.endsWith('①②③④')) { //說明信息是用戶名 String[] names = message.replace('①②③④','').split(','); // 將用戶列表先清空 clientChat.getUserListModel().clear(); for (int i = 0; i < names.length; ++i) { clientChat.getUserListModel().addElement(names[i]); } } else { //說明是聊天信息,將聊天信息放在displayTa中 clientChat.getInputTF().setText(''); clientChat.getDisplayTa().append(message+'tn'); } } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}3.實驗截圖

先開啟服務(wù)端

Java多線程實現(xiàn)多人聊天室功能

再開啟客戶端

Java多線程實現(xiàn)多人聊天室功能

聊天過程

Java多線程實現(xiàn)多人聊天室功能

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 免费视频成人国产精品网站 | 国产毛片一区 | 日韩午夜免费视频 | 伊人色综合久久天天网蜜月 | 国产成人精视频在线观看免费 | 91在线永久 | 一级毛片在线视频 | 国产精品美女久久久久网站 | 黄色wwwxxx| 曰批美女免费视频播放 | 亚洲视频一区在线 | 中国一级特黄视频 | 精品国产高清在线看国产 | 欧美日韩高清不卡一区二区三区 | 一级毛片不卡片免费观看 | 国产蜜汁tv福利在线 | 在线观看一区 | 怡红院自拍 | 最新三级网站 | 成人中文字幕在线观看 | 国产天堂亚洲精品 | 久热草在线| 91精品国产一区二区三区四区 | 九草在线 | 在线色网址 | 亚洲伦理天堂 | 国产无套视频在线观看香蕉 | 久久香蕉国产线看观看式 | 国产真真人女人特级毛片 | 亚洲精品98久久久久久中文字幕 | 亚洲免费久久 | 亚洲美色综合天天久久综合精品 | 久久是精品 | 在线另类 | 国产色在线播放 | 女人扒开腿让男人捅啪啪 | 青草青99久久99九九99九九九 | 成年男女男精品免费视频网站 | 亚洲欧美日韩专区 | 亚洲欧洲无码一区二区三区 | 一本色道久久综合狠狠躁 |