欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java模擬QQ實(shí)現(xiàn)聊天互動(dòng)程序

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

介紹

實(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的使用

    淺析Java關(guān)鍵詞synchronized的使用

    Synchronized是java虛擬機(jī)為線程安全而引入的。這篇文章主要為大家介紹一下Java關(guān)鍵詞synchronized的使用與原理,需要的可以參考一下
    2022-12-12
  • SpringCloud之服務(wù)注冊與發(fā)現(xiàn)Spring Cloud Eureka實(shí)例代碼

    SpringCloud之服務(wù)注冊與發(fā)現(xiàn)Spring Cloud Eureka實(shí)例代碼

    這篇文章主要介紹了SpringCloud之服務(wù)注冊與發(fā)現(xiàn)Spring Cloud Eureka實(shí)例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-04-04
  • SpringCloud OpenFeign與Ribbon客戶端配置詳解

    SpringCloud 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-11
  • 將Bean注入Spring容器中的常用方式分享

    將Bean注入Spring容器中的常用方式分享

    在Spring框架中,有多種方式可以將Bean(即對象)放入Spring容器中,這篇文章就給大家介紹一些常用的方式,文中有詳細(xì)的代碼示例,感興趣的同學(xué)可以參考閱讀下
    2023-06-06
  • Java Arrays工具類用法詳解

    Java Arrays工具類用法詳解

    這篇文章主要介紹了Java Arrays工具類用法,結(jié)合實(shí)例形式分析了java Arrays工具類針對數(shù)組元素修改、復(fù)制、排序等操作使用技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2019-05-05
  • Java微信公眾平臺開發(fā)(5) 文本及圖文消息回復(fù)的實(shí)現(xiàn)

    Java微信公眾平臺開發(fā)(5) 文本及圖文消息回復(fù)的實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了Java微信公眾平臺開發(fā)第五步,回文本及圖文消息回復(fù)的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • java基于AspectJ(面向切面編程)編碼示例分享

    java基于AspectJ(面向切面編程)編碼示例分享

    AspectJ是一種面向切面程序設(shè)計(jì)的基于Java的實(shí)現(xiàn),下面對過示例學(xué)習(xí)他的使用方法,需要的朋友可以參考下
    2014-02-02
  • windows定時(shí)器配置執(zhí)行java jar文件的方法詳解

    windows定時(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
  • java整合SSM框架的圖文教程

    java整合SSM框架的圖文教程

    下面筆者就為大家分享一篇java整合SSM框架的圖文教程,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨筆者過來看看吧
    2017-11-11
  • Spark?SQL配置及使用教程

    Spark?SQL配置及使用教程

    SparkSQL是spark的一個(gè)模塊,主入口是SparkSession,將SQL查詢與Spark程序無縫混合,這篇文章主要介紹了Spark?SQL配置及使用,需要的朋友可以參考下
    2021-12-12

最新評論