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

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

优质

文章目录[隐藏]

请用语音读文章

多人聊天室原理图

源码

工具类:

该类用于关闭各种流。

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

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

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

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

分享到 :
相关推荐

离婚证2寸照片底色要求(办离婚证照片要什么底色)

请用语音读文章结婚的时候,两人要领取结婚证。上面会贴两人的合照。而在离婚的时候[&h...

塞尔达四神兽顺序(难易度顺序是)

请用语音读文章《塞尔达传说:荒野之息》中没有历代传统的神殿级大型迷宫。取而代之的是[...

潘甜甜七夕牛郎织女(七夕潘甜甜牛郎织女在线播放)

请用语音读文章8月1日。一场大雨突袭南京。此时被疫情笼罩的南京。全城上下正在进行着[...

财务管理软件都有哪些(还有哪些其它财务软件)

请用语音读文章企业在经营的过程中肯定是不可以忽视财务方面的管理。这也是有着严格的规[...

发表评论

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