Java实现简单QQ聊天工具

2022-10-07,,,

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

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

《Java实现简单QQ聊天工具.doc》

下载本文的Word格式文档,以方便收藏与打印。