超详细带你用Java实现QQ的聊天功能
個人名片:
🐼作者簡介:一名在校生
🐻???個人主頁:hmm.
🕊?系列專欄:零基礎學java ----- 重識c語言
🐓每日一句:只要還有明天,今天就永遠是起跑點。
?前言:🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊
最近有許多小伙伴問小新有沒有好用的刷題網站,想提升一下自我能力**</font>
>**經過小新縝密的思考與親身體驗,推薦超實用的**🎉(點擊訪問牛客網)🎉
>*里面用豐富的大廠面試真題、各類算法由易到難層層遞進、專項題庫應有盡有,還不快來體驗體驗**🎏🎏🎏
?
文章目錄
- 第一步:完成界面搭建🐓
- 第二步:TPC通信的思路與步驟🐻???
-
- TCP協議🐶
- TCP 服務端 具體步驟(客戶端類似)🐮
- TCP通信步驟代碼實現:🐸
- 點擊發送按鈕實現數據的傳輸🐺
- 第三步:實現回車鍵發送數據(客戶端類似)🐳
- 全部代碼:🐲
-
第一步:完成界面搭建🐓
要求:
- 創建兩個窗口:一個客戶端,一個服務端,完成代碼書寫
步驟:
1.定義JFrame窗體中的組件:文本域,滾動條,面板,文本框,按鈕
//屬性//文本域private JTextArea jta;//滾動條private JScrollPane jsp;//面板private JPanel jp;//文本框private JTextField jtf;//按鈕private JButton jb; 2.在構造方法中初始化窗口的組件: //構造方法public ServerChatMain(){//初始化組件jta = new JTextArea();//設置文本域默認不可編輯jta.setEditable(false);//注意:需要將文本域添加到滾動條中,實現滾動效果jsp =new JScrollPane(jta);//初始化面板jp = new JPanel();jtf = new JTextField(10);jb=new JButton("發送");//注意:需要將文本框與按鈕添加到面板中jp.add(jtf);jp.add(jb);4.設置設置”標題“,大小,位置,關閉,是否可見
//注意:需要設置”標題“,大小,位置,關閉,是否可見this.setTitle("QQ聊天服務端");this.setSize(400,300);this.setLocation(700,300);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//窗體關閉,程序就退出this.setVisible(true);//設置窗體可見}這樣我們就完成了服務端的QQ聊天界面窗口搭建:
注意:JTextArea文本域是不可以書寫的
客戶端與服務端代碼類似,這里就不一一展示了
書寫完畢代碼,運行效果如下圖:
第二步:TPC通信的思路與步驟🐻???
使用網絡編程完成數據點的傳輸(TCP,UDP協議)
TCP協議🐶
TCP 是面向連接的運輸層協議。應用程序在使用 TCP 協議之前,必須先建立 TCP 連接。在傳送數據完畢后,必須釋放已經建立的 TCP 連接
每一條 TCP 連接只能有兩個端點,每一條 TCP 連接只能是點對點的(一對一)
TCP 提供可靠交付的服務。通過 TCP 連接傳送的數據,無差錯、不丟失、不重復,并且按序到達
TCP 提供全雙工通信。TCP 允許通信雙方的應用進程在任何時候都能發送數據。TCP 連接的兩端都設有發送緩存和接受緩存,用來臨時存放雙向通信的數據
面向字節流。TCP 中的“流”指的是流入到進程或從進程流出的字節序列
TCP 服務端 具體步驟(客戶端類似)🐮
具體步驟:
- 1.創建一個服務端的套接字
- 2.等待客戶端連接
- 3.獲取socket通道的輸入流(輸入六是實現讀取數據的,一行一行讀取)BufferedReader->readLine();
- 4.獲取socket 通道的輸出流(輸出流實現寫出數據,也是寫一行換一行,刷新)BufferedWriter->newLine();
- 5.關閉socket 通道
TCP通信步驟代碼實現:🐸
try {//1.創建一個服務端的套接字ServerSocket serverSocket = new ServerSocket(8888);//2.等待客戶端連接Socket socket = serverSocket.accept();//3.獲取socket通道的輸入流(輸入六是實現讀取數據的,一行一行讀取)BufferedReader->readLine();//InputStream in = socket.getInputStream();BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));//4.獲取socket 通道的輸出流(輸出流實現寫出數據,也是寫一行換一行,刷新)BufferedWriter->newLine();//當用戶點擊發送按鈕的時候寫出數據BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));//循環讀取數據并拼接到文本域String line = null;while((line = br.readLine())!=null){//將讀取的數據拼接到文本域中顯示jta.append(line+System.lineSeparator());}//5.關閉socket 通道serverSocket.close();}catch (IOException e) {e.printStackTrace();}點擊發送按鈕實現數據的傳輸🐺
@Overridepublic void actionPerformed(ActionEvent actionEvent) {System.out.println("發送按鈕被點擊了");}步驟:
1.獲取文本框中發送的內容
2.拼接需要發送的數據內容
3.自己也要顯示
4.發送
5.清空文本框內容
第三步:實現回車鍵發送數據(客戶端類似)🐳
首先要實現一個接口
public class ClientChatMain extends JFrame implements ActionListener, KeyListener { @Overridepublic void keyPressed(KeyEvent e) {//回車鍵// System.out.println(e);//發送數據到socket 同道中if(e.getKeyCode()==KeyEvent.VK_ENTER) {sendDataToSocket();}全部代碼:🐲
服務端:
package com.ithmm.chat;import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.util.Properties;//說明:如果一個類,需要有界面的顯示,那么這個類就需要繼承JFrame,此時,該類可以被成為一個窗體類 /*步驟:1.定義JFrame窗體中的組件2.在構造方法中初始化窗口的組件3.使用網絡編程完成數據的鏈接(TPC,UDP 協議)4.實現"發送”按鈕的監聽點擊事件5.實現“回車鍵”發送數據*/ public class ServerChatMain extends JFrame implements ActionListener, KeyListener {public static void main(String[] args) {//調用構造方法new ServerChatMain();}//屬性//文本域private JTextArea jta;//滾動條private JScrollPane jsp;//面板private JPanel jp;//文本框private JTextField jtf;//按鈕private JButton jb;//輸出流(成員變量)private BufferedWriter bw = null;//服務端的端口號//private static int serverPort;//使用static靜態方法讀取外部京臺文件//static代碼塊特點:1.在類加載的時候自動執行//特點2:一個類會被加載一次,因此靜態代碼塊在程序中僅會被執行一次/*static{Properties prop = new Properties();try {//加載prop.load(new FileReader("chat.properties"));//給屬性賦值Integer.parseInt(prop.getProperty("serverPort"));} catch (IOException e) {e.printStackTrace();}}*///構造方法public ServerChatMain(){//初始化組件jta = new JTextArea();//設置文本域默認不可編輯jta.setEditable(false);//注意:需要將文本域添加到滾動條中,實現滾動效果jsp =new JScrollPane(jta);//初始化面板jp = new JPanel();jtf = new JTextField(10);jb=new JButton("發送");//注意:需要將文本框與按鈕添加到面板中jp.add(jtf);jp.add(jb);//注意:需要將滾動條與面板全部添加到窗體中,繼承了窗體的屬性,這里this就是窗體this.add(jsp, BorderLayout.CENTER);//BorderLayout--邊框布局this.add(jp,BorderLayout.SOUTH);//注意:需要設置”標題“,大小,位置,關閉,是否可見this.setTitle("QQ聊天服務端");this.setSize(400,300);this.setLocation(700,300);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//窗體關閉,程序就退出this.setVisible(true);//設置窗體可見/**************** TCP 服務端 Start *********************///給發送按鈕綁定一個監聽點擊事件jb.addActionListener(this);//給文本框綁定一個鍵盤點擊事件jtf.addKeyListener(this);try {//1.創建一個服務端的套接字ServerSocket serverSocket = new ServerSocket(8888);//2.等待客戶端連接Socket socket = serverSocket.accept();//3.獲取socket通道的輸入流(輸入六是實現讀取數據的,一行一行讀取)BufferedReader->readLine();//InputStream in = socket.getInputStream();BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));//4.獲取socket 通道的輸出流(輸出流實現寫出數據,也是寫一行換一行,刷新)BufferedWriter->newLine();//當用戶點擊發送按鈕的時候寫出數據bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));//循環讀取數據并拼接到文本域String line = null;while((line = br.readLine())!=null){//將讀取的數據拼接到文本域中顯示jta.append(line+System.lineSeparator());}//5.關閉socket 通道serverSocket.close();}catch (IOException e) {e.printStackTrace();}/**************** TCP 服務端 end *********************/}@Overridepublic void actionPerformed(ActionEvent actionEvent) {//System.out.println("發送按鈕被點擊了");sendDataToSocket();}//行為@Overridepublic void keyPressed(KeyEvent e) {//回車鍵// System.out.println(e);//發送數據到socket 同道中if(e.getKeyCode()==KeyEvent.VK_ENTER) {sendDataToSocket();}}//定義一個方法,實現將數據發送到socket通道中private void sendDataToSocket(){//1.獲取文本框中發送的內容String text = jtf.getText();//2.拼接需要發送的數據內容text = "服務端對客戶端說:"+text;//3.自己也要顯示jta.append(text+System.lineSeparator());//4.發送try {bw.write(text);bw.newLine();//換行刷新bw.flush();//5.清空文本框內容jtf.setText("");} catch (IOException e) {e.printStackTrace();}}@Overridepublic void keyTyped(KeyEvent keyEvent) {}@Overridepublic void keyReleased(KeyEvent keyEvent) {}}客戶端:
import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.Socket; import java.util.Properties;//說明:如果一個類,需要有界面的顯示,那么這個類就需要繼承JFrame,此時,該類可以被成為一個窗體類 /*步驟:1.定義JFrame窗體中的組件2.在構造方法中初始化窗口的組件*/public class ClientChatMain extends JFrame implements ActionListener, KeyListener {public static void main(String[] args) {//調用構造方法new ClientChatMain();}//屬性//文本域private JTextArea jta;//滾動條private JScrollPane jsp;//面板private JPanel jp;//文本框private JTextField jtf;//按鈕private JButton jb;//s輸出流private BufferedWriter bw =null;//客戶端的IP地址// private static String clientIp;//客戶端的port端口號// private static int clientPort;//靜態代碼塊加載外部配置文件/* static{Properties prop = new Properties();try {prop.load(new FileReader("chat.properties"));clientIp = prop.getProperty("clientIp");clientPort =Integer.parseInt( prop.getProperty("clientPort"));} catch (IOException e) {e.printStackTrace();}}*///構造方法public ClientChatMain(){//初始化組件jta = new JTextArea();//設置文本域默認不可編輯jta.setEditable(false);//注意:需要將文本域添加到滾動條中,實現滾動效果jsp =new JScrollPane(jta);//初始化面板jp = new JPanel();jtf = new JTextField(10);jb=new JButton("發送");//注意:需要將文本框與按鈕添加到面板中jp.add(jtf);jp.add(jb);//注意:需要將滾動條與面板全部添加到窗體中,繼承了窗體的屬性,這里this就是窗體this.add(jsp, BorderLayout.CENTER);//BorderLayout--邊框布局this.add(jp,BorderLayout.SOUTH);//注意:需要設置”標題“,大小,位置,關閉,是否可見this.setTitle("QQ聊天客戶端");this.setSize(400,300);this.setLocation(700,300);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//窗體關閉,程序就退出this.setVisible(true);//設置窗體可見/**************** TCP 客戶端 Start *********************///給發送按鈕綁定一個監聽點擊事件jb.addActionListener(this);//給文本框綁定一個鍵盤鍵jtf.addKeyListener(this);try {//1.創建一個客戶端的套接字(嘗試連接)Socket socket = new Socket("127.0.0.1",8888);//2.獲取socket通道的輸入流BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));//3.獲取socket 通道的輸出流bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));//循環讀取數據,并拼接到文本域String line = null;while((line = br.readLine())!=null){jta.append(line + System.lineSeparator());}//4.關閉socket 通道socket.close();}catch (Exception e){e.printStackTrace();}/**************** TCP 客戶端 end *********************/}@Overridepublic void actionPerformed(ActionEvent e) {sendDataToSocket();}//行為@Overridepublic void keyPressed(KeyEvent e) {//回車鍵if(e.getKeyCode() == KeyEvent.VK_ENTER){//發送數據sendDataToSocket();}}private void sendDataToSocket(){//1.獲取文本框需要發送內容String text = jtf.getText();//2.拼接內容text = "客戶端對服務端說"+text;//3.自己顯示jta.append(text+System.lineSeparator());try {//4.發送bw.write(text);bw.newLine();//換行加刷新bw.flush();bw.write(text);//5.清空jtf.setText("");} catch (IOException e) {e.printStackTrace();}}@Overridepublic void keyTyped(KeyEvent e) {}@Overridepublic void keyReleased(KeyEvent e) {}}接口類:
public interface addActistener { } public interface addActionListener { }
兄弟們,三連支持一下!!!
總結
以上是生活随笔為你收集整理的超详细带你用Java实现QQ的聊天功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ext2.0中EditorGridPan
- 下一篇: Java实现QQ、微信、新浪微博第三方登