Java模擬QQ實(shí)現(xiàn)聊天互動(dòng)程序
介紹
實(shí)現(xiàn)的功能、步驟:
1、定義JFrame窗體中的組件
2、在構(gòu)造方法中初始化窗體的組件
3、使用網(wǎng)絡(luò)編程完成數(shù)據(jù)的傳輸(TCP,UDP協(xié)議)
4、實(shí)現(xiàn)發(fā)送按鈕的監(jiān)聽點(diǎn)擊事件
5、實(shí)現(xiàn)回車鍵發(fā)送數(shù)據(jù)
功能演示
沒有點(diǎn)發(fā)送,數(shù)據(jù)卻發(fā)送出去了是因?yàn)榘戳嘶剀囨I
運(yùn)用到的知識點(diǎn)
GUI:java實(shí)現(xiàn)窗體、Swing。其實(shí)JAVA Swing的GUI目前企業(yè)中已經(jīng)不用了,主要是一些學(xué)校和培訓(xùn)機(jī)構(gòu)用來教導(dǎo)學(xué)生寫一些游戲、小項(xiàng)目,練練手的。
TCP(Transmission Control Protocol):傳輸控制協(xié)議。
核心代碼
服務(wù)端
注意:一定要先啟動(dòng)服務(wù)端,再啟動(dòng)客戶端。不然會造成數(shù)據(jù)丟失
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; //服務(wù)端 //注意:一定要先啟動(dòng)服務(wù)端,再啟動(dòng)客戶端,不然會造成數(shù)據(jù)丟失 public class QQ簡易聊天功能 extends JFrame implements ActionListener, KeyListener { public static void main(String[] args) { //調(diào)用構(gòu)造方法 new QQ簡易聊天功能(); } //文本域 private JTextArea jta; //滾動(dòng)條 private JScrollPane jsp; //面板 private JPanel jp; //文本框 private JTextField jtf; //按鈕 private JButton jb; //輸出流 private BufferedWriter bw=null; //構(gòu)造方法 public QQ簡易聊天功能(){ //初始化組件 jta=new JTextArea(); //設(shè)置文本域不可編輯 jta.setEditable(false); //將文本域添加到滾動(dòng)條中,實(shí)現(xiàn)滾動(dòng)效果 jsp=new JScrollPane(jta); //面板 jp=new JPanel(); jtf=new JTextField(10); jb=new JButton("發(fā)送"); //將文本框和按鈕添加到面板中 jp.add(jtf); jp.add(jb); //將滾動(dòng)條和面板都添加到窗體中 this.add(jsp, BorderLayout.CENTER); this.add(jp,BorderLayout.SOUTH); this.setTitle("QQ聊天服務(wù)端"); this.setSize(300,300); this.setLocation(300,300); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true);//設(shè)置組件顯示 //TCP服務(wù)端 //給發(fā)送按鈕綁定一個(gè)監(jiān)聽點(diǎn)擊事件 jb.addActionListener(this); //給文本框綁定一個(gè)鍵盤點(diǎn)擊事件 jtf.addKeyListener(this); try{ //創(chuàng)建一個(gè)服務(wù)端的套接字 ServerSocket serverSocket=new ServerSocket(8888); //等待客戶端的連接 Socket socket=serverSocket.accept(); //獲取Socket通道的輸入流 //InputStream in=socket.getInputStream(); BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream())); //獲取Socket通道的輸出流 bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); //讀取數(shù)據(jù) String Line=null; while ((Line=br.readLine())!=null){ jta.append(Line+System.lineSeparator());//拼接后換行 } //關(guān)閉serverSocket通道 serverSocket.close(); }catch(Exception e){ e.printStackTrace(); } } @Override public void actionPerformed(ActionEvent e) { //調(diào)用發(fā)送數(shù)據(jù)的方法 data(); } //行為 @Override public void keyPressed(KeyEvent e) { //判斷是否是回車鍵 if(e.getKeyCode()==KeyEvent.VK_ENTER);{ //發(fā)送數(shù)據(jù)到Socket管道中 data(); } } @Override public void keyTyped(KeyEvent e) { } @Override public void keyReleased(KeyEvent e) { } //定義一個(gè)方法,實(shí)現(xiàn)發(fā)送數(shù)據(jù)到Socket管道中 private void data(){ //獲取文本框中的內(nèi)容 String text=jtf.getText(); //拼接需要發(fā)送的內(nèi)容 text=this.getTitle()+": "+text;//獲取發(fā)送人的名字和內(nèi)容 //發(fā)送 try { bw.write(text); bw.newLine();//換行 bw.flush();//刷新 //發(fā)送完后,文本框內(nèi)應(yīng)沒有內(nèi)容 jtf.setText(null); } catch (Exception ex) { ex.printStackTrace(); } } }
客戶端
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; class 客戶端 extends JFrame implements ActionListener,KeyListener{ public static void main(String[] args) { //調(diào)用構(gòu)造方法 new 客戶端(); } //文本域 private JTextArea jta; //滾動(dòng)條 private JScrollPane jsp; //面板 private JPanel jp; //文本框 private JTextField jtf; //按鈕 private JButton jb; //輸出流 private BufferedWriter bw=null; //構(gòu)造方法 public 客戶端() { //初始化組件 jta=new JTextArea(); //設(shè)置文本域不可編輯 jta.setEditable(false); //將文本域添加到滾動(dòng)條中,實(shí)現(xiàn)滾動(dòng)效果 jsp=new JScrollPane(jta); //面板 jp=new JPanel(); jtf=new JTextField(10); jb=new JButton("發(fā)送"); //將文本框和按鈕添加到面板中 jp.add(jtf); jp.add(jb); //將滾動(dòng)條和面板都添加到窗體中 this.add(jsp, BorderLayout.CENTER); this.add(jp,BorderLayout.SOUTH); this.setTitle("QQ聊天客戶端"); this.setSize(300,300); this.setLocation(600,300); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true);//設(shè)置組件顯示 //給發(fā)送按鈕綁定一個(gè)監(jiān)聽點(diǎn)擊事件 jb.addActionListener(this); //給文本框綁定一個(gè)鍵盤點(diǎn)擊事件 jtf.addKeyListener(this); try { //TCP客戶端 //創(chuàng)建一個(gè)客戶端的套接字(嘗試連接) Socket socket=new Socket("127.0.0.1",8888); BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream())); //獲取Socket通道的輸出流 bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); //讀取數(shù)據(jù) String Line=null; while ((Line=br.readLine())!=null){ jta.append(Line+System.lineSeparator());//拼接后換行 } //關(guān)閉Socket通道 socket.close(); } catch (Exception e) { e.printStackTrace(); } } @Override public void actionPerformed(ActionEvent e) { //調(diào)用發(fā)送數(shù)據(jù)的方法 data(); } @Override public void keyPressed(KeyEvent e) { //判斷是否是回車鍵 if(e.getKeyCode()==KeyEvent.VK_ENTER);{ //發(fā)送數(shù)據(jù)到Socket管道中 data(); } } @Override public void keyTyped(KeyEvent e) { } @Override public void keyReleased(KeyEvent e) { } //定義一個(gè)方法,實(shí)現(xiàn)發(fā)送數(shù)據(jù)到Socket管道中 private void data(){ //獲取文本框中的內(nèi)容 String text=jtf.getText(); //拼接需要發(fā)送的內(nèi)容 text=this.getTitle()+": "+text;//獲取發(fā)送人的名字和內(nèi)容 //發(fā)送 try { bw.write(text); bw.newLine();//換行 bw.flush();//刷新 //發(fā)送完后,文本框內(nèi)應(yīng)沒有內(nèi)容 jtf.setText(null); } catch (Exception ex) { ex.printStackTrace(); } } }
其實(shí)兩個(gè)實(shí)現(xiàn)類百分之九十以上的代碼都是一樣的,只不過稍微有點(diǎn)名稱的變動(dòng)而已。
以上就是Java模擬QQ實(shí)現(xiàn)聊天互動(dòng)程序的詳細(xì)內(nèi)容,更多關(guān)于Java聊天互動(dòng)程序的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
淺析Java關(guān)鍵詞synchronized的使用
Synchronized是java虛擬機(jī)為線程安全而引入的。這篇文章主要為大家介紹一下Java關(guān)鍵詞synchronized的使用與原理,需要的可以參考一下2022-12-12SpringCloud之服務(wù)注冊與發(fā)現(xiàn)Spring Cloud Eureka實(shí)例代碼
這篇文章主要介紹了SpringCloud之服務(wù)注冊與發(fā)現(xiàn)Spring Cloud Eureka實(shí)例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04SpringCloud OpenFeign與Ribbon客戶端配置詳解
在springcloud中,openfeign是取代了feign作為負(fù)載均衡組件的,feign最早是netflix提供的,他是一個(gè)輕量級的支持RESTful的http服務(wù)調(diào)用框架,內(nèi)置了ribbon,而ribbon可以提供負(fù)載均衡機(jī)制,因此feign可以作為一個(gè)負(fù)載均衡的遠(yuǎn)程服務(wù)調(diào)用框架使用2022-11-11Java微信公眾平臺開發(fā)(5) 文本及圖文消息回復(fù)的實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Java微信公眾平臺開發(fā)第五步,回文本及圖文消息回復(fù)的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04windows定時(shí)器配置執(zhí)行java jar文件的方法詳解
這篇文章主要給大家介紹了關(guān)于windows定時(shí)器配置執(zhí)行java jar文件的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11