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

Java模擬qq軟件的詳細(xì)過程

 更新時間:2021年09月28日 15:19:01   作者:冷丁_  
這篇文章主要為大家詳細(xì)介紹了用Java實現(xiàn)模擬QQ,實現(xiàn)了消息通信+登陸界面美化,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

**之前在封裝代碼后出現(xiàn)了問題,按照最初的寫法,在登陸完畢后彈出聊天界面后會卡死,原因是當(dāng)時登陸界面和聊天界面都是使用的主線程,我的代碼沒有寫其他線程,無法多線程運行,因此在彈出聊天界面時線程不夠用了,就卡在了監(jiān)聽線程里,因為在監(jiān)聽線程中再有新的監(jiān)聽就會被卡住
在宇哥的指點下,將啟動服務(wù)器和客戶端的部分改為線程,就解決了此問題。改善后的代碼簡練和清晰了很多,更方便大家參考,代碼如下:
**

登陸界面的實現(xiàn)

登陸界面主要使用了JFrame,以及相關(guān)的一些組件,并且在界面中加上監(jiān)聽
登陸界面效果圖

在這里插入圖片描述

登陸界面代碼Login類

package com.lding.net;

import javax.swing.*;
import java.awt.*;

/**
 * @program: Chat
 * @description:
 * @author: 王丁
 * @date: 2021-09-26 08:58
 **/
public class Login{
    JTextField jTextField;


    public static void main(String[] args){
        Login login = new Login ();
        login.showUI ("kk");
    }

    public void showUI(String str){
        JFrame jf = new JFrame ();
        jf.setTitle ("❤️DDqq登陸界面❤️");
        jf.setSize (500, 400);
        jf.setDefaultCloseOperation (3);
        jf.setLocationRelativeTo (null);
        jf.setResizable (false);
        FlowLayout fl = new FlowLayout (FlowLayout.CENTER, 5, 5);
        jf.setLayout (fl);
        Dimension dim1 = new Dimension (500, 200);//圖片大小
        Dimension dim2 = new Dimension (100, 50);//標(biāo)簽大小
        Dimension dim3 = new Dimension (300, 30);//輸入框大小
        Dimension dim4 = new Dimension (100, 40);//按鈕大小

        ImageIcon icon = new ImageIcon ("source/Login1.jpg");
        JLabel labimg = new JLabel (icon);
        labimg.setPreferredSize (dim1);
        jf.add (labimg);

        JLabel labuser = new JLabel ();
        labuser.setText ("user:");
        labuser.setPreferredSize (dim2);
        jf.add (labuser);
        JTextField textuser = new JTextField ();
        textuser.setPreferredSize (dim3);
        jf.add (textuser);

        JLabel labpassword = new JLabel ();
        labpassword.setText ("password:");
        labpassword.setPreferredSize (dim2);
        jf.add (labpassword);

        JPasswordField textPassword = new JPasswordField ();
        textPassword.setPreferredSize (dim3);
        jf.add (textPassword);

        JButton button = new JButton ();
        button.setBorder (BorderFactory.createRaisedBevelBorder ());
        button.setText ("login");
        button.setPreferredSize (dim4);
        jf.add (button);
        jf.setVisible (true);

        LoginListener ll = new LoginListener(textuser,textPassword, jf);
        button.addActionListener (ll);
        this.jTextField=ll.jTextField;

    }
}


login的監(jiān)聽類 LoginListener

package com.lding.net;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/**
 * @program: Chat
 * @description:
 * @author: 王丁
 * @date: 2021-09-26 08:59
 **/
