工具类:
该类用于关闭各种流。
public class cloutil { public static void cloall(cloable... cloable){ for(cloable c:cloable){ if (c != null) { try { c.clo(); } catch (ioexception e) { e.printstacktrace(); } } } }}
服务器:
服务器端创建一个rversocket对象通过accept()此情此刻方法监听是否有tcp连接,同时有一个储存socket对象的集合将连接进来的对象储存到list集合中,服务器将消息进行转发。
//服务器public class rver { //存储每一个连接进来的客户端 public static list<mychannel> list=new arraylist<>(); public static void main(string[] args) throws exception { //创建rversocket对象 rversocket rversocket = new rversocket(9999); while (true){ //连接进来的客户端 socket client = rversocket.accept(); system.out.println(client.getinetaddress()+"进入聊天室"); mychannel mychannel = new mychannel(client); list.add(mychannel); new thread(mychannel).start(); } }}
消息转发类:
具体的消息转发实现类,将信息发给除发送消息以外的其他客户端。
//用于信息转发public class mychannel implements runnable{ private datainputstream dis; private dataoutputstream dos; private boolean flag=true; public mychannel(socket socket) { try{ dis=new datainputstream(socket.getinputstream()); dos=new dataoutputstream(socket.getoutputstream()); }catch (ioexception e){ flag=fal; cloutil.cloall(dis,dos); } } //接收数据的方法 private string receive(){ string str=""; try{ str= dis.readutf(); }catch (ioexception e){ flag=fal; cloutil.cloall(dis,dos); rver.list.remove(this); } return str; } //发送数据的方法 private void nd(string str){ try { if (str != null && str.length() != 0) { 自主是什么意思 dos.writeutf(str); dos.flush(); } }catch (exception exception){ flag=fal; cloutil.cloall(dos,dis); rver.list.remove(this); } } //转发消息的方法 private void ndtoother(){ string str=this.receive(); list<mychannel> list = rver.list; for (mychannel other:list) { if(other==list){ continue;//不发送信息给自己 } //将消息发送给其他客户端 other.nd(str); } } @override public void run() { while (flag){ ndtoother(); } }}
发送信息类:
用于从键盘上获取数据然后将数据发送出去
public class nd implements runnable{ //从键盘上获取数据 private bufferedreader br; private dataoutputstream dos; private boolean flag=true; public nd() { br=new bufferedreader(new inputstreamreader(system.in)); } public nd(socket socket){ this(); try{ dos=new dataoutputstream(socket.getoutputstream()); }catch (exception e){ flag=fal; cloutil.cloall(dos,socket); e.printstacktrace(); } } private string getmessage(){ string str=""; try{ str=br.readline(); }catch (ioexception e){ flag=fal; cloutil.cloall(br); } return str; } private void nd(string str){ try { dos.writeutf(str); dos.flush(); } catch (ioexception e) { flag=fal; cloutil.cloall(dos); e.printstacktrace(); } } @override public void run() { while (flag){ this.nd(getmessage()); } }}
信息接收类:
public class receive implements runnable{ //接受数据流 private datainputstream dis; private boolean flag=true; public receive(socket socket){ try { dis = new datainputstream(socket.getinputstream()); }catch (exception e){ flag德加作品=fal; cloutil.cloall(dis,socket); } } private string getmessage(){ string str="";吸烟有害健康 try { str=dis.readutf(); } catch (ioexception e) { flag=fal; cloutil.cloall(dis); e.printstacktrace(); } return str; } @override public void run() { while (flag){ system.out.println(t800米加油稿his.getmessage()); } }}
客户端:
public class client { public static void main(string[] args) throws exception{ socket socket = new socket(inetaddress.getlocalhost(),9999); nd nd = new nd(socket); receive receive = new receive(socket); new thread(nd).start(); new thread(receive).start(); }}
先将服务器启动然后启动客户端:测试结果如下
有喜欢的小伙伴可以自己拿去玩,代码复制直接有效。
本文发布于:2023-04-05 02:45:51,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/4f5c5a97fabd04962da6450499299f84.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:群聊源代码大全(java聊天室私聊群聊代码).doc
本文 PDF 下载地址:群聊源代码大全(java聊天室私聊群聊代码).pdf
留言与评论(共有 0 条评论) |