小編給大家分享一下java socket怎么實現聊天室,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
創(chuàng)新互聯(lián)是一家集網站建設,西城企業(yè)網站建設,西城品牌網站建設,網站定制,西城網站建設報價,網絡營銷,網絡優(yōu)化,西城網站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網站。
用java socket做一個聊天室,實現多人聊天的功能。
服務端:
1. 先寫服務端的類MyServerSocket,里面放一個監(jiān)聽線程,一啟動就好
2. 實現服務端監(jiān)聽類ServerListener.java,用accept來監(jiān)聽,一旦有客戶端連上,生成新的socket,就新建個線程實例ChatSocket。啟動線程后就把線程交給ChatManager管理
3. 在ChatSocket中實現從客戶端讀取內容,把讀取到的內容發(fā)給集合內所有的客戶端
4. ChatManager里面用vector來管理socket線程實例ChatSocket,并實現發(fā)送信息給其他的客戶端
客戶端:
1. 新建一個繼承JFrame的MainWindow.java類,主要實現聊天窗口的UI,以及事件響應。
2. 新建StartClient.java類,把MainWindow中生成MainWindow主方法部分代碼拷貝過來,這樣就能在主程序中把窗體執(zhí)行出來了。
3. 新建ChatManager(需要單例化的類)管理socket,實現聊天的輸入輸出功能。最后記得在1中新建窗口后,傳一份frame的引用到ChatManager中,才能實現ChatManager對界面的顯示。
工程結構如圖
以下為代碼
服務端:
1. 先寫服務端的類MyServerSocket,里面放一個監(jiān)聽線程,一啟動就好
package com.starnet.testserversocket.main; public class MyServerSocket { public static void main(String[] args) { new ServerListener().start(); } }
2.實現服務端監(jiān)聽類ServerListener.java,用accept來監(jiān)聽,一旦有客戶端連上,生成新的socket,就新建個線程實例ChatSocket。啟動線程后就把線程交給ChatManager管理
package com.starnet.testserversocket.main; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import javax.swing.JOptionPane; public class ServerListener extends Thread { public void run() { try { ServerSocket serverSocket = new ServerSocket(23456); while (true) { // block Socket socket = serverSocket.accept(); // 建立鏈接 JOptionPane.showMessageDialog(null, "有客戶端連到本機23456端口"); //將socket傳遞給新的線程 ChatSocket cs= new ChatSocket(socket); cs.start(); ChatManager.getChatManager().add(cs); } } catch (IOException e) { e.printStackTrace(); } } }
3.在ChatSocket中實現從客戶端讀取內容,把讀取到的內容發(fā)給集合內所有的客戶端
package com.starnet.testserversocket.main; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.net.Socket; /*每一個連上的客戶端,服務器都有一個線程為之服務*/ public class ChatSocket extends Thread { Socket socket; public ChatSocket(Socket s) { this.socket = s; } //發(fā)送數據 public void out(String out) { try { socket.getOutputStream().write(out.getBytes("UTF-8")); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //服務器會不斷地從客戶端讀取內容,把讀取到的內容發(fā)給集合內所有的客戶端。 public void run() { try { //接收數據 BufferedReader br = new BufferedReader( new InputStreamReader( socket.getInputStream(), "UTF-8")); String line=null; //發(fā)送讀到的內容 while ((line = br.readLine())!=null) { System.out.println(line); ChatManager.getChatManager().publish(this, line); } br.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
4.ChatManager里面用vector來管理socket線程實例ChatSocket,并實現發(fā)送信息給其他的客戶端
package com.starnet.testserversocket.main; import java.util.Vector; //一個聊天服務器只能有一個manager,要單例化處理 public class ChatManager { private ChatManager(){} private static final ChatManager CM=new ChatManager(); public static ChatManager getChatManager(){ return CM; } Vector<ChatSocket> vector = new Vector<ChatSocket>(); /*增加ChatSocket 實例到vector中*/ public void add(ChatSocket cs){ vector.add(cs); } /*發(fā)布消息給其他客戶端 *ChatSocket cs: 調用publish的線程 *msg:要發(fā)送的信息 */ public void publish(ChatSocket cs, String msg){ for (int i = 0; i < vector.size(); i++) { ChatSocket csTemp = vector.get(i); if (!cs.equals(csTemp)) { csTemp.out(msg+"\n");//不用發(fā)送給自己。 } } } }
客戶端:
1. 新建一個繼承JFrame的MainWindow.java類,主要實現聊天窗口的UI,以及事件響應。
package com.starnet.javaclient.view; import java.awt.BorderLayout; import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; import javax.swing.JTextArea; import javax.swing.GroupLayout; import javax.swing.GroupLayout.Alignment; import javax.swing.JTextField; import javax.swing.JButton; import javax.swing.LayoutStyle.ComponentPlacement; import com.starnet.javaclient.main.ChatManager; import com.sun.xml.internal.ws.client.SenderException; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; public class MainWindow extends JFrame { /** * */ private static final long serialVersionUID = 1L; private JPanel contentPane; private JTextArea txt; private JTextField txtip; private JTextField txtSend; /** * Create the frame. */ public MainWindow() { setAlwaysOnTop(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 450, 300); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); txt = new JTextArea(); txt.setText("ready..."); txtip = new JTextField(); txtip.setText("127.0.0.1"); txtip.setColumns(10); JButton btnConnect = new JButton("connect"); btnConnect.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { ChatManager.getChatManager().connect(txtip.getText()); } }); txtSend = new JTextField(); txtSend.setText("hello"); txtSend.setColumns(10); JButton btnSend = new JButton("send"); btnSend.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { ChatManager.getChatManager().send(txtSend.getText()); appendText("我說: "+txtSend.getText()); txtSend.setText(""); } }); GroupLayout gl_contentPane = new GroupLayout(contentPane); gl_contentPane.setHorizontalGroup( gl_contentPane.createParallelGroup(Alignment.LEADING) .addGroup(Alignment.TRAILING, gl_contentPane.createSequentialGroup() .addGroup(gl_contentPane.createParallelGroup(Alignment.TRAILING) .addGroup(gl_contentPane.createSequentialGroup() .addComponent(txtSend, GroupLayout.DEFAULT_SIZE, 325, Short.MAX_VALUE) .addPreferredGap(ComponentPlacement.RELATED) .addComponent(btnSend, GroupLayout.PREFERRED_SIZE, 109, GroupLayout.PREFERRED_SIZE)) .addGroup(Alignment.LEADING, gl_contentPane.createSequentialGroup() .addComponent(txtip, GroupLayout.PREFERRED_SIZE, 294, GroupLayout.PREFERRED_SIZE) .addPreferredGap(ComponentPlacement.RELATED) .addComponent(btnConnect, GroupLayout.DEFAULT_SIZE, 140, Short.MAX_VALUE)) .addComponent(txt, GroupLayout.DEFAULT_SIZE, 434, Short.MAX_VALUE)) .addContainerGap()) ); gl_contentPane.setVerticalGroup( gl_contentPane.createParallelGroup(Alignment.LEADING) .addGroup(gl_contentPane.createSequentialGroup() .addGroup(gl_contentPane.createParallelGroup(Alignment.BASELINE) .addComponent(txtip, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(btnConnect)) .addPreferredGap(ComponentPlacement.RELATED) .addComponent(txt, GroupLayout.DEFAULT_SIZE, 198, Short.MAX_VALUE) .addPreferredGap(ComponentPlacement.RELATED) .addGroup(gl_contentPane.createParallelGroup(Alignment.TRAILING) .addComponent(btnSend) .addComponent(txtSend, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))) ); contentPane.setLayout(gl_contentPane); } /*客戶端發(fā)送的內容添加到中間的txt控件中*/ public void appendText(String in) { txt.append("\n" + in); } }
2.新建StartClient.java類,把MainWindow中生成MainWindow主方法部分代碼拷貝過來,這樣就能在主程序中把窗體執(zhí)行出來了。
package com.starnet.javaclient.main; import java.awt.EventQueue; import com.starnet.javaclient.view.MainWindow; public class StartClient { public static void main(String[] args) { /*先新建一個jframe,然后把自動生成的代碼貼過來*/ EventQueue.invokeLater(new Runnable() { public void run() { try { MainWindow frame = new MainWindow(); frame.setVisible(true); //創(chuàng)建完這個frame以后,傳一份window的引用到ChatManager去 ChatManager.getChatManager().setWindow(frame); } catch (Exception e) { e.printStackTrace(); } } }); } }
3.新建ChatManager(需要單例化的類)管理socket,實現聊天的輸入輸出功能。最后記得在1中新建窗口后,傳一份frame的引用到ChatManager中,才能實現ChatManager對界面的顯示。
package com.starnet.javaclient.main; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException; import com.starnet.javaclient.view.MainWindow; public class ChatManager { private ChatManager(){} private static final ChatManager instance=new ChatManager(); public static ChatManager getChatManager(){ return instance; } MainWindow window;//為了能在界面上顯示服務器發(fā)來的信息,就需要傳一個MainWindow的引用進來 Socket socket; private String IP; BufferedReader bReader; PrintWriter pWriter; public void setWindow(MainWindow window) { this.window = window; window.appendText("文本框已經和chatManager綁定了"); } public void connect(String ip) { this.IP = ip; new Thread(){ @Override public void run() { //實現網絡方法 try { socket = new Socket(IP, 23456); //輸出流 pWriter = new PrintWriter( new OutputStreamWriter( socket.getOutputStream())); //輸入流 bReader = new BufferedReader( new InputStreamReader( socket.getInputStream())); String line = null; //如果讀取數據為空 while ((line = bReader.readLine())!=null) { window.appendText("收到: "+line); } //讀完數據之后要關閉 pWriter.close(); bReader.close(); pWriter = null; bReader = null; } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }.start(); } public void send(String sendMsg){ if (pWriter!=null) { pWriter.write(sendMsg+"\n"); pWriter.flush(); } else { window.appendText("當前鏈接已經中斷..."); } } }
看完了這篇文章,相信你對“java socket怎么實現聊天室”有了一定的了解,如果想了解更多相關知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
文章標題:javasocket怎么實現聊天室
分享地址:http://www.muchs.cn/article40/jpjieo.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供建站公司、云服務器、App設計、ChatGPT、微信小程序、網站設計
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)