Java实现简单QQ聊天工具

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

所使用到的知识点:

  • java socket编程之TCP协议
  • java Swing
  • 简单的java多线程

运行截图:

服务器端实现:

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();
            }
        }
    }
}

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

(0)

相关推荐

  • JavaGUI模仿QQ聊天功能完整版

    本文实例为大家分享了JavaGUI模仿QQ聊天功能完整代码,供大家参考,具体内容如下 ClientForm代码: package GUISocket.chat.Client; import javax.swing.JFrame; import javax.swing.JPanel; import java.awt.EventQueue; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JTextFie

  • Java socket通信模拟QQ实现多人聊天室

    目录 一.socket通信基本原理 二.用socket制作一个多人聊天室 三.实现效果 四.总结 一.socket通信基本原理 socket 通信是基于TCP/IP ⽹络层上的⼀种传送⽅式,我们通常把TCP和UDP称为传输层. ​ 如上图,在七个层级关系中,我们讲的socket属于传输层,其中UDP是⼀种⾯向⽆连接的传输层协议.UDP不关⼼对端是否真正收到了传送过去的数据.如果需要检查对端是否收到分组数据包,或者对端是否连接到⽹络,则需要在应⽤程序中实现.UDP常⽤在分组数据较少或多播.⼴播通信

  • Java基于Swing和netty实现仿QQ界面聊天小项目

    目录 1.前言 2.功能实现 3.模块划分 4.使用的知识 5.部分代码实现 1.nettyController.java 2.ClientHandler.java 3.linkmen.java 4.tipFrame 6.运行例图 1.前言 先说一下这个小项目也算是我在大学做的第一个应该算的上是的项目的项目,前前后后用了20天左右吧.先是用swing写好了仿QQ界面(界面很丑)最后逻辑实现都是后面断断续续加进去的.写这个项目之前没有很好的规划在逻辑实现方面与数据库逻辑交互过于频繁.走了很多的弯路

  • Java模拟QQ实现聊天互动程序

    目录 介绍 功能演示 运用到的知识点 核心代码 服务端 客户端 介绍 实现的功能.步骤: 1.定义JFrame窗体中的组件 2.在构造方法中初始化窗体的组件 3.使用网络编程完成数据的传输(TCP,UDP协议) 4.实现发送按钮的监听点击事件 5.实现回车键发送数据 功能演示 没有点发送,数据却发送出去了是因为按了回车键 运用到的知识点 GUI:java实现窗体.Swing.其实JAVA Swing的GUI目前企业中已经不用了,主要是一些学校和培训机构用来教导学生写一些游戏.小项目,练练手的.

  • java仿QQ微信聊天室功能的实现

    话不多说,先上图                                   即时通信系统:可以完成群聊.私人聊天,实时发送和显示聊天信息,完成好友列表,进一步可以带表情,附件发送,聊天信息的传送,等 系统的主要技术socket通信技术,多线程技术,数据库技术. 本系统实现的功能有:1.用户名字登录 2.用户之间的群聊和查看群聊记录3.用户之间的私聊和私聊记录4.动态刷新并显示好友列表5.显示在线人数 6.服务器可以显示用户在线状态 7.能够退出处理. 该程序可以实现局域网的聊天,只要把

  • Java实现简单QQ聊天工具

    Java实现简单的类似QQ聊天工具,供大家参考,具体内容如下 所使用到的知识点: java socket编程之TCP协议 java Swing 简单的java多线程 运行截图: 服务器端实现: package tcp_server; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.

  • java实现简单QQ登录界面

    本文实例为大家分享了java实现简单QQ登录界面的具体代码,供大家参考,具体内容如下 java在图形界面,不是太强项,但不是不可以做,它的开源是very nice! 实现代码如下(想实现完美的界面,可能要更多coding的支持): package com.ts.x.swing; import java.awt.Color; import java.awt.Container; import java.awt.Cursor; import java.awt.Font; import java.aw

  • jQuery实现简单QQ聊天框

    本文实例为大家分享了jQuery实现简单QQ聊天框的具体代码,供大家参考,具体内容如下 先放一张效果图! 1.首先我们把基本框架搭出来,还要准备三张图片用来当作头像,下面是html的内容 <body> <section id="chat"> <div class="chatBody"></div> <div> <img src="images/icon.jpg"> </

  • java UDP实现一个聊天工具的示例代码

    题目: 假设Tom和Jerry利用Java UDP进行聊天,请为他们编写程序.具体如下: (1).Tom和Jerry聊天的双方都应该具有发送端和接收端: (2).利用DatagramSocket与DatagramPacket: (3).实现 java.lang.Runnable类,重写 run()方法. 学过计网的都知道,利用三元组(ip地址,协议,端口)就可以标识网络的进程了. 而进行通信我们直接运用socket就可以了,首先需要知道是socket是什么,这部分可以参考这个大佬写的博客. ht

  • Java实现简单局域网聊天室

    本文实例为大家分享了Java实现简单局域网聊天室的具体代码,供大家参考,具体内容如下 Java 的Socket编程: 1.TCP协议是面向连接的.可靠的.有序的.以字节流的方式发送数据,通过三次握手方式建立连接,形成传输数据的通道,在连接中进行大量数据的传输,效率会稍低 2.Java中基于TCP协议实现网络通信的类 客户端的Socket类 服务器端的ServerSocket类 3.Socket通信的步骤 ① 创建ServerSocket和Socket ② 打开连接到Socket的输入/输出流 ③

  • java实现多人聊天工具(socket+多线程)

    大一下学期的java期末课程设计:java实现多人聊天工具,分享一下 课设要求 多人聊天工具 服务器要求1:能够看到所有在线用户(25%) 服务器要求2:能够强制用户下线(25%) 客户端要求1:能够看到所有在线用户(25%) 客户端要求2:能够向某个用户发送消息(25%) 相关知识点 1.服务端能够看到所有在线用户 服务端继承了JFrame,实现可视化,通过socket实现服务端与客户端的连接,服务端每接收一个连接,把传进来的用户名和对应的socket连接封装成一个User对象,把User对象

  • Java实现简单的聊天室功能

    本文实例为大家分享了Java实现简单聊天室功能的具体代码,供大家参考,具体内容如下 一.客户端的创建 1.我们可以用Socket来创建客户端 /**   *@类名 Client   *@描述 TODO 客户端 1   *@版本 1.0   *@创建人 XuKang   *@创建时间 2020/9/24 16:18   **/ public class Client {     public static void main(String[] args) throws UnknownHostExc

  • java实现简单TCP聊天程序

    本文实例为大家分享了java实现TCP聊天程序的具体代码,供大家参考,具体内容如下 服务端代码: package com.test.server; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class Server { public

  • SpringBoot + Vue + Electron 开发 QQ 版聊天工具的详细教程

    一.简介 这是一款基于 JS 实现的超轻量级桌面版聊天软件.主要适用于私有云项目内部聊天,企业内部管理通讯等功能,主要通讯协议websocket.也支持web网页聊天实现.文字聊天,互传文件,离线消息,群聊,断线重连等功能. 先看一下效果,下图左边是web版,右边为PC版. 二.本地搭建 2.1 技术栈 后端技术栈: springboot: 让开发人员快速开发的一款Java的微服务框架. tio: 是百万级网络框架oauth2.0: OAuth 2.0 是一个行业的标准授权协议. OAuth 2

  • java Socket简易聊天工具

    本文实例为大家分享了一款Socket简易聊天工具,希望大家喜欢. 代码运行如图,看起来还不错 服务端 package qiu; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.print.Printable; import java.io.BufferedReader; import java.io.IOEx

随机推荐