Java实现简单QQ聊天工具

2023-05-16 0 3,752

Java实现简单类似QQ聊天工具,供大家参考,具体内容如下

所使用到的知识点

运行截图

Java实现简单QQ聊天工具

Java实现简单QQ聊天工具

服务器端实现:

package tcp_server;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

/**
 * @author 乔澳
 * @version 1.0
 * @title: ServerThread
 * @projectName 20200222TCPServer
 * @description:
 * @date 2020/2/27   8:58
 */
public class ServerThread extends Thread{
    private User user;
    public ServerThread(User user){
        this.user = user;
    }
    @Override
    public void run() {
        Map<String, User> userMap = Server.userMap;
        Set<String> keys = userMap.keySet();
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(user.getSocket().getInputStream()));
            while (true) {
                String value = reader.readLine();// 客户端发来的一句话
                String[] valueAndUser = value.split(\"@\");
                //群聊
                if (valueAndUser.length == 1) {
                    Iterator<String> it = keys.iterator();
                    while (it.hasNext()) {
                        String key = it.next();
                        User u = userMap.get(key);
                        PrintWriter pw = new PrintWriter(u.getSocket().getOutputStream());
                        pw.println(user.getUsername() + \":\" + value + \"(来自群消息)\");
                        pw.flush();
                    }
                } else {
                    //单聊
                    for (int i = 1; i < valueAndUser.length; i++) {
                        String username = valueAndUser[i];
                        User u = userMap.get(username);
                        PrintWriter pw = new PrintWriter(u.getSocket().getOutputStream());
                        pw.println(user.getUsername() + \":\" + valueAndUser[0] + \"(来自私聊)\");
                        pw.flush();
                    }
                }
            }
        } catch (IOException e) {
            System.out.println(user.getUsername()+\"下线了\");
        }
    }
}
package tcp_server;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;

/**
 * @author 乔澳
 * @version 1.0
 * @title: Server
 * @projectName 20200222TCPServer
 * @description:
 * @date 2020/2/25   9:12
 */
public class Server {
    static Map<String,User> userMap = new HashMap<String, User>();
    public static void main(String[] args) {
        try {
            System.out.println(\"===server start===\");
            ServerSocket server = new ServerSocket(9999);
            while(true) {
                Socket socket = server.accept();

                BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                String username = br.readLine();
                User user = new User(username,socket);
                System.out.println(user.getUsername()+\"上线啦\");
                userMap.put(username,user);
                ServerThread thread = new ServerThread(user);
                thread.start();
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}
package tcp_server;

import java.net.Socket;

/**
 * @author 乔澳
 * @version 1.0
 * @title: User
 * @projectName 20200222TCPServer
 * @description:
 * @date 2020/2/27   8:23
 */
public class User {
    public User(String username, Socket socket) {
        this.username = username;
        this.socket = socket;
    }
    private String username;
    private Socket socket;

    public User() {
    }

    public String getUsername() {
        return username;
    }

    public Socket getSocket() {
        return socket;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public void setSocket(Socket socket) {
        this.socket = socket;
    }
}

客户端实现:

package tcp_client;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;

/**
 * @author 乔澳
 * @version 1.0
 * @title: ClientReader
 * @projectName 20200222TCPClient
 * @description:
 * @date 2020/2/26   16:11
 */
public class ClientReader extends Thread {
    private Socket socket;
    public ClientReader(Socket socket){
        this.socket = socket;
    }
    public void run(){
        try {
            InputStream is = socket.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader reader = new BufferedReader(isr);
            for(;;){
                String value = reader.readLine();
                System.out.println(value);
            }
        } catch (IOException e) {
            System.out.println(\"对不起,服务器崩溃了\");
        }
    }
}
package tcp_client;

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

/**
 * @author 乔澳
 * @version 1.0
 * @title: ClientWriter
 * @projectName 20200222TCPClient
 * @description:
 * @date 2020/2/26   16:11
 */
public class ClientWriter extends Thread{
    private Socket socket;
    public ClientWriter(Socket socket){
        this.socket = socket;
    }
    public void run(){
        try {
            Scanner input = new Scanner(System.in);
            OutputStream os = socket.getOutputStream();
            PrintWriter pw = new PrintWriter(os);
            while(true) {
                System.out.println(\"说点什么吧:\");
                String msg = input.nextLine();
                pw.println(msg);
                pw.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
package tcp_client;

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

/**
 * @author 乔澳
 * @version 1.0
 * @title: QQFrame
 * @projectName 20200222TCPClient
 * @description:
 * @date 2020/2/28   9:46
 */
public class QQFrame extends JFrame{
    private String name;
    private JPanel panel = new JPanel();
    private JTextArea mesgArea = new JTextArea();
    private JScrollPane mesgPane = new JScrollPane(mesgArea);
    private JTextArea speakArea = new JTextArea();
    private JScrollPane speakPane = new JScrollPane(speakArea);
    private JButton sendBtn = new JButton(\"发送\");
    private JButton resetBtn = new JButton(\"取消\");
    private Socket socket;

    public QQFrame(String name){
        super(name);
        this.name = name;
        this.initOther();
        this.initElement();
        this.initSelf();
        this.connectServer();
        this.startReader();
        this.initListener();
    }
    private void connectServer(){
        System.out.println(\"===client start===\");
        try {
            socket = new Socket(\"127.0.0.1\",9999);
            PrintWriter pw = new PrintWriter(socket.getOutputStream());
            pw.println(name);
            pw.flush();
        } catch (IOException e) {
            JOptionPane.showMessageDialog(this,\"服务器连接失败\");
            //e.printStackTrace();
        }
    }
    private void startReader(){
        //启动\"读\"线程
        ClientReader reader = new ClientReader();
        reader.start();
    }
    private void initListener(){
        ActionListener listener = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    OutputStream os = socket.getOutputStream();
                    PrintWriter pw = new PrintWriter(os);
                    String msg = speakArea.getText();
                    if(msg.isEmpty())
                        return;
                    pw.println(msg);
                    pw.flush();
                    speakArea.setText(\"\");
                } catch (IOException ee) {
                    ee.printStackTrace();
                }
            }
        };

        sendBtn.addActionListener(listener);

        resetBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                speakArea.setText(\"\");
            }
        });
    }
    private void initOther(){
        panel.setLayout(null);
        mesgArea.setEditable(false);
        mesgPane.setBounds(10,10,305,220);
        speakPane.setBounds(10,240,305,140);
        sendBtn.setBounds(180,390,60,30);
        resetBtn.setBounds(260,390,60,30);
    }
    private void initElement(){
        panel.add(mesgPane);
        panel.add(speakPane);
        panel.add(sendBtn);
        panel.add(resetBtn);
        this.add(panel);
    }
    private void initSelf(){
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setBounds(1400,220,350,500);
        this.setVisible(true);
    }


    public static void main(String[] args) {
        new QQFrame(\"乔乔\");
        new QQFrame(\"小红\");
        new QQFrame(\"小明\");
    }


    //内部类
    public class ClientReader extends Thread {
        StringBuffer sb = new StringBuffer();
        public void run(){
            try {
                if(socket!=null) {
                    InputStream is = socket.getInputStream();
                    InputStreamReader isr = new InputStreamReader(is);
                    BufferedReader reader = new BufferedReader(isr);
                    for (; ; ) {
                        String value = reader.readLine();
                        sb.append(value + \"\\n\");
                        mesgArea.setText(sb.toString());
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

资源下载此资源下载价格为1小猪币,终身VIP免费,请先
由于本站资源来源于互联网,以研究交流为目的,所有仅供大家参考、学习,不存在任何商业目的与商业用途,如资源存在BUG以及其他任何问题,请自行解决,本站不提供技术服务! 由于资源为虚拟可复制性,下载后不予退积分和退款,谢谢您的支持!如遇到失效或错误的下载链接请联系客服QQ:442469558

:本文采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可, 转载请附上原文出处链接。
1、本站提供的源码不保证资源的完整性以及安全性,不附带任何技术服务!
2、本站提供的模板、软件工具等其他资源,均不包含技术服务,请大家谅解!
3、本站提供的资源仅供下载者参考学习,请勿用于任何商业用途,请24小时内删除!
4、如需商用,请购买正版,由于未及时购买正版发生的侵权行为,与本站无关。
5、本站部分资源存放于百度网盘或其他网盘中,请提前注册好百度网盘账号,下载安装百度网盘客户端或其他网盘客户端进行下载;
6、本站部分资源文件是经压缩后的,请下载后安装解压软件,推荐使用WinRAR和7-Zip解压软件。
7、如果本站提供的资源侵犯到了您的权益,请邮件联系: 442469558@qq.com 进行处理!

猪小侠源码-最新源码下载平台 Java教程 Java实现简单QQ聊天工具 http://www.20zxx.cn/705999/xuexijiaocheng/javajc.html

猪小侠源码,优质资源分享网

常见问题
  • 本站所有资源版权均属于原作者所有,均只能用于参考学习,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担
查看详情
  • 最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,建议提前注册好百度网盘账号,使用百度网盘客户端下载
查看详情

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务