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(); } } } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。