public class LoginListener implements ActionListener {
    JTextField jTextField;
    JPasswordField jPasswordField;
    JFrame jf ;
    LoginListener( JTextField jTextField,JPasswordField jPasswordField,JFrame jf){
        this.jf=jf;
        this.jTextField = jTextField;
        this.jPasswordField = jPasswordField;
    }
    @Override
    public void actionPerformed(ActionEvent e){
        if(jTextField.getText().equals("Alice")&&String.valueOf(jPasswordField.getPassword()).equals("1234")){
            System.out.println ("服務(wù)端登錄??!");
            String name =jTextField.getText();
            new Server(name).start();
            jf.dispose();

        }else if(jTextField.getText().equals("Lding")&&String.valueOf(jPasswordField.getPassword()).equals("1234")){

            String name =jTextField.getText();
            System.out.println ("客戶端登錄?。?);
            new Client(name).start();
            jf.dispose();
        }


    }
}

在登陸完畢后,需要跳轉(zhuǎn)到聊天界面,這里采用的方法是通過一個flag標(biāo)志來判斷是否登陸完畢,當(dāng)?shù)顷懲戤吅?,會?chuàng)建新的聊天界面,并且登陸頁面會被關(guān)閉
依然是雙端通信,假定一端為客戶端,一端為服務(wù)端,其實兩端都可為用戶。

聊天界面運行圖

先登陸Alice的賬號 密碼為123456

在這里插入圖片描述

登陸成功后顯示ok,并等待連接

在這里插入圖片描述

再登陸冷丁的賬號,密碼為123456

在這里插入圖片描述

當(dāng)lding賬號登陸成功后完成連接,這時候會彈出兩個新的JFram窗口,為聊天見面

在這里插入圖片描述

隨后可以發(fā)送消息,消息可以實時顯示時間,并顯示用戶名
一方發(fā)送的消息會在另一方的窗口上實時顯示出來

在這里插入圖片描述

Client類代碼

package com.lding.net;

import com.lding.ui.MsgUI;

import javax.swing.*;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @program: Chat
 * @description: 客戶端
 * @author: 王丁
 * @date: 2021-09-26 08:58
 **/
public class Client extends  Thread{
    String name;

    public Client(String name) {
        this.name=name;
    }
    public static void main(String[] args) {
        String port="客戶端";
        Login login=new Login();
        login.showUI(port);
    }

    @Override
    public void run(){
        try {
            startClient();
        } catch (IOException e) {
            e.printStackTrace ();
        }
    }

    void startClient() throws IOException{
        Socket socket=new Socket("127.0.0.1",8888);
        //輸入 輸出流對象
        InputStream inputStream=socket.getInputStream();
        OutputStream outputStream=socket.getOutputStream();
        MsgUI msgUI=new MsgUI(outputStream,name);
        JTextPane showmsgpane=msgUI.initUI("客戶端");
        outputStream.flush();
        int count=1;
        while(true){
            int msglenth=inputStream.read();
            System.out.println("消息長度:"+msglenth);
            byte[] msgbytes=new byte[msglenth];
            //將接下來的數(shù)據(jù)讀入字節(jié)數(shù)組中
            inputStream.read(msgbytes);

            count++;
            if(count%2==0){
                SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//設(shè)置日期格式
                String date = df.format(new Date());// new Date()為獲取當(dāng)前系統(tǒng)時間,也可使用當(dāng)前時間戳
                String getmsg=new String(msgbytes);
                String msg=showmsgpane.getText();
                showmsgpane.setText(msg+date+"  ["+getmsg+"]"+"說:"+"\n");
            }else{
                String getmsg=new String(msgbytes);
                String msg=showmsgpane.getText();
                showmsgpane.setText(msg+getmsg+"\n");
            }
        }
    }
}


Server代碼

package com.lding.net;

import com.lding.ui.MsgUI;

import javax.swing.*;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @program: Chat
 * @description:
 * @author: 王丁
 * @date: 2021-09-26 08:58
 **/
