java网络编程之群聊功能

本文实例为大家分享了java网络编程之群聊功能的具体代码,供大家参考,具体内容如下

1、服务端

package networkCoding;
 
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.CopyOnWriteArrayList;
 
/**
 * 
 * 1, 指定端口,使用serverSocket创建服务器
 * 2, 阻塞式等待连接accept
 * 3, 操作:输入输出流操作
 * 4, 释放资源
 * 
 * 5,加入容器实现群聊
 * 
 * **/
 
public class WeiHuShanChatRoomServer {
    private static CopyOnWriteArrayList<Chat> all= new CopyOnWriteArrayList<Chat>();
 
    public static void main(String[] args) throws IOException {
        System.out.println("-----server");
         // 1, 指定端口,使用serverSocket创建服务器
        ServerSocket server= new ServerSocket(9999);
         // 2, 阻塞式等待连接accept
        while(true) {
        Socket client=server.accept();
        Chat chat= new Chat(client);
        // 交给容器管理
        all.add(chat);
        new Thread(chat) .start();
        }
    }
    static class Chat implements Runnable{
        private DataOutputStream dos;
        private DataInputStream dis;
        private Socket client;
        private boolean isRuning;
        private String name;
        public Chat(Socket client) {
            this.client=client;
            this.isRuning=true;
            try {
                this.dis = new DataInputStream(client.getInputStream());
                this.dos=new DataOutputStream(client.getOutputStream());
                this.name=receive();
                this.send(this.name+",威虎山欢迎你的到来");
                this.sendOthers(this.name+"来到了威虎山",true);
            } catch (IOException e) {
                // 出错释放资源
                System.out.println("===1==");
                this.release();
            
            }
        }
        private String receive() {
            String data="";
            try {
                data= dis.readUTF();
            } catch (IOException e) {
                System.out.println("===2==");
                //this.release();
                
            }
            return data;
        }
        // 群聊
        private void send(String data) {
            try {
                dos.writeUTF(data);
                dos.flush();
            } catch (IOException e) {
                System.out.println("===3==");
                this.release();
                
            }
        }
        private void sendOthers(String data,boolean isSys) {
            boolean isPrivate = data.startsWith("@"); 
            if(isPrivate) {
                int index= data.indexOf(":");
                String targetName=data.substring(1,index);
                String msg=data.substring(index+1);
                for (Chat chat : all) {
                    if(chat.name.equals(targetName)) {
                        System.out.println("******"+chat.name+targetName);
                        chat.send(this.name+"悄悄对你说:"+msg);
                    }
                }
                
            }else {
                for (Chat chat : all) {
                    if(chat==this) {
                        continue;
                    }else {
                        if(isSys) {
                            chat.send(data);
                        }else {
                            chat.send(this.name+"对大家说:"+data);
                        }
                    }
                    
                }
            }
            
        }
        private void release() {
            this.isRuning=false;
            Utils.close(dis,dos,client);
            all.remove(this);
            sendOthers(this.name+"离开了威虎山", true);
        }
        @Override
        public void run() {
            while(isRuning) {
                String data = receive();
                if(!data.equals("")) {
                     sendOthers(data,false);
                }else {
                    send("不能发送空消息");
                }
                
            }
            
        }
    }
 
}

2、客户端

package networkCoding;
 
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;
 
/**
 * 
 * 1, 建立连接,使用socket 创建客户端 + 服务端的地址端口号;
 * 2, 操作:输入输出流操作
 * 3, 释放资源
 * 
 * **/
 
public class WeiHuShanChatRoomClient {
 
    public static void main(String[] args) throws UnknownHostException, IOException {
        BufferedReader bf= new BufferedReader(new InputStreamReader(System.in));
        System.out.println("请输入姓名");
        String bfString = bf.readLine();
        //1, 建立连接,使用socket 创建客户端 + 服务端的地址端口号;
        Socket client = new Socket("localhost",9999);
        // 2, 操作:输入输出流操作
        new Thread(new Send(client,bfString)).start();
        new Thread(new Receive(client)).start();
        
    }
    
 
}

(1)发送封装类

package networkCoding;
 
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
 
