微信群聊代码(实现了微信群聊)
首发

微信群聊代码(实现了微信群聊)

优质

文章目录[隐藏]

请用语音读文章

多人聊天室原理图

源码

工具类:

该类用于关闭各种流。

publicclassCloseUtil{
publicstaticvoidCloseAll(Closeable...closeable){
for(Closeablec:closeable){
if(c!=null){
try{
c.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
}
}

服务器:

服务器端创建一个serverSocket对象通过accept()方法监听是否有tcp连接。同时有一个储存socket对象的集合将连接进来的对象储存到List集合中。服务器将消息进行转发。

//服务器
publicclassServer{
//存储每一个连接进来的客户端
publicstaticList<MyChannel>list=newArrayList<>();

publicstaticvoidmain(String[]args)throwsException{
//创建ServerSocket对象
ServerSocketserverSocket=newServerSocket(9999);
while(true){
//连接进来的客户端
Socketclient=serverSocket.accept();
System.out.println(client.getInetAddress()+"进入聊天室");
MyChannelmyChannel=newMyChannel(client);
list.add(myChannel);
newThread(myChannel).start();
}
}
}

消息转发类:

具体的消息转发实现类。将信息发给除发送消息以外的其他客户端。

//用于信息转发
publicclassMyChannelimplementsRunnable{
privateDataInputStreamdis;
privateDataOutputStreamdos;
privatebooleanflag=true;

publicMyChannel(Socketsocket){
try{
dis=newDataInputStream(socket.getInputStream());
dos=newDataOutputStream(socket.getOutputStream());
}catch(IOExceptione){
flag=false;
CloseUtil.CloseAll(dis,dos);
}
}
//接收数据的方法
privateStringreceive(){
Stringstr="";
try{
str=dis.readUTF();
}catch(IOExceptione){
flag=false;
CloseUtil.CloseAll(dis,dos);
Server.list.remove(this);
}
returnstr;
}
//发送数据的方法
privatevoidsend(Stringstr){
try{
if(str!=null&&str.length()!=0){
dos.writeUTF(str);
dos.flush();
}
}catch(Exceptionexception){
flag=false;
CloseUtil.CloseAll(dos,dis);
Server.list.remove(this);
}
}
//转发消息的方法
privatevoidsendToOther(){
Stringstr=this.receive();
List<MyChannel>list=Server.list;
for(MyChannelother:list){
if(other==list){
continue;//不发送信息给自己
}
//将消息发送给其他客户端
other.send(str);
}
}

@Override
publicvoidrun(){
while(flag){
sendToOther();
}
}
}

发送信息类:
用于从键盘上获取数据然后将数据发送出去

publicclassSendimplementsRunnable{
//从键盘上获取数据
privateBufferedReaderbr;
privateDataOutputStreamdos;
privatebooleanflag=true;

publicSend(){
br=newBufferedReader(newInputStreamReader(System.in));
}
publicSend(Socketsocket){
this();
try{
dos=newDataOutputStream(socket.getOutputStream());
}catch(Exceptione){
flag=false;
CloseUtil.CloseAll(dos,socket);
e.printStackTrace();
}
}


privateStringgetMessage(){
Stringstr="";
try{
str=br.readLine();
}catch(IOExceptione){
flag=false;
CloseUtil.CloseAll(br);
}
returnstr;
}
privatevoidsend(Stringstr){
try{
dos.writeUTF(str);
dos.flush();
}catch(IOExceptione){
flag=false;
CloseUtil.CloseAll(dos);
e.printStackTrace();
}

}

@Override
publicvoidrun(){
while(flag){
this.send(getMessage());
}
}
}

信息接收类:

publicclassReceiveimplementsRunnable{
//接受数据流
privateDataInputStreamdis;
privatebooleanflag=true;


publicReceive(Socketsocket){
try{
dis=newDataInputStream(socket.getInputStream());
}catch(Exceptione){
flag=false;
CloseUtil.CloseAll(dis,socket);
}
}
privateStringgetMessage(){
Stringstr="";
try{
str=dis.readUTF();
}catch(IOExceptione){
flag=false;
CloseUtil.CloseAll(dis);
e.printStackTrace();
}
returnstr;
}
@Override
publicvoidrun(){
while(flag){
System.out.println(this.getMessage());
}
}
}

客户端:

publicclassclient{
publicstaticvoidmain(String[]args)throwsException{
Socketsocket=newSocket(InetAddress.getLocalHost(),9999);
Sendsend=newSend(socket);
Receivereceive=newReceive(socket);
newThread(send).start();
newThread(receive).start();
}
}

先将服务器启动然后启动客户端:测试结果如下

有喜欢的小伙伴可以自己拿去玩。代码复制直接有效。

以上就是由优质生活领域创作者 生活常识网 整理编辑的,如果觉得有帮助欢迎收藏转发~

相关推荐

搜索引擎有哪些(个专用搜索引擎)

请用语音读文章大家都知道。做学霸君这一行。经常要用到搜索各种各样的资料。所以学霸君[...

魔兽世界占星者声望任务接取位置(占星者声望任务接取位置介绍)

请用语音读文章魔兽世界占星者声望任务在哪接?下面趣玩号小编就为各位弄来魔兽世界占星[...

学生个人目标怎么写(小学生学习目标怎么写)

请用语音读文章一次演讲结束后。一个女孩子找到我。愁眉苦脸地跟我说:“王老师。我还有[...

dnf固伤职业堆力量还是独立(DNF固伤职业堆力量还是独立)

请用语音读文章按照现在版本毕业装备来说。应该是大于2400算是合格的。这个是我自[&...

发表评论

您的电子邮箱地址不会被公开。