国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

用Java實(shí)現(xiàn)簡(jiǎn)易聊天室

這篇具有很好參考價(jià)值的文章主要介紹了用Java實(shí)現(xiàn)簡(jiǎn)易聊天室。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

?文章來源地址http://www.zghlxwxcb.cn/news/detail-503109.html

說明:如果一個(gè)?類,需要有界面的顯示,那么該類就需要繼承自JFrame,此時(shí),該類就可以被稱為一個(gè)“窗體類"。

?

服務(wù)端代碼:

package cn.qy.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;

//說明:如果一個(gè)類,需要有界面的顯示,那么該類就需要繼承自JFrame,此時(shí),該類就可以被稱為一個(gè)“窗體類"
//1.定義JFrame窗體中的組件
//2.在構(gòu)造方法中初始化組件
//3.使用網(wǎng)絡(luò)編程完成數(shù)據(jù)的傳輸(TCP,UDP協(xié)議)
//4.實(shí)現(xiàn)“發(fā)送”按鈕的監(jiān)聽點(diǎn)擊事件。需要注意的是,文本域拼接數(shù)據(jù)時(shí),需要自己換行,不要在發(fā)送數(shù)據(jù)時(shí)換行。
public class ServerChatMain extends JFrame implements ActionListener, KeyListener {

    public static void main(String[] args) {
        // 調(diào)用構(gòu)造器
        new ServerChatMain();
    }
    //屬性

    //文本域
    private JTextArea jta;
    //滾動(dòng)條
    private JScrollPane jsp;
    //面板
    private JPanel jp;
    //文本框
    private JTextField jtf;
    //按鈕
    private JButton jb;

    //流
    BufferedReader br;
    BufferedWriter bw;

    //服務(wù)端端口號(hào)
    private static int serverPort;
    //靜態(tài)代碼塊加載外部配置文件
    //特點(diǎn)1:在類加載時(shí),自動(dòng)執(zhí)行
    //特點(diǎn)2:一個(gè)類只會(huì)加載一次,因此靜態(tài)代碼塊只會(huì)執(zhí)行一次
    static {
       Properties prop = new Properties();
       try {
           prop.load(new FileReader("chat.properties"));
           serverPort =Integer.parseInt(prop.getProperty("serverPort"));
       } catch (IOException e) {
           e.printStackTrace();
       }
   }

    //創(chuàng)建空參構(gòu)造器
    public ServerChatMain(){
        //初始化組件

        //初始化文本域
        jta = new JTextArea();
        //設(shè)置文本域不可編輯
        jta.setEditable(false);
        //將文本域添加到滾動(dòng)條中,實(shí)現(xiàn)滾動(dòng)效果
        jsp = new JScrollPane(jta);

        //面板
        jp = new JPanel();
        jtf = new JTextField(15);
        jb = new JButton("發(fā)送");
        //將文本框與按鈕添加到面板中
        jp.add(jtf);
        jp.add(jb);

        //將滾動(dòng)條與面板全部添加到窗體中
        this.add(jsp, BorderLayout.CENTER);
        this.add(jp, BorderLayout.SOUTH);

        //設(shè)置 標(biāo)題,大小,位置,關(guān)閉,是否可見
        this.setTitle("QQ 服務(wù)端");
        this.setSize(300,300);
        this.setLocation(600,300);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//窗體關(guān)閉,程序退出
        this.setVisible(true);

        /******************TCP 服務(wù)端 start*****************/

        //給發(fā)送按鈕綁定一個(gè)監(jiān)聽點(diǎn)擊事件
        jb.addActionListener(this);
        //給文本框綁定一個(gè)鍵盤點(diǎn)擊事件
        jtf.addKeyListener(this);
        //接收客戶端數(shù)據(jù),并回顯到自己的文本域
        try {
            //1.創(chuàng)建一個(gè)服務(wù)端的套接字socket
            ServerSocket serverSocket = new ServerSocket(serverPort);
            //2.等待客戶端的鏈接
            Socket socket = serverSocket.accept();//客戶端對(duì)象
            //3.獲取socket 通道的輸入流(輸入流是實(shí)現(xiàn)讀取數(shù)據(jù)的,一行一行讀取,因此用BufferedReader-->readLine
            br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            //4.獲取socket 通道的輸出流(輸出流實(shí)現(xiàn)寫出數(shù)據(jù),也是寫一行,換一行,刷新)BufferedWriter-->new Line()
            //什么時(shí)候需要寫出數(shù)據(jù)?當(dāng)用戶點(diǎn)擊發(fā)送按鈕時(shí)
            bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

            //循環(huán)讀取數(shù)據(jù),并把它拼接到文本域中
            String line = null;
            while ((line=br.readLine())!=null){
                //將讀取的數(shù)據(jù)拼接到文本域中顯示
                jta.append(line+System.lineSeparator());
            }
            //5.關(guān)閉serverSocket 通道
            serverSocket.close();

        } catch (IOException e) {
            e.printStackTrace();
        }



        /******************TCP 服務(wù)端 end*****************/

    }

