国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - Java模擬qq軟件的詳細過程

Java模擬qq軟件的詳細過程

2022-01-21 11:46冷丁_ Java教程

這篇文章主要為大家詳細介紹了用Java實現(xiàn)模擬QQ,實現(xiàn)了消息通信+登陸界面美化,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

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

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

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

Java模擬qq軟件的詳細過程

登陸界面代碼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

Java模擬qq軟件的詳細過程

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

Java模擬qq軟件的詳細過程

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

Java模擬qq軟件的詳細過程

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

Java模擬qq軟件的詳細過程

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

Java模擬qq軟件的詳細過程

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軟件的詳細過程的文章就介紹到這了,更多相關(guān)Java 模擬 qq內(nèi)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://blog.csdn.net/qq_41359998/article/details/120482564

延伸 · 閱讀

精彩推薦
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關(guān)于小米推送Java代碼,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩(wěn)中求8032021-07-12
  • Java教程Java實現(xiàn)搶紅包功能

    Java實現(xiàn)搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現(xiàn)搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決

    Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發(fā)現(xiàn)了對于集合操作轉(zhuǎn)換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關(guān)于Java8中S...

    阿杜7482021-02-04
  • Java教程xml與Java對象的轉(zhuǎn)換詳解

    xml與Java對象的轉(zhuǎn)換詳解

    這篇文章主要介紹了xml與Java對象的轉(zhuǎn)換詳解的相關(guān)資料,需要的朋友可以參考下...

    Java教程網(wǎng)2942020-09-17
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經(jīng)有好久沒有升過級了。升級完畢重啟之后,突然發(fā)現(xiàn)好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發(fā)項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
主站蜘蛛池模板: 免费毛片一级 | 国内精品视频在线观看 | 精品国偷自产在线 | 亚洲成人av在线 | 国产精品成人3p一区二区三区 | 亚洲精品一区二区三区不 | 国产2区 | 自拍偷拍专区 | 久久99深爱久久99精品 | 亚洲精品电影在线一区 | 不卡一二区 | 日韩av电影在线观看 | 久久久免费国产 | 亚洲精品一二区 | 99看| 黄色在线网站 | 含羞草www国产在线视频 | 欧美日韩精品一区二区三区蜜桃 | 国产精品亲子伦av一区二区三区 | 久在线视频 | 免费在线看a| 国产一区二区三区免费在线 | 亚洲国产成人av好男人在线观看 | 国产目拍亚洲精品99久久精品 | 国产精品毛片久久久久久久 | 久草免费福利 | 99青青草 | 野花国产精品入口 | 懂色一区二区三区av片 | 国产精品福利在线观看 | 中文在线视频 | 亚洲小视频网站 | 亚洲一区二区免费看 | 一区二区三区免费 | 精品视频一区二区三区四区 | 亚洲精品乱码久久久久久金桔影视 | 久久久一| 欧美自拍一区 | 国产欧美精品区一区二区三区 | 免费av在线网站 | 激情一区 |