电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Java多線程實現多人聊天室功能

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

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

1.實驗目的:

編寫一個 Java 應用程序,實現圖形界面多人聊天室(多線程實現),要求聊天室窗口標題是 “歡迎使用 XXX 聊天室應用”,其中 XXX 是自己的班級姓名學號,如“軟件 171 張三 1234”。

2.實驗代碼:

服務端程序代碼:

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 { // 創建服務端套接字 ServerSocket serverSocket = new ServerSocket(9999); System.out.println('------服務端暴露-------'); while (true) { // 監聽客戶端套接字,若有客戶端連接,則代碼不會往下執行,否則會堵塞在此處。 Socket socket = serverSocket.accept(); // 開啟線程,用于讀取客戶端發送的信息,并轉發給每一個客戶端 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('①②③④')) { //發送過來的是用戶名 //將Socket以及用戶名字都存放在Map集合中 ServerChat.socketsMaps.put(socket, data.replace('①②③④','')); //獲取所有的key(Socket),將所有用戶的名字發送至客戶端 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{ //發送過來的是聊天信息 //獲取所有的key(Socket),將所有用戶的名字發送至客戶端 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); // 消息發送框 private JTextArea inputTF = new JTextArea(4, 40); // 消息按鈕 private JButton sendBn = new JButton('發送'); // 用戶記錄當前聊天用戶名 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 + '的聊天窗口'); // 創建套接字 Socket socket = new Socket('192.168.193.1', 9999); // 向服務器聲明 DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream()); //發送用戶名到服務端 dataOutputStream.writeUTF('①②③④'+userName+'①②③④'); dataOutputStream.flush(); // 開啟線程,用于讀取服務器發送的信息 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) { // 獲取用戶發送的消息 String message = inputTF.getText(); sendSms(message,socket); } }; // 給發送消息按鈕綁定點擊事件監聽器 sendBn.addActionListener(listener); JPanel centerPanel = new JPanel(); // 將展示消息區centerPanel添加到窗口的中間 mainWin.add(centerPanel); // 讓展示消息區可以滾動 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); // 關閉窗口退出當前程序 mainWin.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); mainWin.pack(); // swing加上這句就可以擁有關閉窗口的功能 mainWin.setVisible(true); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } //點擊發送后將消息發送到服務器 protected void sendSms(String sms, Socket socket) { try { //發送聊天消息到服務端 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; }}// 定義線程類,用來讀取服務器發送的信息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.實驗截圖

先開啟服務端

Java多線程實現多人聊天室功能

再開啟客戶端

Java多線程實現多人聊天室功能

聊天過程

Java多線程實現多人聊天室功能

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
主站蜘蛛池模板: LCD3D打印机|教育|桌面|光固化|FDM3D打印机|3D打印设备-广州造维科技有限公司 | 设定时间记录电子秤-自动累计储存电子秤-昆山巨天仪器设备有限公司 | 假肢-假肢价格-假肢厂家-河南假肢-郑州市力康假肢矫形器有限公司 | 金属检测机_金属分离器_检针验针机_食品药品金属检探测仪器-广东善安科技 | 博医通医疗器械互联网供应链服务平台_博医通| 钛板_钛管_钛棒_钛盘管-无锡市盛钛科技有限公司 | 臭氧实验装置_实验室臭氧发生器-北京同林臭氧装置网 | 反渗透阻垢剂-缓蚀阻垢剂厂家-循环水处理药剂-山东鲁东环保科技有限公司 | 一体化污水处理设备,一体化污水设备厂家-宜兴市福源水处理设备有限公司 | 黑田精工电磁阀-CAMMOZI气缸-ROSS电磁-上海茂硕机械设备有限公司 | 无线遥控更衣吊篮_IC卡更衣吊篮_电动更衣吊篮配件_煤矿更衣吊篮-力得电子 | 钢格板_钢格栅_格栅板_钢格栅板 - 安平县鑫拓钢格栅板厂家 | 塑料瓶罐_食品塑料瓶_保健品塑料瓶_调味品塑料瓶–东莞市富慷塑料制品有限公司 | 电磁流量计厂家_涡街流量计厂家_热式气体流量计-青天伟业仪器仪表有限公司 | 全温恒温摇床-水浴气浴恒温摇床-光照恒温培养摇床-常州金坛精达仪器制造有限公司 | 数码听觉统合训练系统-儿童感觉-早期言语评估与训练系统-北京鑫泰盛世科技发展有限公司 | 搅拌磨|搅拌球磨机|循环磨|循环球磨机-无锡市少宏粉体科技有限公司 | 混合反应量热仪-高温高压量热仪-微机差热分析仪DTA|凯璞百科 | 沙盘模型公司_沙盘模型制作公司_建筑模型公司_工业机械模型制作厂家 | 车充外壳,车载充电器外壳,车载点烟器外壳,点烟器连接头,旅行充充电器外壳,手机充电器外壳,深圳市华科达塑胶五金有限公司 | 垃圾压缩设备_垃圾处理设备_智能移动式垃圾压缩设备--山东明莱环保设备有限公司 | 皮带机-带式输送机价格-固定式胶带机生产厂家-河南坤威机械 | 彼得逊采泥器-定深式采泥器-电动土壤采样器-土壤样品风干机-常州索奥仪器制造有限公司 | IPO咨询公司-IPO上市服务-细分市场研究-龙马咨询 | 澳门精准正版免费大全,2025新澳门全年免费,新澳天天开奖免费资料大全最新,新澳2025今晚开奖资料,新澳马今天最快最新图库-首页-东莞市傲马网络科技有限公司 | 除湿机|工业除湿机|抽湿器|大型地下室车间仓库吊顶防爆除湿机|抽湿烘干房|新风除湿机|调温/降温除湿机|恒温恒湿机|加湿机-杭州川田电器有限公司 | 哈尔滨治「失眠/抑郁/焦虑症/精神心理」专科医院排行榜-京科脑康免费咨询 一对一诊疗 | 工业硝酸钠,硝酸钠厂家-淄博「文海工贸」 | 环氧铁红防锈漆_环氧漆_无溶剂环氧涂料_环氧防腐漆-华川涂料 | 清水-铝合金-建筑模板厂家-木模板价格-铝模板生产「五棵松」品牌 | 团建-拓展-拓展培训-拓展训练-户外拓展训练基地[无锡劲途] | 泰国试管婴儿_泰国第三代试管婴儿_泰国试管婴儿费用/多少钱_孕泰来 | 网站建设,北京网站建设,北京网站建设公司,网站系统开发,北京网站制作公司,响应式网站,做网站公司,海淀做网站,朝阳做网站,昌平做网站,建站公司 | 踏板力计,制动仪,非接触多功能速度仪,逆反射系数测试仪-创宇 | 环讯传媒,永康网络公司,永康网站建设,永康小程序开发制作,永康网站制作,武义网页设计,金华地区网站SEO优化推广 - 永康市环讯电子商务有限公司 | 全自动变压器变比组别测试仪-手持式直流电阻测试仪-上海来扬电气 | 【直乐】河北石家庄脊柱侧弯医院_治疗椎间盘突出哪家医院好_骨科脊柱外科专业医院_治疗抽动症/关节病骨伤权威医院|排行-直乐矫形中医医院 | 预制围墙_工程预制围墙_天津市瑞通建筑材料有限公司 | 污水提升器,污水提升泵,污水提升装置-德国泽德(zehnder)水泵系统有限公司 | 共享雨伞_共享童车_共享轮椅_共享陪护床-共享产品的领先者_有伞科技 | 广州二手电缆线回收,旧电缆回收,广州铜线回收-广东益福电缆线回收公司 |