    //行為
    /**
     * 重新ActionListener中的1個(gè)方法,實(shí)現(xiàn)點(diǎn)擊 發(fā)送鍵 發(fā)送
     * @param e
     */
    @Override
    public void actionPerformed(ActionEvent e) {
        sendDataToSocket();
    }
    /**
     * 重寫KeyListener中的3個(gè)方法,實(shí)現(xiàn)Enter鍵發(fā)送
     * @param e
     */
    @Override
    public void keyPressed(KeyEvent e) {
        //回車鍵
        if (e.getKeyCode()== KeyEvent.VK_ENTER){
            //發(fā)送數(shù)據(jù)到socket通道
            sendDataToSocket();
        }
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyReleased(KeyEvent e) {

    }

    //方法功能:發(fā)送數(shù)據(jù)到客戶端,并將內(nèi)容回顯到自己的文本域
    public void sendDataToSocket(){
        //1.獲取文本框中的內(nèi)容
        String text = jtf.getText();
        //2.拼接需要發(fā)送的數(shù)據(jù)內(nèi)容
        text = "服務(wù)端對(duì)客戶端說:"+text;
        //3.自己也需要顯示
        jta.append(text+System.lineSeparator());

        try {
            //4.發(fā)送
            bw.write(text);
            bw.newLine();
            bw.flush();
            //5.清空文本框
            jtf.setText("");
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }
}

客戶端代碼:

package cn.qy.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.Socket;
import java.util.Properties;

//說明:如果一個(gè)類,需要有界面的顯示,那么該類就需要繼承自JFrame,此時(shí),該類就可以被稱為一個(gè)“窗體類
//1.定義JFrame窗體中的組件
//2.在構(gòu)造方法中初始化組件
public class ClientChatMain extends JFrame implements ActionListener, KeyListener {

    public static void main(String[] args) {
        // 調(diào)用構(gòu)造器
        new ClientChatMain();
    }
    //屬性

    //文本域
    private JTextArea jta;
    //滾動(dòng)條
    private JScrollPane jsp;
    //面板
    private JPanel jp;
    //文本框
  private JTextField jtf;
    //按鈕
    private JButton jb;

    //流
    BufferedReader br;
    BufferedWriter bw;

    //通信的IP和Port
    private static int clientPort;
    private static String clientIP;
    //靜態(tài)代碼塊加載外部配置文件
    //特點(diǎn)1:在類加載時(shí),自動(dòng)執(zhí)行
    //特點(diǎn)2:一個(gè)類只會(huì)加載一次,因此靜態(tài)代碼塊只會(huì)執(zhí)行一次
    static {
        Properties prop = new Properties();
        try {
            prop.load(new FileReader("chat.properties"));
            clientPort = Integer.parseInt(prop.getProperty("clientPort"));
            clientIP = prop.getProperty("clientIP");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //創(chuàng)建構(gòu)造器
    public ClientChatMain(){
        //初始化組件

        //初始化文本域
        jta = new JTextArea();
        //設(shè)置文本域不可編輯
        jta.setEditable(false);

        //將文本域添加到滾動(dòng)條中,實(shí)現(xiàn)滾動(dòng)效果
        jsp = new JScrollPane(jta);
        //面板
        jp = new JPanel();
        jtf = new JTextField(15);
        jb = new JButton("發(fā)送");
        //將文本框與按鈕添加到面板中
        jp.add(jtf);
        jp.add(jb);

        //將滾動(dòng)條與面板全部添加到窗體中
        this.add(jsp, BorderLayout.CENTER);
        this.add(jp, BorderLayout.SOUTH);

        //設(shè)置 標(biāo)題 大小,位置,關(guān)閉,是否可見
        this.setTitle("QQ 客戶端");
        this.setSize(300,300);
        this.setLocation(300,300);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//窗體關(guān)閉,程序退出
        this.setVisible(true);

        /******************TCP 客戶端 start*****************/
        //給發(fā)送按鈕綁定一個(gè)監(jiān)聽點(diǎn)擊事件
        jb.addActionListener(this);
        //給鍵盤綁定單擊事件
        jtf.addKeyListener(this);
        //接受服務(wù)端數(shù)據(jù),并回顯到自己的文本域
        try {
            //1.創(chuàng)建一個(gè)客戶端的套接字socket
            Socket socket = new Socket(clientIP, clientPort);
            //2.獲取socket 通道的輸入流
            br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            //3.獲取socket 通道的輸出流
            bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

            //循環(huán)讀取數(shù)據(jù),并把它拼接到文本域中
            String line =null;
            while ((line=br.readLine())!=null){
                jta.append(line+System.lineSeparator());
            }

            //4.關(guān)閉socket 通道
            socket.close();

        } catch (Exception e) {
            e.printStackTrace();
        }


        /******************TCP 客戶端 end*****************/

    }

    //行為

    /**
     * 重新ActionListener中的1個(gè)方法,實(shí)現(xiàn)點(diǎn)擊 發(fā)送鍵 發(fā)送
     * @param e
     */
    @Override
    public void actionPerformed(ActionEvent e) {
       sendDataToSocket();
    }

    /**
     * 重寫KeyListener中的3個(gè)方法,實(shí)現(xiàn)Enter鍵發(fā)送
     * @param e
     */
    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode()==KeyEvent.VK_ENTER){
            sendDataToSocket();
        }
    }
    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyReleased(KeyEvent e) {

    }

    //方法功能:發(fā)送數(shù)據(jù)到服務(wù)端,并將內(nèi)容回顯到自己的文本域
    private void sendDataToSocket(){
        //1.獲取文本框中的內(nèi)容
        String text = jtf.getText();
        //2.拼接需要發(fā)送的數(shù)據(jù)內(nèi)容
        text = "客戶端對(duì)服務(wù)端說:"+text;
        //3.自己也需要顯示
        jta.append(text+System.lineSeparator());

        try {
            //4.發(fā)送
            bw.write(text);
            bw.newLine();
            bw.flush();
            //5.清空文本框
            jtf.setText("");
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }
}

?啟動(dòng)時(shí),必須先啟動(dòng)服務(wù)端,再啟動(dòng)客戶端。

最終效果:

用Java實(shí)現(xiàn)簡(jiǎn)易聊天室

?

?

?

到了這里,關(guān)于用Java實(shí)現(xiàn)簡(jiǎn)易聊天室的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • websocket+elementui+vue實(shí)現(xiàn)簡(jiǎn)易聊天室

    websocket+elementui+vue實(shí)現(xiàn)簡(jiǎn)易聊天室

    搭建服務(wù)端環(huán)境 安裝socket.io 服務(wù)端基于node,js的express框架生成,所以寫成模塊,引入至app.js中 其中,io.sockets.emit用于向所有建立連接的客戶端發(fā)送信息,socket.broadcast.emit用于向除發(fā)送方之外的客戶端發(fā)送信息。 客戶端基于vue和elementui 進(jìn)入聊天頁面后,先判斷用戶是否登錄,

    2024年04月25日
    瀏覽(37)
  • 利用Java EE相關(guān)技術(shù)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的Web聊天室系統(tǒng)

    利用Java EE相關(guān)技術(shù)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的Web聊天室系統(tǒng)

    利用Java EE相關(guān)技術(shù)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的Web聊天室系統(tǒng) (1)編寫一個(gè)登錄頁面,登錄信息中有用戶名和密碼,分別用兩個(gè)按鈕來提交和重置登錄信息。 (2)通過請(qǐng)求指派來處理用戶提交的登錄信息,如果用戶名為本小組成員的名字且密碼為對(duì)應(yīng)的學(xué)號(hào)時(shí),跳轉(zhuǎn)到LoginSuccess顯示聊

    2024年02月07日
    瀏覽(31)
  • 基于WebSocket的簡(jiǎn)易聊天室的基本實(shí)現(xiàn)梳理

    基于WebSocket的簡(jiǎn)易聊天室的基本實(shí)現(xiàn)梳理

    目前在很多網(wǎng)站為了實(shí)現(xiàn)推送技術(shù)所用的技術(shù)都是 Ajax 輪詢。輪詢是在特定的的時(shí)間間隔(如每1秒),由瀏覽器對(duì)服務(wù)器發(fā)出HTTP請(qǐng)求,然后由服務(wù)器返回最新的數(shù)據(jù)給客戶端的瀏覽器。HTTP 協(xié)議是一種無狀態(tài)的、無連接的、單向的應(yīng)用層協(xié)議。它采用了請(qǐng)求/響應(yīng)模型。通信

    2024年02月11日
    瀏覽(23)
  • WebSocket+Vue實(shí)現(xiàn)簡(jiǎn)易多人聊天室 以及 對(duì)異步調(diào)用的理解

    WebSocket+Vue實(shí)現(xiàn)簡(jiǎn)易多人聊天室 以及 對(duì)異步調(diào)用的理解

    代碼倉庫:github ??HTTP是不支持長(zhǎng)連接的,WebSocket是一種通信協(xié)議,提供了在單一、長(zhǎng)連接上進(jìn)行全雙工通信的方式。它被設(shè)計(jì)用于在Web瀏覽器和Web服務(wù)器之間實(shí)現(xiàn),但也可以用于任何需要實(shí)時(shí)通信的應(yīng)用程序。使用ws作為協(xié)議標(biāo)識(shí)符,如果需要加密則使用wss作為協(xié)議標(biāo)識(shí)符

    2024年01月17日
    瀏覽(25)
  • Vue + Element-Plus + SpringBoot + WebSocket實(shí)現(xiàn)簡(jiǎn)易網(wǎng)絡(luò)聊天室

    Vue + Element-Plus + SpringBoot + WebSocket實(shí)現(xiàn)簡(jiǎn)易網(wǎng)絡(luò)聊天室

    項(xiàng)目流程圖 1. 前端搭建: ? ? ? ? 前端用Vue+Element-Plus 來搭建,由登錄頁面和聊天頁面組成 1.1 登錄頁面 ? ? ? ? 由一個(gè)昵稱輸入框組成,用戶輸入自己的昵稱若昵稱和別的用戶不重復(fù),則可進(jìn)入聊天室,否則提示錯(cuò)誤并請(qǐng)重新輸入。 ????????這段代碼是一個(gè)Vue.js組件的

    2024年02月03日
    瀏覽(22)
  • Netty簡(jiǎn)易聊天室

    Netty簡(jiǎn)易聊天室

    通過一個(gè)簡(jiǎn)易的聊天室案例,講述Netty的基本使用。同時(shí)分享案例代碼。 項(xiàng)目中用到了log4j2,junit5,同時(shí)分享這些基礎(chǔ)組件的使用。 項(xiàng)目中用到了awt,屬于古董技術(shù),只是用來做界面。非重點(diǎn)不用關(guān)注。 開發(fā)工具:idea2023,jdk:1.8,Maven:3.6.3 maven依賴 日志配置 src/main/resou

    2024年02月11日
    瀏覽(93)
  • 簡(jiǎn)易聊天室(Python版)

    簡(jiǎn)易聊天室(Python版)

    目錄 簡(jiǎn)介 運(yùn)行效果 代碼 客戶端 服務(wù)器 自定義庫 通訊協(xié)議及相關(guān)配置定義庫(DY.py) 數(shù)據(jù)庫調(diào)用庫(SJK.py) 套接字庫(TJZ.py) 套接字通訊庫(服務(wù)器端)(TJZ_FZ.py) 一個(gè)用python寫簡(jiǎn)易的聊天室程序,擁有登錄、注冊(cè)、找回密碼、聊天功能,采用TPC通訊,無管理員功能,修改密

    2024年02月09日
    瀏覽(18)
  • 基于Java Socket寫一個(gè)多線程的聊天室(附源碼)

    基于Java Socket寫一個(gè)多線程的聊天室(附源碼)

    Socket編程是在TCP/IP上的網(wǎng)絡(luò)編程,但是Socket在上述模型的什么位置呢。這個(gè)位置被一個(gè)天才的理論家或者是抽象的計(jì)算機(jī)大神提出并且安排出來 ? 我們可以發(fā)現(xiàn)Socket就在應(yīng)用程序的傳輸層和應(yīng)用層之間,設(shè)計(jì)了一個(gè)Socket抽象層,傳輸層的底一層的服務(wù)提供給Socket抽象層,S

    2024年02月10日
    瀏覽(30)
  • Java+Vue實(shí)現(xiàn)聊天室(WebSocket進(jìn)階-聊天記錄)

    Java+Vue實(shí)現(xiàn)聊天室(WebSocket進(jìn)階-聊天記錄)

    WebSocket 是一種在單個(gè)TCP連接上進(jìn)行全雙工通信的協(xié)議。WebSocket通信協(xié)議于2011年被IETF定為標(biāo)準(zhǔn)RFC 6455,并由RFC7936補(bǔ)充規(guī)范。WebSocket API也被W3C定為標(biāo)準(zhǔn)。 WebSocket使得客戶端和服務(wù)器之間的數(shù)據(jù)交換變得更加簡(jiǎn)單,允許服務(wù)端主動(dòng)向客戶端推送數(shù)據(jù)。在WebSocket API中,瀏覽器和服

    2024年02月11日
    瀏覽(110)
  • 【W(wǎng)ebSocket&IndexedDB】node+WebSocket&IndexedDB開發(fā)簡(jiǎn)易聊天室

    【W(wǎng)ebSocket&IndexedDB】node+WebSocket&IndexedDB開發(fā)簡(jiǎn)易聊天室

    序幕介紹: WebSocket 是 HTML5 開始提供的一種在單個(gè) TCP 連接上進(jìn)行全雙工通訊的協(xié)議。 講人話就是說: WebSocket 使得客戶端和服務(wù)器之間的數(shù)據(jù)交換變得更加簡(jiǎn)單,在 WebSocket API 中,瀏覽器和服務(wù)器只需要完成一次握手,兩者之間就直接可以創(chuàng)建持久性的連接,并進(jìn)行雙向數(shù)

    2024年02月10日
    瀏覽(47)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包