Java:JavaSocket编程开发多人聊天室
生活随笔
收集整理的這篇文章主要介紹了
Java:JavaSocket编程开发多人聊天室
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Java:JavaSocket編程開發多人聊天室
- 實現內容
- 運行結果
- 部分代碼
- 完整代碼
實現內容
運行結果
部分代碼
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 ; //負責和服務器通信private JTextArea contentArea; //群聊消息顯示框private JTextArea sendArea; //消息編輯區域private JTextArea friendsList; //好友列表private String name; //用戶名private JComboBox cmb; //發送對象下拉框public ClientChat(Socket socket,String name) {this.socket = socket ;this.name = name ;this.init(); //初始化聊天客戶端this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);this.setVisible(true);//接下來啟動單獨線程,從服務器中讀取數據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); //控制每行顯示長度最大不超過界面長度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("發送對象:");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() { //退出按鈕監聽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("發 送") ;sendButton.addActionListener(new ActionListener() { //發送按鈕監聽public void actionPerformed(ActionEvent e) {String str = sendArea.getText(); //獲取發送的消息SimpleDateFormat formater = new SimpleDateFormat("HH:mm:ss") ; //獲取當前時間String time = formater.format(new Date() ) ;String toName = (String) cmb.getSelectedItem(); //獲取發送對象//發送給服務器的消息格式為 時間 本客戶端用戶名 對 發送對象 說: 消息 <本客戶端用戶名>(發送對象)String sendStr = time + " " + name + " 對 " + toName +" 說: "+ str + "<" + name +">" + "(" + toName + ")";PrintWriter out = null ;try {out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream() ) ) ; //發送給服務器out.println(sendStr) ;out.flush();}catch(Exception ex) {ex.printStackTrace();}sendArea.setText("");}});bPanel.add(sendButton) ; }public void exit() { //退出this.dispose();System.exit(0);}//客戶端與服務器端通信的線程類 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("被強制下線 ]")) { //服務器強制下線消息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(" [ 通知:")) { //服務器發送的系統通知contentArea.append(str);contentArea.append("\n");}else if(splitData(str,"<",">").equals(name)){ //自己發送的消息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("所有人")) { //對所有人發送的消息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) { //獲取字符串中某兩個字符間的字符串String tempStr;tempStr = str.substring(str.indexOf(strStart) + 1, str.lastIndexOf(strEnd));return tempStr;}} }完整代碼
用JavaSocket編程開發多人聊天室(群聊、私聊等)
總結
以上是生活随笔為你收集整理的Java:JavaSocket编程开发多人聊天室的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 递归调整为队列
- 下一篇: 知识框架梳理