当前位置: 首页 > news >正文

TCP协议的多线程应用、多线程下的网络编程

DAY13.2 Java核心基础

多线程下的网络编程

基于单点连接的方式,一个服务端对应一个客户端,实际运行环境中是一个服务端需要对应多个客户端

创建ServerSocketNable类,多线程接收socket对象

public class ServerSocketNable implements Runnable {
    private Socket socket;

    public ServerSocketNable(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        //接收消息
        InputStream inputStream = null;
        DataInputStream dataInputStream = null;
        try {
            inputStream = socket.getInputStream();
            dataInputStream = new DataInputStream(inputStream);
            String s = dataInputStream.readUTF();
            System.out.println(Thread.currentThread().getName() + "服务器接收到的消息:" + s);

        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                inputStream.close();
                dataInputStream.close();
                socket.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

创建ClientNable对象,实现给服务器发消息的任务

public class ClientNable implements Runnable {
    private Integer num;

    public ClientNable(Integer num) {
        this.num = num;
    }

    @Override
    public void run() {
        // 创建一个Socket对象,需要指定服务器的IP地址和端口号
        OutputStream outputStream = null;
        DataOutputStream dataOutputStream = null;
        Socket socket = null;
        try {
            socket = new Socket("127.0.0.1", 8080);
            outputStream = socket.getOutputStream();
            dataOutputStream = new DataOutputStream(outputStream);
            dataOutputStream.writeUTF("你好,我是客户端:" + num);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                outputStream.close();
                dataOutputStream.close();
                socket.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

服务器启动

public static void main(String[] args) {
    Socket socket = null;
    try {
        ServerSocket serverSocket = new ServerSocket(8080);
        while (true) {
            socket = serverSocket.accept();
            ServerSocketNable serverSocketNable = new ServerSocketNable(socket);
            Thread thread = new Thread(serverSocketNable);
            thread.start();
        }
    } catch (IOException e) {
        throw new RuntimeException(e);
    } finally {
        try {
            socket.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

客户端启动

public static void main(String[] args) {
    for (int i = 0; i < 100; i++) {
        Thread thread = new Thread(new ClientNable(i));
        thread.start();
    }
}

这样就实现了多线程收发的功能,效率更高,开发中使用更加常见

部分代码输出:

可以看见不是顺序执行的

image-20250318233326607

相关文章:

  • 数字孪生的建模师blender和maya你更喜欢用哪个?
  • 【图像处理基石】什么是动态范围?
  • 数据结构入门(1)——算法复杂度
  • 【Linux】Bash是什么?怎么使用?
  • 【力扣刷题实战】最大连续1的个数 III
  • QQ村旅游网站的设计基于SSM项目的【QQ村旅游网站的设计】
  • 若依分离版整合多数据源——Phoenix+HBase
  • 【初始C语言】转义字符
  • 图数据库Neo4j和JDK安装与配置教程(超详细)
  • 【C#高级编程】—表达式树详解
  • 深入理解Linux文件系统:从磁盘结构到inode与挂载
  • 【GPT入门】第25课 掌握 LangChain:链式调用的奥秘、特性与使用示例
  • javaEE————文件IO(1)
  • 供应链攻击:企业防护的最薄弱环节
  • pwn刷题记录
  • Logback 日志滚动策略配置指南:从基础到进阶
  • 计算机网络原理
  • 联邦学习(Federated Learning)
  • 流式语音识别概述-paddlespeech
  • 手撕算法 ——前缀和
  • 荣盛发展:新增未支付债务11.05亿元
  • 浙江演艺集团7部作品组团来沪,今夏开启首届上海演出季
  • 九江宜春领导干部任前公示,3人拟提名为县(市、区)长候选人
  • 中国青年报:为见义勇为者安排补考,体现了教育的本质目标
  • 以军向也门3个港口的居民发布撤离令
  • 中美大幅下调超100%关税,印巴四日“战争”复盘|907编辑部