public class Send implements  Runnable{
    private BufferedReader bf;
    private DataOutputStream dos;
    private Socket client;
    private boolean isRuning;
    private String name;
    public Send(Socket client,String name) {
        this.client=client;
        this.isRuning=true;
        this.name=name;
        this.bf= new BufferedReader(new InputStreamReader(System.in));
        try {
            this.dos=new DataOutputStream(client.getOutputStream());
            this.send(name);
        } catch (IOException e) {
            // 出错释放资源
            System.out.println("===4==");
            this.release();
            this.isRuning=false;
        }
    }
    private void release() {
        this.isRuning=false;
        Utils.close(dos,client);
    }
    private void send(String data) {
        try {
            dos.writeUTF(data);
            dos.flush();
        } catch (IOException e) {
            System.out.println("===5==");
            this.release();
            
        }
    }
    private String getString() {
        String dataString ="";
        try {
            dataString = this.bf.readLine();
        } catch (IOException e) {
            System.out.println("===6==");
            this.release();
        }
        return dataString;
    }
    
    @Override
    public void run() {
        // TODO Auto-generated method stub
        while(isRuning) {
            String data = getString();
            if(!data.equals("")) {
                send(data);
            }else {
                //send("不能发送空消息");
            }
            
        }
    }
 
}

(2)接收封装类

package networkCoding;
 
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
 
public class Receive implements Runnable {
    private DataInputStream dis;
    private Socket client;
    private boolean isRuning;
    public Receive(Socket client) {
        this.client=client;
        this.isRuning=true;
        try {
            this.dis = new DataInputStream(client.getInputStream());
        } catch (IOException e) {
            // 出错释放资源
            System.out.println("===6==");
            this.release();
            this.isRuning=false;
        }
    }
    private String receive() {
        String data="";
        try {
            data= dis.readUTF();
        } catch (IOException e) {
            System.out.println("===7==");
            this.release();
        }
        return data;
    }
    private void release() {
        this.isRuning=false;
        Utils.close(dis,client);
    }
    @Override
    public void run() {
        while(isRuning) {
            String data = receive();
            if(!data.equals("")) {
                System.out.println(data);
            }else {
                
            }
            
        }
        
    }
 
    
 
}

3、工具类

package networkCoding;
 
import java.io.Closeable;
import java.io.IOException;
 
