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

javaGUI實(shí)現(xiàn)多人聊天功能

 更新時(shí)間:2022年09月15日 16:27:03   作者:段茜琳  
這篇文章主要為大家詳細(xì)介紹了javaGUI實(shí)現(xiàn)多人聊天功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了javaGUI實(shí)現(xiàn)多人聊天的具體代碼,供大家參考,具體內(nèi)容如下

服務(wù)器

package com.ff.chat.chatserver.frame;

import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.net.BindException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Iterator;

public class ServerFrame extends JFrame {
? ? JTextArea msgArea;
? ? ArrayList<Socket> socketArrayList = new ArrayList<>();
? ? boolean serverFlag = true;//服務(wù)器啟動(dòng)標(biāo)志
? ? StringBuffer sb = new StringBuffer();
? ? ServerSocket serverSocket;
? ? //創(chuàng)建服務(wù)器端的顯示窗口
? ? public void creatFrame(){
? ? ? ? this.setTitle("聊天室-服務(wù)器端");
? ? ? ? this.setSize(500,500);
? ? ? ? this.setLocationRelativeTo(null);
? ? ? ? this.setResizable(false);
? ? ? ? this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

? ? ? ? //創(chuàng)建一個(gè)面板
? ? ? ? JPanel jp = new JPanel(new BorderLayout());

? ? ? ? //中間面板
? ? ? ? JPanel centerPanel = new JPanel();
? ? ? ? msgArea = new JTextArea(30,40);
? ? ? ? msgArea.setEditable(false);
? ? ? ? JScrollPane jsp = new JScrollPane(msgArea);
? ? ? ? centerPanel.add(jsp);

? ? ? ? jp.add(centerPanel);

? ? ? ? this.add(jp);
? ? ? ? this.setVisible(true);
? ? ? ? this.addWindowListener(new WindowAdapter() {
? ? ? ? ? ? @Override
? ? ? ? ? ? public void windowClosing(WindowEvent e) {
? ? ? ? ? ? ? ? int res = JOptionPane.showConfirmDialog(null,"確定要關(guān)閉服務(wù)器嗎?",
? ? ? ? ? ? ? ? ? ? ? ? "操作提示",JOptionPane.OK_CANCEL_OPTION);
? ? ? ? ? ? ? ? if(res == 0){
? ? ? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? ? ? dispose();
? ? ? ? ? ? ? ? ? ? ? ? serverSocket.close();
? ? ? ? ? ? ? ? ? ? } catch (IOException ioException) {
? ? ? ? ? ? ? ? ? ? ? ? ioException.printStackTrace();
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? });
? ? }

? ? //啟動(dòng)服務(wù)器,創(chuàng)建ServerSocket
? ? public void startServer(){
? ? ? ? try {
? ? ? ? ? ? //創(chuàng)建ServerSocket
? ? ? ? ? ? serverSocket = new ServerSocket(9998);
? ? ? ? ? ? System.out.println("等待客戶端連接");

? ? ? ? ? ? //循環(huán)監(jiān)聽客戶端連接
? ? ? ? ? ? while (serverFlag){
? ? ? ? ? ? ? ? if(serverSocket.isClosed()){
? ? ? ? ? ? ? ? ? ? serverFlag = false;
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? Socket socket = serverSocket.accept();

? ? ? ? ? ? ? ? System.out.println("客戶端連接成功");
? ? ? ? ? ? ? ? socketArrayList.add(socket);

? ? ? ? ? ? ? ? //為每一個(gè)客戶端開啟一個(gè)線程,監(jiān)聽客戶端發(fā)來的消息
? ? ? ? ? ? ? ? new ServerThread(socket).start();
? ? ? ? ? ? }

? ? ? ? } catch (BindException b) {
? ? ? ? ? ? b.printStackTrace();
? ? ? ? ? ? System.out.println("服務(wù)器端口被占用");
? ? ? ? ? ? System.exit(0);
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? System.out.println("服務(wù)器啟動(dòng)失敗");
? ? ? ? ? ? serverFlag = false;
? ? ? ? }
? ? }

? ? //創(chuàng)建一個(gè)內(nèi)部類,開啟一個(gè)線程,接收消息
? ? class ServerThread extends Thread{
? ? ? ? Socket socket;
? ? ? ? DataInputStream in;
? ? ? ? DataOutputStream out;
? ? ? ? boolean clientFlag = true;

? ? ? ? public ServerThread(Socket socket){
? ? ? ? ? ? this.socket = socket;
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? this.in = new DataInputStream(socket.getInputStream());
? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? }
? ? ? ? }

? ? ? ? @Override
? ? ? ? public void run() {
? ? ? ? ? ? //監(jiān)聽接收客戶端發(fā)送的消息
? ? ? ? ? ? while (clientFlag){
? ? ? ? ? ? ? ? if(socket.isClosed()){
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? String msg = in.readUTF();//讀到客戶端發(fā)送的消息
? ? ? ? ? ? ? ? ? ? sb.append(msg+"\n");
? ? ? ? ? ? ? ? ? ? System.out.println(sb);
? ? ? ? ? ? ? ? ? ? msgArea.setText(sb.toString());

? ? ? ? ? ? ? ? ? ? //從服務(wù)器端向客戶端發(fā)送消息
? ? ? ? ? ? ? ? ? ? if(socketArrayList.size() > 0){
? ? ? ? ? ? ? ? ? ? ? ? Iterator<Socket> it = socketArrayList.iterator();
? ? ? ? ? ? ? ? ? ? ? ? while (it.hasNext()){
? ? ? ? ? ? ? ? ? ? ? ? ? ? Socket soc = it.next();
? ? ? ? ? ? ? ? ? ? ? ? ? ? if(soc.isClosed()){//當(dāng)客戶端某個(gè)socket已經(jīng)為關(guān)閉狀態(tài),移除此socket
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? it.remove();
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? continue;
? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? //客戶端socket如果沒有關(guān)閉,向客戶端發(fā)送消息
? ? ? ? ? ? ? ? ? ? ? ? ? ? out = new DataOutputStream(soc.getOutputStream());
? ? ? ? ? ? ? ? ? ? ? ? ? ? out.writeUTF(sb.toString());
? ? ? ? ? ? ? ? ? ? ? ? ? ? out.flush();
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? } catch (EOFException ef){
? ? ? ? ? ? ? ? ? ? System.out.println("ip為:"+socket.getInetAddress()+"的客戶端下線了");
? ? ? ? ? ? ? ? ? ? clientFlag = false;
? ? ? ? ? ? ? ? }catch (IOException e) {
? ? ? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? }
}
package com.ff.chat.chatserver.frame;

public class ServerRun {

? ? public static void main(String[] args) {
? ? ? ? ServerFrame serverFrame = new ServerFrame();
? ? ? ? serverFrame.creatFrame();
? ? ? ? serverFrame.startServer();

? ? }
}

客戶端

注意:要在自己的電腦上運(yùn)行多次客戶端需要勾選如下選項(xiàng)

1.登錄界面

package com.ff.chat.chatclient.frame;

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

public class LoginFrame extends JFrame {

? ? JTextField accountField = null;

? ? //創(chuàng)建窗口
? ? public void creatFrame(){
? ? ? ? this.setTitle("聊天窗口");
? ? ? ? this.setSize(400,400);
? ? ? ? this.setResizable(false);
? ? ? ? this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
? ? ? ? this.setLocationRelativeTo(null);

? ? ? ? /*
? ? ? ? * 創(chuàng)建一個(gè)4行1列的面板
? ? ? ? * */
? ? ? ? JPanel jp = new JPanel(new GridLayout(4,1));

? ? ? ? //歡迎登陸面板
? ? ? ? JPanel welcomePanel = new JPanel();
? ? ? ? JLabel welcomLabel = new JLabel("歡迎登陸");
? ? ? ? welcomePanel.add(welcomLabel);

? ? ? ? //賬號面板
? ? ? ? JPanel accountPanel = new JPanel();
? ? ? ? JLabel accountLabel = new JLabel("賬號");
? ? ? ? accountField = new JTextField(15);
? ? ? ? accountPanel.add(accountLabel);
? ? ? ? accountPanel.add(accountField);

? ? ? ? //密碼面板
? ? ? ? JPanel passwordPanel = new JPanel();
? ? ? ? JLabel passwordLabel = new JLabel("密碼");
? ? ? ? JPasswordField passwordField = new JPasswordField(15);
? ? ? ? passwordPanel.add(passwordLabel);
? ? ? ? passwordPanel.add(passwordField);

? ? ? ? //登錄按鈕面板
? ? ? ? JPanel btnPanel = new JPanel();
? ? ? ? JButton loginBtn = new JButton("登錄");
? ? ? ? JButton regBtn = new JButton("注冊");
? ? ? ? btnPanel.add(loginBtn);
? ? ? ? btnPanel.add(regBtn);

? ? ? ? jp.add(welcomePanel);
? ? ? ? jp.add(accountPanel);
? ? ? ? jp.add(passwordPanel);
? ? ? ? jp.add(btnPanel);
? ? ? ? this.add(jp);

? ? ? ? this.setVisible(true);

? ? ? ? //組件綁定事件監(jiān)聽
? ? ? ? loginBtn.addActionListener(new ActionListener() {
? ? ? ? ? ? @Override
? ? ? ? ? ? public void actionPerformed(ActionEvent e) {
? ? ? ? ? ? ? ? //獲得賬號密碼
? ? ? ? ? ? ? ? String account = accountField.getText();
? ? ? ? ? ? ? ? String password = new String(passwordField.getPassword());
? ? ? ? ? ? ? ? if(account.length() == 0){
? ? ? ? ? ? ? ? ? ? JOptionPane.showMessageDialog(null,"賬號不能為空",
? ? ? ? ? ? ? ? ? ? ? ? ? ? "操作提示",JOptionPane.WARNING_MESSAGE);
? ? ? ? ? ? ? ? ? ? return;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? if(password.length() == 0){
? ? ? ? ? ? ? ? ? ? JOptionPane.showMessageDialog(null,"密碼不能為空",
? ? ? ? ? ? ? ? ? ? ? ? ? ? "操作提示",JOptionPane.WARNING_MESSAGE);
? ? ? ? ? ? ? ? ? ? return;
? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? //預(yù)留2.0版本 與數(shù)據(jù)庫交互

? ? ? ? ? ? ? ? //連接服務(wù)器,創(chuàng)建Socket對象
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? Socket socket = new Socket("192.168.31.179",9998);//該地址為要連接的服務(wù)器的地址
? ? ? ? ? ? ? ? ? ? new ClientFrame(socket,account).creatFrame();
? ? ? ? ? ? ? ? ? ? dispose(); //釋放當(dāng)前登錄窗口
? ? ? ? ? ? ? ? } catch (IOException ioException) {
? ? ? ? ? ? ? ? ? ? ioException.printStackTrace();
? ? ? ? ? ? ? ? ? ? JOptionPane.showMessageDialog(null,"服務(wù)器連接失敗",
? ? ? ? ? ? ? ? ? ? ? ? ? ? "操作提示",JOptionPane.WARNING_MESSAGE);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? });
? ? }


}

2.聊天界面

package com.ff.chat.chatclient.frame;

import com.ff.chat.chatclient.utils.DateUtil;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Date;

public class ClientFrame extends JFrame {

? ? String account;
? ? Socket socket;
? ? DataOutputStream out;//數(shù)據(jù)輸出字節(jié)流
? ? DataInputStream in;//數(shù)據(jù)輸入字節(jié)流
? ? JTextArea msgArea;


? ? //創(chuàng)建聊天窗口時(shí),初始化數(shù)據(jù)
? ? public ClientFrame(Socket socket,String account){
? ? ? ? this.socket = socket;
? ? ? ? this.account = account;
? ? ? ? try {
? ? ? ? ? ? out = new DataOutputStream(socket.getOutputStream());
? ? ? ? ? ? in = new DataInputStream(socket.getInputStream());
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }

? ? }
? ? //創(chuàng)建聊天窗口
? ? public void creatFrame(){
? ? ? ? this.setTitle("聊天窗口-"+account);
? ? ? ? this.setSize(500,500);
? ? ? ? this.setResizable(false);
? ? ? ? this.setLocationRelativeTo(null);
? ? ? ? this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

? ? ? ? //創(chuàng)建一個(gè)面板
? ? ? ? JPanel jp = new JPanel(new BorderLayout());

? ? ? ? //中間面板
? ? ? ? JPanel centerPanel = new JPanel();
? ? ? ? msgArea = new JTextArea(30,40);
? ? ? ? msgArea.setEditable(false);//不可以直接編輯
? ? ? ? JScrollPane jsp = new JScrollPane(msgArea);
? ? ? ? centerPanel.add(jsp);

? ? ? ? //底部面板
? ? ? ? JPanel bottomPanel = new JPanel();
? ? ? ? JTextField msg = new JTextField(30);
? ? ? ? JButton sendBtn = new JButton("發(fā)送");
? ? ? ? bottomPanel.add(msg);
? ? ? ? bottomPanel.add(sendBtn);

? ? ? ? jp.add(centerPanel);
? ? ? ? jp.add(bottomPanel,BorderLayout.SOUTH);

? ? ? ? this.add(jp);
? ? ? ? this.setVisible(true);

? ? ? ? //發(fā)送按鈕添加監(jiān)聽事件
? ? ? ? sendBtn.addActionListener(new ActionListener() {
? ? ? ? ? ? @Override
? ? ? ? ? ? public void actionPerformed(ActionEvent e) {
? ? ? ? ? ? ? ? String m = msg.getText(); //獲得客戶端輸入的聊天內(nèi)容
? ? ? ? ? ? ? ? if(m.length() == 0){
? ? ? ? ? ? ? ? ? ? JOptionPane.showMessageDialog(null,"不能發(fā)送空白消息");
? ? ? ? ? ? ? ? ? ? return;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? //向服務(wù)器發(fā)送消息
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? String ms = account+":"+DateUtil.dateStr(new Date())+"\n"+m;
? ? ? ? ? ? ? ? ? ? out.writeUTF(ms);//向服務(wù)器發(fā)送消息
? ? ? ? ? ? ? ? ? ? out.flush();
? ? ? ? ? ? ? ? ? ? msg.setText("");//發(fā)送成功,清空聊天文本框
? ? ? ? ? ? ? ? } catch (IOException ioException) {
? ? ? ? ? ? ? ? ? ? ioException.printStackTrace();
? ? ? ? ? ? ? ? ? ? JOptionPane.showMessageDialog(null,"服務(wù)器連接失敗");
? ? ? ? ? ? ? ? }

? ? ? ? ? ? }
? ? ? ? });

? ? ? ? //聊天窗口添加事件監(jiān)聽
? ? ? ? this.addWindowListener(new WindowAdapter() {
? ? ? ? ? ? @Override
? ? ? ? ? ? public void windowClosing(WindowEvent e) {
? ? ? ? ? ? ? ? int res = JOptionPane.showConfirmDialog(null,"你確定要退出嗎?",
? ? ? ? ? ? ? ? ? ? ? ? "操作提示",JOptionPane.OK_CANCEL_OPTION);
? ? ? ? ? ? ? ? if(res == 0){
? ? ? ? ? ? ? ? ? ? dispose();
? ? ? ? ? ? ? ? ? ? new LoginFrame().creatFrame();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? socket.close();
? ? ? ? ? ? ? ? } catch (IOException ioException) {
? ? ? ? ? ? ? ? ? ? ioException.printStackTrace();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? });

? ? ? ? //啟動(dòng)一個(gè)線程,監(jiān)聽服務(wù)器是否向客戶端發(fā)送了消息
? ? ? ? new ClientThread(socket).start();
? ? }

? ? //創(chuàng)建一個(gè)內(nèi)部類
? ? class ClientThread extends Thread{
? ? ? ? //接收從服務(wù)器發(fā)來的消息
? ? ? ? Socket socket;
? ? ? ? boolean serverFlag = true;

? ? ? ? public ClientThread(Socket socket){
? ? ? ? ? ? this.socket = socket;
? ? ? ? }

? ? ? ? @Override
? ? ? ? public void run(){
? ? ? ? ? ? //監(jiān)聽接收服務(wù)器發(fā)來的消息
? ? ? ? ? ? while (serverFlag){
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? String ms = in.readUTF();
? ? ? ? ? ? ? ? ? ? msgArea.setText(ms);
? ? ? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? ? ? System.out.println("客戶端"+account+"下線了");
? ? ? ? ? ? ? ? ? ? serverFlag = false;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? }
}

3.運(yùn)行客戶端

package com.ff.chat.chatclient.frame;

public class ClientRun {

? ? public static void main(String[] args) {
? ? ? ? new LoginFrame().creatFrame();
? ? }
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java實(shí)現(xiàn)讀取163郵箱,qq郵箱的郵件內(nèi)容

    Java實(shí)現(xiàn)讀取163郵箱,qq郵箱的郵件內(nèi)容

    這篇文章主要利用Java語言實(shí)現(xiàn)讀取163郵箱和qq郵箱的郵件內(nèi)容,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起動(dòng)手試一試
    2022-02-02
  • JDK源碼Enum類原理及代碼實(shí)例解析

    JDK源碼Enum類原理及代碼實(shí)例解析

    這篇文章主要介紹了JDK源碼Enum類原理及代碼實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • SpringBoot中利用AOP和攔截器實(shí)現(xiàn)自定義注解

    SpringBoot中利用AOP和攔截器實(shí)現(xiàn)自定義注解

    本文將通過攔截器+AOP實(shí)現(xiàn)自定義注解,在這里攔截器充當(dāng)在指定注解處要執(zhí)行的方法,aop負(fù)責(zé)將攔截器的方法和要注解生效的地方做一個(gè)織入,感興趣的可以嘗試一下
    2022-06-06
  • java中簡單的截取分割字符串實(shí)例

    java中簡單的截取分割字符串實(shí)例

    下面小編就為大家?guī)硪黄猨ava中簡單的截取分割字符串實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-03-03
  • Spring-cloud 注冊服務(wù)提供者搭建方法

    Spring-cloud 注冊服務(wù)提供者搭建方法

    本篇文章主要介紹了Spring-cloud 注冊服務(wù)提供者搭建方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-04-04
  • java基礎(chǔ)的詳細(xì)了解第四天

    java基礎(chǔ)的詳細(xì)了解第四天

    這篇文章對Java編程語言的基礎(chǔ)知識作了一個(gè)較為全面的匯總,在這里給大家分享一下。需要的朋友可以參考,希望能給你帶來幫助
    2021-08-08
  • Java?Stream對象并行處理方法parallel()代碼示例

    Java?Stream對象并行處理方法parallel()代碼示例

    在Java中Stream是一種用于處理集合數(shù)據(jù)的流式操作API,它提供了一種簡潔、靈活、高效的方式來對集合進(jìn)行各種操作,下面這篇文章主要給大家介紹了關(guān)于Java?Stream對象并行處理方法parallel()的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • SpringCloud Config使用本地倉庫及map注入

    SpringCloud Config使用本地倉庫及map注入

    這篇文章主要介紹了SpringCloud Config使用本地倉庫及map注入,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • springboot配置項(xiàng)目啟動(dòng)后自動(dòng)打開瀏覽器訪問項(xiàng)目方式

    springboot配置項(xiàng)目啟動(dòng)后自動(dòng)打開瀏覽器訪問項(xiàng)目方式

    這篇文章主要介紹了springboot配置項(xiàng)目啟動(dòng)后自動(dòng)打開瀏覽器訪問項(xiàng)目方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • java搭建一個(gè)Socket服務(wù)器響應(yīng)多用戶訪問

    java搭建一個(gè)Socket服務(wù)器響應(yīng)多用戶訪問

    本篇文章主要介紹了java搭建一個(gè)Socket服務(wù)器響應(yīng)多用戶訪問,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-02-02

最新評論