最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java模擬QQ實現(xiàn)聊天互動程序

 更新時間:2022年06月10日 09:28:42   作者:遇安.112  
這篇文章主要介紹了如何利用Java語言模擬QQ實現(xiàn)一個簡易的聊天互動程序,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下

介紹

實現(xiàn)的功能、步驟:

1、定義JFrame窗體中的組件

2、在構(gòu)造方法中初始化窗體的組件

3、使用網(wǎng)絡(luò)編程完成數(shù)據(jù)的傳輸(TCP,UDP協(xié)議)

4、實現(xiàn)發(fā)送按鈕的監(jiān)聽點擊事件

5、實現(xiàn)回車鍵發(fā)送數(shù)據(jù)  

功能演示

沒有點發(fā)送,數(shù)據(jù)卻發(fā)送出去了是因為按了回車鍵 

運用到的知識點

GUI:java實現(xiàn)窗體、Swing。其實JAVA Swing的GUI目前企業(yè)中已經(jīng)不用了,主要是一些學校和培訓機構(gòu)用來教導學生寫一些游戲、小項目,練練手的。 

TCP(Transmission Control Protocol):傳輸控制協(xié)議。

核心代碼

服務(wù)端

注意:一定要先啟動服務(wù)端,再啟動客戶端。不然會造成數(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ù)端
//注意:一定要先啟動服務(wù)端,再啟動客戶端,不然會造成數(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;
    //滾動條
    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);
        //將文本域添加到滾動條中,實現(xiàn)滾動效果
        jsp=new JScrollPane(jta);
        //面板
        jp=new JPanel();
        jtf=new JTextField(10);
        jb=new JButton("發(fā)送");
        //將文本框和按鈕添加到面板中
        jp.add(jtf);
        jp.add(jb);
 
        //將滾動條和面板都添加到窗體中
        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ā)送按鈕綁定一個監(jiān)聽點擊事件
        jb.addActionListener(this);
        //給文本框綁定一個鍵盤點擊事件
        jtf.addKeyListener(this);
        try{
            //創(chuàng)建一個服務(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) {
    }
    //定義一個方法,實現(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;
    //滾動條
    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);
        //將文本域添加到滾動條中,實現(xiàn)滾動效果
        jsp=new JScrollPane(jta);
        //面板
        jp=new JPanel();
        jtf=new JTextField(10);
        jb=new JButton("發(fā)送");
        //將文本框和按鈕添加到面板中
        jp.add(jtf);
        jp.add(jb);
 
        //將滾動條和面板都添加到窗體中
        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ā)送按鈕綁定一個監(jiān)聽點擊事件
        jb.addActionListener(this);
        //給文本框綁定一個鍵盤點擊事件
        jtf.addKeyListener(this);
        try {
            //TCP客戶端
            //創(chuàng)建一個客戶端的套接字(嘗試連接)
            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) {
    }
    //定義一個方法,實現(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();
        }
    }
}

其實兩個實現(xiàn)類百分之九十以上的代碼都是一樣的,只不過稍微有點名稱的變動而已。

以上就是Java模擬QQ實現(xiàn)聊天互動程序的詳細內(nèi)容,更多關(guān)于Java聊天互動程序的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringBoot 創(chuàng)建容器的實現(xiàn)

    SpringBoot 創(chuàng)建容器的實現(xiàn)

    這篇文章主要介紹了SpringBoot 創(chuàng)建容器的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • Spring?MVC文件請求處理MultipartResolver詳解

    Spring?MVC文件請求處理MultipartResolver詳解

    這篇文章主要介紹了Spring?MVC文件請求處理詳解:MultipartResolver,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-11-11
  • Spring中的聲明式事務(wù)控制詳解

    Spring中的聲明式事務(wù)控制詳解

    這篇文章主要介紹了Spring中的聲明式事務(wù)控制詳解,Spring的聲明式事務(wù)顧名思義就是采用聲明的方式來處理事務(wù),這里所說的聲明,就是指在配置文件中聲明,用在Spring配置文件中聲明式的事務(wù)處理來代替代碼是的處理事務(wù),需要的朋友可以參考下
    2024-01-01
  • 徹底理解Java中的ThreadLocal

    徹底理解Java中的ThreadLocal

     ThreadLocal翻譯成中文比較準確的叫法應(yīng)該是:線程局部變量。使用這個工具類可以很簡潔地編寫出優(yōu)美的多線程程序。 接下來通過本文給大家介紹Java中的ThreadLocal,需要的朋友可以參考下
    2017-03-03
  • Java使用正則獲取括號里面的內(nèi)容

    Java使用正則獲取括號里面的內(nèi)容

    這篇文章主要介紹了Java使用正則獲取括號里面的內(nèi)容問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Java實現(xiàn)飛機大戰(zhàn)-連接數(shù)據(jù)庫并把得分寫入數(shù)據(jù)庫

    Java實現(xiàn)飛機大戰(zhàn)-連接數(shù)據(jù)庫并把得分寫入數(shù)據(jù)庫

    這篇文章給大家分享了Java實現(xiàn)飛機大戰(zhàn)中連接數(shù)據(jù)庫并把得分寫入數(shù)據(jù)庫的相關(guān)知識點和代碼,有興趣的可以學習參考下。
    2018-07-07
  • SpringCloud?hystrix斷路器與全局解耦全面介紹

    SpringCloud?hystrix斷路器與全局解耦全面介紹

    什么是服務(wù)降級?當服務(wù)器壓力劇增的情況下,根據(jù)實際業(yè)務(wù)情況及流量,對一些服務(wù)和頁面有策略的不處理或換種簡單的方式處理,從而釋放服務(wù)器資源以保證核心交易正常運作或高效運作
    2022-10-10
  • Java的注解原理詳解

    Java的注解原理詳解

    這篇文章主要介紹了Java的注解原理詳解,注解是JDK1.5引入的新特性,包含在java.lang.annotation包中,它是附加在代碼中的一些元信息,將一個類的外部信息與內(nèi)部成員聯(lián)系起來,在編 譯、運行時進行解析和使用,需要的朋友可以參考下
    2023-10-10
  • Spring之ORM模塊代碼詳解

    Spring之ORM模塊代碼詳解

    這篇文章主要介紹了Spring之ORM模塊代碼詳解,具有一定參考價值,需要的朋友可以了解下。
    2017-12-12
  • java垃圾收集器與內(nèi)存分配策略詳解

    java垃圾收集器與內(nèi)存分配策略詳解

    本篇文章主要介紹了Java垃圾收集器與內(nèi)存分配策略的方法和原理總結(jié),Java垃圾回收器是Java虛擬機的重要模塊,具有一定的參考價值,有興趣的可以了解一下
    2021-08-08

最新評論

寻甸| 崇仁县| 缙云县| 贵港市| 汉川市| 绥化市| 崇义县| 黑河市| 舟曲县| 平潭县| 宿州市| 颍上县| 墨玉县| 榆中县| 千阳县| 全南县| 鄯善县| 金华市| 敦化市| 灌云县| 浮山县| 宁津县| 科技| 含山县| 贵州省| 太和县| 赫章县| 轮台县| 白河县| 正定县| 珠海市| 江北区| 华亭县| 铁力市| 盘山县| 崇仁县| 郸城县| 东方市| 高密市| 交口县| 衡水市|