public class Utils {
    public static void main(String[] args) {
        
    }
    public static void close(Closeable...target) {
        for (Closeable obj : target) {
            try {
                if(null!=obj) {
                    obj.close();
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

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

(0)

相关推荐

  • java基于NIO实现群聊模式

    本文实例为大家分享了java基于NIO实现群聊模式的具体代码,供大家参考,具体内容如下 Client package com.qst.chat; import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.

  • java实现小型局域网群聊功能(C/S模式)

    本文实例为大家分享了java群聊功能,供大家参考,具体内容如下 Java 对TCP协议的支持: --> java.net包中定义了两个类ServerSocket 和Socket ,分别用来实现双向连接的server 端和client 端.  --> Client 类定义客户端 package com.dragon.java.tcpchat; import java.io.IOException; import java.net.Socket; import java.net.UnknownHo

  • Java NIO实现群聊系统

    本文实例为大家分享了Java NIO实现群聊系统的具体代码,供大家参考,具体内容如下 前面的文章介绍了NIO的三大核心组件并编写了BIO的一个demo实例,本文使用NIO写一个小应用实例,巩固并加深对NIO的理解. 实例要求: 1)编写一个 NIO 群聊系统,实现服务器端和客户端之间的数据简单通讯(非阻塞) 2)实现多人群聊 3)服务器端:可以监测用户上线,离线,并实现消息转发功能 4)客户端:通过channel 可以无阻塞发送消息给其它所有用户,同时可以接受其它用户发送的消息(有服务器转发得到

  • Java编程使用UDP建立群聊系统代码实例

    相关java类介绍 DatagramSocket public class DatagramSocket extends Object 此类表示用来发送和接收数据报包的套接字. 数据报套接字是包投递服务的发送或接收点.每个在数据报套接字上发送或接收的包都是单独编址和路由的.从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达. 在DatagramSocket上总是启用UDP广播发送.为了接收广播包,应该将DatagramSocket绑定到通配符地址,在某些实现中,将Dat

  • java Socket实现多人群聊与私聊功能

    本文实例为大家分享了java Socket实现多人群聊与私聊的具体代码,供大家参考,具体内容如下 关于Socket套接字的一些基本知识与认识可以参见上一篇或自行查阅. ServerSocket和Socket实现群聊与私聊涉及到多线程编程,实现过程的重点是利用Socket通信的原理,即不断的在服务端和客户端创建输入输出流来相互传递.交换数据等以达到通信的目的.具体实现如下: 服务端: import java.io.*; import java.net.*; import java.util.Has

  • Java基于NIO实现群聊功能

    本文实例为大家分享了Java基于NIO实现群聊功能的具体代码,供大家参考,具体内容如下 一.群聊服务器 package com.dashu.netty.group_chat; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.*; import java.nio.charset.StandardCharsets; import java.util.Iterator; pu

  • Java基于NIO实现群聊系统

    本文实例为大家分享了Java基于NIO实现群聊系统的具体代码,供大家参考,具体内容如下 实例要求: 1.编写一个 NIO 群聊系统,实现服务器端和客户端之间的数据简单通讯(非阻塞) 2.实现多人群聊 3.服务器端:可以监测用户上线,离线,并实现消息转发功能 4.客户端:通过 Channel 可以无阻塞发送消息给其它所有用户,同时可以接受其它用户发送的消息(有服务器转发得到) 5.目的:进一步理解 NIO 非阻塞网络编程机制 6.示意图分析和代码 // 服务端: package com.atgui

  • Java实现NIO聊天室的示例代码(群聊+私聊)

    功能介绍 功能:群聊+私发+上线提醒+下线提醒+查询在线用户 文件 Utils 需要用maven导入下面两个包 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.18</version> </dependency> <dependency> <group

  • java网络编程之群聊功能

    本文实例为大家分享了java网络编程之群聊功能的具体代码,供大家参考,具体内容如下 1.服务端 package networkCoding;   import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.concurrent.Co

  • Java网络编程TCP实现聊天功能

    网络编程TCP实现聊天的前提还需要掌握IO流,话不多说,直接上代码! 客户端: package com.kuang.lesson02; import java.io.IOException; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket; //客户端 public class TcpClientDemo01 { public static void main(String[] ar

  • Java网络编程TCP实现文件上传功能

    本文实例为大家分享了Java网络编程TCP实现文件上传的具体代码,供大家参考,具体内容如下 上一篇博客,用网络编程TCP 实现聊天,这次实现文件上传. 客户端: package com.kuang.lesson02; import java.io.*; import java.net.InetAddress; import java.net.Socket; //客户端 public class TcpClientDemo2 { public static void main(String[] a

  • Java使用MulticastSocket实现群聊应用程序

    本文实例为大家分享了Java使用MulticastSocket实现群聊应用程序的具体代码,供大家参考,具体内容如下 在这篇文章中,讨论了一个使用 MulticastSocket (Java Platform SE 7) 类的群聊应用程序.MulticastSocket 是一个 (UDP) DatagramSocket,具有加入 Internet 上其他多播主机“组”的附加功能. import java.net.*; import java.io.*; import java.util.*;  

  • Java网络编程之简单的服务端客户端应用实例

    本文实例讲述了Java网络编程之简单的服务端客户端应用.分享给大家供大家参考.具体如下: 在Java中,我们使用java.net.Socket及其相关类来完成有关网络的相关功能.Socket类非常简单易用,因为Java技术隐藏了建立网络连接和通过连接发送数据的复杂过程.下面所说的内容只适用于TCP协议. 一.连接到服务器 我们可以使用Socket类的构造函数来打开一个套接字,如 Socket sk = new Socket("210.0.235.14",13); 其中,210.0.23

  • Java网络编程实现的简单端口扫描器示例

    本文实例讲述了Java网络编程实现的简单端口扫描器.分享给大家供大家参考,具体如下: 在计算机网络的学习中,不由得觉得这门课的零碎知识点异常之多,同时因为学习的课本是老外的教材--自顶向下方法,因此学习起来不免觉得吃力,但是从老外的教材里更能从一定高度理解计算机网络的知识体系,也是乐在其中,同时做英语的习题感觉也很有趣味,从各方面来说可以说是获益良多,认识了很多专业词汇.节课之后,便想做一个简单的端口扫描器,用的语言是java,因为实现界面很简单,同时也有封装好的Socket类可以使用,主要思路

  • Vue通过配置WebSocket并实现群聊功能

    原文链接:https://juejin.im/post/5e08d53a6fb9a0162b7f4bad 写JQuery项目时,使用websocket很简单,不用去考虑模块化,组件之间的访问问题,面向文档编程即可,在Vue项目中使用时,远远没有想象中的那么简单,需要考虑很多场景,本篇文章将与各位开发者分享下 vue-native-websocket 库的使用以及配置,用其实现群聊功能.先看下最终实现的效果 安装依赖 本文中对于 vue-native-websocket 库的讲解,项目中配置了vu

随机推荐