Java基于TCP网络编程的群聊功能

服务端

java 复制代码
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

public class Server2 {
    public static List<Socket> onlineList = new ArrayList<>();


    public static void main(String[] args) throws  Exception{
        System.out.println("------------服务端启动--------------");
        //创建ServerSocket对象  为服务端注册端口
        ServerSocket socketServer =new ServerSocket(7777);
        while (true){
            //调用accept 方法等待客户端的链接请求
            Socket socket = socketServer.accept();
            onlineList.add(socket);
            System.out.println(socket.getRemoteSocketAddress()+"上线....");
            new ServerReaderThread(socket).start();
        }
    }
}

服务端的线程(用来处理客户端发来的数据)

java 复制代码
import java.io.*;
import java.net.Socket;

public class ServerReaderThread extends  Thread{
        private Socket socket;

        public ServerReaderThread(Socket socket){
                this.socket = socket;
        }
        @Override
        public void run(){
                try{
                        //使用数据输入流  读取 用户发过来的信息
                        //获取字节输入流
                        InputStream ipt = socket.getInputStream();
                        //把原始的字节输入流包装成数据输入流
                        DataInputStream dis =new DataInputStream(ipt);
                        while (true){
                             try{
                                     String rs = dis.readUTF();
                                     System.out.println(rs);
                                     //把这个消息分发给客户端
                                     sendMsgToAll(rs);
                                     System.out.println("------------------------");
                             }catch (Exception e){
                                     System.out.println(socket.getRemoteSocketAddress()+"下线...");
                                     dis.close();
                                     break;
                             }
                        }
                }catch (Exception e){
                        e.printStackTrace();
                }
        }


        private void sendMsgToAll(String msg) throws Exception {
                for (Socket socket1 : Server2.onlineList) {
                        OutputStream os =socket1.getOutputStream();
                        DataOutputStream dos = new DataOutputStream(os);
                        dos.writeUTF(msg);
                        dos.flush();
                }
        }
}

客户端

java 复制代码
import java.io.DataOutput;
import java.io.DataOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

public class Client2 {
    public static void main(String[] args) throws  Exception {
        //创建一个socket 对象  并同时请求与服务端程序的链接
        Socket socket = new Socket("127.0.0.1",7777);

        //创建一个独立的线程   来读取 服务端发给客户端的消息
        new ClientReaderThread(socket).start();

        //从socket管道中获取字节流 用来发数据给服务端
        OutputStream os = socket.getOutputStream();

        //把低级的字节输出流  换成数据输出流
        DataOutputStream dos =  new DataOutputStream(os);
        //开始写数据
        Scanner sc =new Scanner(System.in);
        while (true){
            System.out.println("user:");
            String msg =sc.nextLine();
            if("exit".equals(msg)){
                System.out.println("退出会话...");
                dos.close();
                //释放连接资源
                socket.close();
                break;
            }
            dos.writeUTF(msg);
            dos.flush();
        }
    }
}

客户端的线程(用于服务端推送的数据)

java 复制代码
import java.io.DataInputStream;
import java.io.InputStream;
import java.net.Socket;

public class ClientReaderThread extends Thread{
    private Socket socket;

    public ClientReaderThread(Socket socket){
        this.socket = socket;
    }
    @Override
    public void run (){
        try{
            //使用数据输入流  读取 用户发过来的信息
            //获取字节输入流
            InputStream ipt = socket.getInputStream();
            //把原始的字节输入流包装成数据输入流
            DataInputStream dis =new DataInputStream(ipt);
            while (true){
                try{
                    String rs = dis.readUTF();
                    System.out.println(rs);
                    System.out.println("------------------------");
                }catch (Exception e){
                    System.out.println(socket.getRemoteSocketAddress()+"下线...");
                    dis.close();
                    break;
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

效果

此篇基于:

Java网络编程---TCP-CSDN博客

Java网络编程TCP多线程实现服务端接受多个客户端的信息-CSDN博客

实现.....

相关推荐
草莓熊Lotso4 分钟前
《算法闯关指南:优选算法--二分查找》--19.x的平方根,20.搜索插入位置
java·开发语言·c++·算法
YJlio8 分钟前
Process Monitor 学习笔记(5.7):长时间运行追踪与日志文件体积的控制
java·笔记·学习
失散1311 分钟前
分布式专题——45 ElasticSearch基础数据管理详解
java·分布式·elasticsearch·架构
没有bug.的程序员11 分钟前
分布式监控体系:从指标采集到智能告警的完整之道
java·分布式·告警·监控体系·指标采集
明月与玄武19 分钟前
Linux 网络分析终极武器:Tcpdump 深度指南!
网络·php·tcpdump
_dindong20 分钟前
Linux网络编程:Socket编程预备
linux·运维·网络·学习
迎風吹頭髮23 分钟前
Linux服务器编程实践22-TCP头部选项解析:MSS、窗口扩大因子与SACK
服务器·网络·tcp/ip
_dindong28 分钟前
Linux网络编程:宏观网络体系
linux·网络·笔记·学习
想不明白的过度思考者28 分钟前
JavaEE初阶——TCP/IP协议栈:从原理到实战
java·网络·网络协议·tcp/ip·java-ee
好家伙VCC1 小时前
**发散创新:渗透测试方法的深度探索与实践**随着网络安全形势日益严峻,渗透测试作为评估系统安全的
java·python·安全·web安全·系统安全