日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Java:JavaSocket编程开发多人聊天室

發(fā)布時(shí)間:2023/12/10 java 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java:JavaSocket编程开发多人聊天室 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Java:JavaSocket編程開(kāi)發(fā)多人聊天室

    • 實(shí)現(xiàn)內(nèi)容
    • 運(yùn)行結(jié)果
    • 部分代碼
    • 完整代碼

實(shí)現(xiàn)內(nèi)容

  • 用Java圖形用戶界面編寫(xiě)聊天室服務(wù)器端和客戶端, 支持多個(gè)客戶端連接到一個(gè)服務(wù)器。每個(gè)客戶端能夠輸入賬號(hào)。
  • 可以實(shí)現(xiàn)群聊(聊天記錄顯示在所有客戶端界面)。
  • 完成好友列表在各個(gè)客戶端上顯示。
  • 可以實(shí)現(xiàn)私人聊天,用戶可以選擇某個(gè)其他用戶,單獨(dú)發(fā)送信息。
  • 服務(wù)器能夠群發(fā)系統(tǒng)消息,能夠強(qiáng)行讓某些用戶下線。
  • 客戶端的上線下線要求能夠在其他客戶端上面實(shí)時(shí)刷新。
  • 運(yùn)行結(jié)果




    部分代碼

    import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*; import java.util.*; import java.text.*; import javax.swing.*;public class ClientChat extends JFrame {private static final long serialVersionUID = 1L;private Socket socket ; //負(fù)責(zé)和服務(wù)器通信private JTextArea contentArea; //群聊消息顯示框private JTextArea sendArea; //消息編輯區(qū)域private JTextArea friendsList; //好友列表private String name; //用戶名private JComboBox cmb; //發(fā)送對(duì)象下拉框public ClientChat(Socket socket,String name) {this.socket = socket ;this.name = name ;this.init(); //初始化聊天客戶端this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);this.setVisible(true);//接下來(lái)啟動(dòng)單獨(dú)線程,從服務(wù)器中讀取數(shù)據(jù)ClientThread thread = new ClientThread(socket,contentArea,cmb) ;thread.start();}public void init( ) {this.setTitle("我的聊天室");this.setSize(500,500);int x = (int)Toolkit.getDefaultToolkit().getScreenSize().getWidth() ;int y = (int)Toolkit.getDefaultToolkit().getScreenSize().getHeight() ;this.setLocation( (x-this.getWidth() )/2, ( y-this.getHeight() )/2 );this.setResizable(false);contentArea = new JTextArea();contentArea.setLineWrap(true); //換行方法JScrollPane logPanel = new JScrollPane(contentArea, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);contentArea.append("----------------------------消息記錄--------------------------------------\n");sendArea = new JTextArea();sendArea.setLineWrap(true); //控制每行顯示長(zhǎng)度最大不超過(guò)界面長(zhǎng)度JScrollPane sendPanel = new JScrollPane(sendArea, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);friendsList = new JTextArea();friendsList.setLineWrap(true);JScrollPane friendPanel2 = new JScrollPane(friendsList, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);friendsList.append("------------好友列表-------------\n");JSplitPane splitpane1 = new JSplitPane(JSplitPane.VERTICAL_SPLIT,logPanel,sendPanel) ;splitpane1.setDividerLocation(290);JSplitPane splitpane2 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,splitpane1,friendPanel2) ;splitpane2.setDividerLocation(320);this.add(splitpane2,BorderLayout.CENTER);//按鈕面板JPanel bPanel = new JPanel() ;bPanel.setLayout(new FlowLayout(FlowLayout.RIGHT)) ;this.add(bPanel,BorderLayout.SOUTH) ;JLabel toNamelabel=new JLabel("發(fā)送對(duì)象:");cmb=new JComboBox(); cmb.addItem("所有人");bPanel.add(toNamelabel);bPanel.add(cmb);JLabel namelabel = new JLabel("用戶名: "+this.name+" ") ;bPanel.add(namelabel) ;JButton closeButton = new JButton("退 出") ;closeButton.addActionListener( new ActionListener() { //退出按鈕監(jiān)聽(tīng)public void actionPerformed(ActionEvent e) {String sendStr = name + "!!!!" ;PrintWriter out = null ;try {out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream() ) ) ;out.println(sendStr) ;out.flush();}catch(Exception ex) {ex.printStackTrace();}exit();}});bPanel.add(closeButton) ;JButton sendButton = new JButton("發(fā) 送") ;sendButton.addActionListener(new ActionListener() { //發(fā)送按鈕監(jiān)聽(tīng)public void actionPerformed(ActionEvent e) {String str = sendArea.getText(); //獲取發(fā)送的消息SimpleDateFormat formater = new SimpleDateFormat("HH:mm:ss") ; //獲取當(dāng)前時(shí)間String time = formater.format(new Date() ) ;String toName = (String) cmb.getSelectedItem(); //獲取發(fā)送對(duì)象//發(fā)送給服務(wù)器的消息格式為 時(shí)間 本客戶端用戶名 對(duì) 發(fā)送對(duì)象 說(shuō): 消息 <本客戶端用戶名>(發(fā)送對(duì)象)String sendStr = time + " " + name + " 對(duì) " + toName +" 說(shuō): "+ str + "<" + name +">" + "(" + toName + ")";PrintWriter out = null ;try {out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream() ) ) ; //發(fā)送給服務(wù)器out.println(sendStr) ;out.flush();}catch(Exception ex) {ex.printStackTrace();}sendArea.setText("");}});bPanel.add(sendButton) ; }public void exit() { //退出this.dispose();System.exit(0);}//客戶端與服務(wù)器端通信的線程類(lèi) class ClientThread extends Thread {private Socket socket ;private JTextArea contentArea ;private JComboBox cmb;public ClientThread(Socket socket, JTextArea conteArea , JComboBox cmb) {this.socket = socket ;this.contentArea = conteArea ;this.cmb = cmb;}public void run() {BufferedReader br = null ;try {br = new BufferedReader(new InputStreamReader(socket.getInputStream())) ;String str = null ;while( (str = br.readLine()) != null) {if(str.endsWith("上線了 ]")) { //新用戶上線,加入列表中if(!str.substring(3, str.length()-5).equals(name)) {friendsList.append(str.substring(3, str.length()-5));friendsList.append("\n");cmb.addItem(str.substring(3, str.length()-5));}contentArea.append(str);contentArea.append("\n");}else if(str.endsWith("下線了 ]")) { //用戶下線contentArea.append(str);contentArea.append("\n");cmb.removeItem(str.substring(3, str.length()-5));} else if(str.endsWith("被強(qiáng)制下線 ]")) { //服務(wù)器強(qiáng)制下線消息if(str.substring(3, str.length()-7).equals(name)) {exit();}else {contentArea.append(str);contentArea.append("\n");cmb.removeItem(str.substring(3, str.length()-7));}}else if(str.endsWith("###")) { //將在本客戶端連接之前就已連接的客戶端用戶名添加到列表中friendsList.append(str.substring(0, str.length()-3));friendsList.append("\n");cmb.addItem(str.substring(0, str.length()-3));}else if(str.substring(0,6).equals(" [ 通知:")) { //服務(wù)器發(fā)送的系統(tǒng)通知contentArea.append(str);contentArea.append("\n");}else if(splitData(str,"<",">").equals(name)){ //自己發(fā)送的消息contentArea.append(str.substring(0, str.lastIndexOf("<")));contentArea.append("\n");}else if(splitData(str,"(",")").equals(name)){ //別人私聊給自己的消息contentArea.append(str.substring(0, str.lastIndexOf("<")));contentArea.append("\n");}else if(splitData(str,"(",")").equals("所有人")) { //對(duì)所有人發(fā)送的消息contentArea.append(str.substring(0, str.lastIndexOf("<")));contentArea.append("\n");}}}catch(Exception ex) {ex.printStackTrace();}finally { if(br != null) {try {br.close () ;}catch(IOException e) {e.printStackTrace();}}}}public String splitData(String str, String strStart, String strEnd) { //獲取字符串中某兩個(gè)字符間的字符串String tempStr;tempStr = str.substring(str.indexOf(strStart) + 1, str.lastIndexOf(strEnd));return tempStr;}} }

    完整代碼

    用JavaSocket編程開(kāi)發(fā)多人聊天室(群聊、私聊等)

    總結(jié)

    以上是生活随笔為你收集整理的Java:JavaSocket编程开发多人聊天室的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。