Java:JavaSocket编程开发多人聊天室
生活随笔
收集整理的這篇文章主要介紹了
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)容
運(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)題。
- 上一篇: java 递归调整为队列
- 下一篇: Java 泛形通配符 ?