public class Server extends  Thread{
    JTextField jTextField;
    String name;
    public Server(String name){
        this.name=name;
    }
    public static void main(String[] args) {
        String port="服務(wù)端";
        Login login=new Login();
        login.showUI(port);
    }
    @Override
    public void run(){
        try {
            startServer();
        } catch (IOException e) {
            e.printStackTrace ();
        }
    }
    void startServer() throws IOException{
        ServerSocket serverSocket=new ServerSocket(8888);
        System.out.println("等待連接?。?);
        Socket clientsocket=serverSocket.accept();//監(jiān)聽連接
        System.out.println("連接成功??!");
        InputStream inputStream=clientsocket.getInputStream();
        OutputStream outputStream=clientsocket.getOutputStream();

        MsgUI msgUI=new MsgUI(outputStream,name);
        JTextPane showmsgpane=msgUI.initUI("服務(wù)端");
        //outputStream.flush();
        int count=1;
        while(true){
            int msglenth=inputStream.read();
            System.out.println("消息長度是:"+msglenth);
            byte[] msgbytes=new byte[msglenth];
            //將接下來的數(shù)據(jù)讀入字節(jié)數(shù)組中
            inputStream.read(msgbytes);
            count++;
            if(count%2==0){
                SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//設(shè)置日期格式
                String date = df.format(new Date());// new Date()為獲取當(dāng)前系統(tǒng)時間,也可使用當(dāng)前時間戳
                String getmsg=new String(msgbytes);
                String msg=showmsgpane.getText();
                showmsgpane.setText(msg+date+"  ["+getmsg+"]"+"說:"+"\n");
            }else{
                String getmsg=new String(msgbytes);
                String msg=showmsgpane.getText();
                showmsgpane.setText(msg+getmsg+"\n");
            }
        }
    }
}


登陸界面代碼

MsgUI

package com.lding.ui;

import javax.swing.*;
import java.awt.*;
import java.io.OutputStream;

/**
 * @program: Chat
 * @description:
 * @author: 王丁
 * @date: 2021-09-26 08:59
 **/
public class MsgUI extends JFrame {

    OutputStream outputStream;
    String name;
    public MsgUI(OutputStream outputStream,String name){
        this.outputStream=outputStream;
        this.name=name;
    }
    public JTextPane initUI(String title){
        setTitle(title);
        setSize(800,800);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setLayout(new FlowLayout());
        //接收顯示框
        JTextPane jtp=new JTextPane();
        jtp.setPreferredSize(new Dimension(750,400));
        JScrollPane jsp=new JScrollPane(jtp);
        jtp.getText();
        Dimension dim=new Dimension(750,400);//按鈕大小



        //發(fā)送框
        JTextPane jtp1=new JTextPane();
        jtp1.setPreferredSize(new Dimension(750,200));
        JScrollPane jsp1=new JScrollPane(jtp1);

        JButton btn=new JButton("發(fā)送");
        add(jsp);
        add(jsp1);
        add(btn);
        setVisible(true);

        MsgListener msgl=new MsgListener(jtp1,this.outputStream,name);
        btn.addActionListener(msgl);
        return jtp;
    }
}

MsgUIListener

package com.lding.ui;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.OutputStream;

/**
 * @program: Chat
 * @description:
 * @author: 王丁
 * @date: 2021-09-26 09:00
 **/
public class MsgListener implements ActionListener {

    JTextPane jtp;
    OutputStream outputStream;
    String name;
    public  MsgListener(JTextPane jtp,OutputStream outputStream,String name){
        this.jtp=jtp;
        this.outputStream=outputStream;
        this.name=name;
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        byte[] names=this.name.getBytes();
        try {
            outputStream.write(names.length);
            outputStream.write(names);
            outputStream.flush();
        } catch (IOException ex) {
            ex.printStackTrace();
        }


        String msg=jtp.getText();
        byte[] msgs=msg.getBytes();
        try {
            outputStream.write(msgs.length);
            outputStream.write(msgs);
            outputStream.flush();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        jtp.setText(null);
    }
}


之后會豐富更多功能 敬請期待! 感謝您的觀看?。?!

到此這篇關(guān)于Java模擬qq軟件的詳細(xì)過程的文章就介紹到這了,更多相關(guān)Java 模擬 qq內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 通過實例深入學(xué)習(xí)Java的Struts框架中的OGNL表達式使用

