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

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

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

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

服務器

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;//服務器啟動標志
? ? StringBuffer sb = new StringBuffer();
? ? ServerSocket serverSocket;
? ? //創(chuàng)建服務器端的顯示窗口
? ? public void creatFrame(){
? ? ? ? this.setTitle("聊天室-服務器端");
? ? ? ? this.setSize(500,500);
? ? ? ? this.setLocationRelativeTo(null);
? ? ? ? this.setResizable(false);
? ? ? ? this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

? ? ? ? //創(chuàng)建一個面板
? ? ? ? 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,"確定要關閉服務器嗎?",
? ? ? ? ? ? ? ? ? ? ? ? "操作提示",JOptionPane.OK_CANCEL_OPTION);
? ? ? ? ? ? ? ? if(res == 0){
? ? ? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? ? ? dispose();
? ? ? ? ? ? ? ? ? ? ? ? serverSocket.close();
? ? ? ? ? ? ? ? ? ? } catch (IOException ioException) {
? ? ? ? ? ? ? ? ? ? ? ? ioException.printStackTrace();
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? });
? ? }

? ? //啟動服務器,創(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);

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

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

? ? //創(chuàng)建一個內(nèi)部類,開啟一個線程,接收消息
? ? 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());

? ? ? ? ? ? ? ? ? ? //從服務器端向客戶端發(fā)送消息
? ? ? ? ? ? ? ? ? ? if(socketArrayList.size() > 0){
? ? ? ? ? ? ? ? ? ? ? ? Iterator<Socket> it = socketArrayList.iterator();
? ? ? ? ? ? ? ? ? ? ? ? while (it.hasNext()){
? ? ? ? ? ? ? ? ? ? ? ? ? ? Socket soc = it.next();
? ? ? ? ? ? ? ? ? ? ? ? ? ? if(soc.isClosed()){//當客戶端某個socket已經(jīng)為關閉狀態(tài),移除此socket
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? it.remove();
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? continue;
? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? //客戶端socket如果沒有關閉,向客戶端發(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();

? ? }
}

客戶端

注意:要在自己的電腦上運行多次客戶端需要勾選如下選項

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)建一個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;
? ? ? ? ? ? ? ? }

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

? ? ? ? ? ? ? ? //連接服務器,創(chuàng)建Socket對象
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? Socket socket = new Socket("192.168.31.179",9998);//該地址為要連接的服務器的地址
? ? ? ? ? ? ? ? ? ? new ClientFrame(socket,account).creatFrame();
? ? ? ? ? ? ? ? ? ? dispose(); //釋放當前登錄窗口
? ? ? ? ? ? ? ? } catch (IOException ioException) {
? ? ? ? ? ? ? ? ? ? ioException.printStackTrace();
? ? ? ? ? ? ? ? ? ? JOptionPane.showMessageDialog(null,"服務器連接失敗",
? ? ? ? ? ? ? ? ? ? ? ? ? ? "操作提示",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ù)據(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)建一個面板
? ? ? ? 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;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? //向服務器發(fā)送消息
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? String ms = account+":"+DateUtil.dateStr(new Date())+"\n"+m;
? ? ? ? ? ? ? ? ? ? out.writeUTF(ms);//向服務器發(fā)送消息
? ? ? ? ? ? ? ? ? ? out.flush();
? ? ? ? ? ? ? ? ? ? msg.setText("");//發(fā)送成功,清空聊天文本框
? ? ? ? ? ? ? ? } catch (IOException ioException) {
? ? ? ? ? ? ? ? ? ? ioException.printStackTrace();
? ? ? ? ? ? ? ? ? ? JOptionPane.showMessageDialog(null,"服務器連接失敗");
? ? ? ? ? ? ? ? }

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

? ? ? ? //聊天窗口添加事件監(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();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? });

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

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

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

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

3.運行客戶端

package com.ff.chat.chatclient.frame;

public class ClientRun {

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

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

相關文章

  • JVM實戰(zhàn)系列之CPU100%和內(nèi)存100%排查

    JVM實戰(zhàn)系列之CPU100%和內(nèi)存100%排查

    本文主要介紹了JVM實戰(zhàn)系列之CPU100%和內(nèi)存100%排查,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • SpringSecurity中內(nèi)置過濾器的使用小結

    SpringSecurity中內(nèi)置過濾器的使用小結

    SpringSecurity通過其復雜的過濾器鏈機制,為Java應用提供了全面的安全防護,本文主要介紹了SpringSecurity中內(nèi)置過濾器的使用小結,感性的可以了解一下
    2025-03-03
  • 如何基于Java實現(xiàn)對象List排序

    如何基于Java實現(xiàn)對象List排序

    這篇文章主要介紹了如何基于Java實現(xiàn)對象List排序,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-01-01
  • 一篇文章帶你了解Java SpringMVC返回null

    一篇文章帶你了解Java SpringMVC返回null

    這篇文章主要介紹了Spring MVC返回null,文中講的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2021-10-10
  • Java中自動裝箱、拆箱引起的耗時詳解

    Java中自動裝箱、拆箱引起的耗時詳解

    這篇文章主要給大家介紹了關于Java中自動裝箱、拆箱引起的耗時的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Java具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-04-04
  • Java中使用異或運算符實現(xiàn)加密字符串

    Java中使用異或運算符實現(xiàn)加密字符串

    這篇文章主要介紹了Java中使用異或運算符實現(xiàn)加密字符串,本文直接給出實現(xiàn)代碼,以及運算結果加密實例,需要的朋友可以參考下
    2015-06-06
  • Spring動態(tài)數(shù)據(jù)源實現(xiàn)讀寫分離詳解

    Spring動態(tài)數(shù)據(jù)源實現(xiàn)讀寫分離詳解

    這篇文章主要為大家詳細介紹了Spring動態(tài)數(shù)據(jù)源實現(xiàn)讀寫分離,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • mybatis之批量添加問題

    mybatis之批量添加問題

    這篇文章主要介紹了mybatis之批量添加問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Java定義泛型接口和類的方法實例分析

    Java定義泛型接口和類的方法實例分析

    這篇文章主要介紹了Java定義泛型接口和類的方法,結合實例形式分析了泛型相關概念、原理及泛型接口與類的定義實現(xiàn)方法,需要的朋友可以參考下
    2019-08-08
  • JAVA判斷空值方法原理解析

    JAVA判斷空值方法原理解析

    這篇文章主要介紹了JAVA判斷空值方法原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05

最新評論

常熟市| 金沙县| 莱芜市| 扬州市| 简阳市| 偃师市| 潮州市| 宜黄县| 台南县| 壶关县| 玛沁县| 高安市| 夏邑县| 山东| 札达县| 秦皇岛市| 新巴尔虎右旗| 红桥区| 金坛市| 石狮市| 康平县| 改则县| 阳朔县| 广德县| 浑源县| 民乐县| 定边县| 保靖县| 井冈山市| 建宁县| 德钦县| 桂平市| 利川市| 石河子市| 扎兰屯市| 繁峙县| 宾川县| 重庆市| 来凤县| 郧西县| 普陀区|