    通過實例深入學(xué)習(xí)Java的Struts框架中的OGNL表達式使用

    這篇文章主要通過實例介紹了Java的Strus框架中的OGNL表達式使用,Struts框架是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下
    2015-11-11
  • Java多線程下解決數(shù)據(jù)安全問題

    Java多線程下解決數(shù)據(jù)安全問題

    這篇文章主要介紹了Java多線程下解決數(shù)據(jù)安全問題,本文使用代碼進行講解,可供大家學(xué)習(xí)參考
    2021-08-08
  • 詳解kafka中的消息分區(qū)分配算法

    詳解kafka中的消息分區(qū)分配算法

    kafka有分區(qū)機制,一個主題topic在創(chuàng)建的時候,會設(shè)置分區(qū)。如果只有一個分區(qū),那所有的消費者都訂閱的是這一個分區(qū)消息;如果有多個分區(qū)的話,那消費者之間又是如何分配的呢?本文就來為大家詳細(xì)講解一下
    2022-04-04
  • Maven的pom.xml中resources標(biāo)簽的用法

    Maven的pom.xml中resources標(biāo)簽的用法

    本文主要介紹了Maven的pom.xml中resources標(biāo)簽的用法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Java使用Condition實現(xiàn)精準(zhǔn)喚醒線程詳解

    Java使用Condition實現(xiàn)精準(zhǔn)喚醒線程詳解

    這篇文章主要為大家詳細(xì)介紹了Java如何使用Condition實現(xiàn)精準(zhǔn)喚醒線程效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2023-02-02
  • Java SPI 機制知識點總結(jié)

    Java SPI 機制知識點總結(jié)

    在本篇文章里小編給大家整理的是一篇關(guān)于Java SPI 機制知識點總結(jié)內(nèi)容,需要的朋友們可以參考下。
    2020-02-02
  • Java并發(fā)控制機制詳解

    Java并發(fā)控制機制詳解

    這篇文章主要為大家詳細(xì)介紹了Java并發(fā)控制機制,什么是Java并發(fā)控制機制,Java并發(fā)控制機制的作用,感興趣的小伙伴們可以參考一下
    2016-08-08
  • 詳解springSecurity之java配置篇

    詳解springSecurity之java配置篇

    這篇文章主要介紹了詳解springSecurity之java配置篇,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • SpringBoot中選擇性加載Bean的幾種方式小結(jié)

    SpringBoot中選擇性加載Bean的幾種方式小結(jié)

    自動配置是springboot技術(shù)非常好用的核心因素,前面學(xué)習(xí)了這么多種技術(shù)的整合,每一個都離不開自動配置,不過在學(xué)習(xí)自動配置的時候,需要你對spring容器如何進行bean管理的過程非常熟悉才行,本文給大家介紹了SpringBoot中選擇性加載Bean的幾種方式,需要的朋友可以參考下
    2025-01-01
  • Java并發(fā)編程示例(三):線程中斷

    Java并發(fā)編程示例(三):線程中斷

    這篇文章主要介紹了Java并發(fā)編程示例(三):線程中斷,在本節(jié),我們所開發(fā)的示例程序?qū)?chuàng)建一個線程,五秒鐘后,利用中斷機制強制中止這個線程,需要的朋友可以參考下
    2014-12-12

最新評論

武穴市| 伊金霍洛旗| 防城港市| 赤峰市| 图木舒克市| 平和县| 陆河县| 勐海县| 兰坪| 伊宁县| 通辽市| 昌平区| 盐城市| 济宁市| 龙游县| 绩溪县| 繁峙县| 布尔津县| 福清市| 中宁县| 天柱县| 周口市| 陈巴尔虎旗| 广宁县| 门源| 郑州市| 霍林郭勒市| 丹棱县| 龙泉市| 太原市| 安陆市| 攀枝花市| 宝山区| 扶沟县| 高要市| 资中县| 历史| 武强县| 霍州市| 巴楚县| 秦皇岛市|