Java 网络编程
文章平均质量分 63
总结Java中IO、NIO,TCP等相关的网络编程
ustbxyls
这个作者很懒,什么都没留下…
展开
-
Java 网络编程之TCP(二):基于BIO的聊天室
中,介绍Java中I/O和TCP的基本概念,本文在上文的基础上,实现一个基本的聊天室的功能。由于基于BIO,那么服务端都需要用两个线程,来分别进行收发消息。聊天客户端:发送消息给所有其他客户端,接收其他客户端的消息。要想实现上面的聊天室的功能,我们需要一个服务端,和客户端。服务端:接收客户端的消息,并转发给其他客户端。客户端:发送消息给服务端,接收服务端的消息。原创 2024-04-21 10:41:29 · 415 阅读 · 0 评论 -
Java 网络编程之TCP(五):分析服务端注册OP_WRITE写数据的各种场景(二)
2.注册OP_WRITE时:是使用key.interestOps(key.interestOps() + SelectionKey.OP_WRITE);在OP_WRITE事件来的时候,要把先把OP_WRITE事件去掉,key.interestOps(key.interestOps() & ~SelectionKey.OP_WRITE);3.注册OP_WRITE时,要写的数据,直接给到了原来channel对应的attachment里了;1.在注册OP_WRITE时,需要给所有其他客户端注册;原创 2024-04-24 17:25:31 · 236 阅读 · 1 评论 -
Java 网络编程之TCP(五):分析服务端注册OP_WRITE写数据的各种场景(三)
一个客户端的读事件,分配一个线程处理,但是线程还没处理完,下个读事件就来了,就又分配一个线程处理。前面的文章中,服务端都是在一个单线程main中,处理所有接收到的IO事件,为了提高效率,会自然的想到,为OP_READ和OP_WRITE事件分配多线程处理。解决方法:不可以并发读同一个client, 在处理一个Client的 OP_READ的时候先取消 OP_READ的注册,读完了后,在注册一个 OP_READ。从服务端日志中,可以看到,每个客户端的读事件,只有一个线程处理。再添加一个客户端2,发送数据。原创 2024-04-25 11:55:50 · 517 阅读 · 2 评论 -
Java NIO中的mmap
Java中的mmap,是通过MappedByteBuffer实现,是一种DirectBuffer,也就是说是操作系统直接管理的内存。原创 2024-04-16 17:21:38 · 289 阅读 · 1 评论 -
Java 网络编程之TCP(一):基于BIO
然后开启两个客户端,在idea中需要打开Run -> Edit Configurations,选择我们的Application, 然后在右侧点击【Modify options】,选择【Allow multiple instances】,即可开启多个相同的Application;本文,我们使用最简单的方式,一个线程处理一个客户端数据,线程不复用;需求如下:基于BIO实现一个简单的服务端接收客户端的数据的网络模型;既然服务端有阻塞,我们要想提高效率,得用多线程,一个负责处理一个客户端的业务数据;原创 2024-04-19 11:01:29 · 386 阅读 · 0 评论 -
Java 网络编程之TCP(五):分析服务端注册OP_WRITE写数据的各种场景(一)
二、注册OP_WRITE,在写状态满足情况下,通过java.nio.channels.SocketChannel#write(java.nio.ByteBuffer)方法写。服务端在有数据需要发送给客户端的情况下,直接使用客户端对应的SocketChannel写数据即可,不考虑数据是否可以正常发送。在前面的文章中,我们分析了在NIO模式下,服务端接收和读取多个客户端数据的情况;本文,我们看下NIO模式下,使用Selector如何把数据发送给客户端。我们可以基于聊天室的功能,把收到的数据直接写给其他客户端。原创 2024-04-24 15:33:04 · 476 阅读 · 0 评论 -
Java 网络编程之TCP(三):基于NIO实现服务端,BIO实现客户端
3.Selector:选择器,就是Linux 内核中的IO多路复用器,为了提高网络IO编程的效率,常用的有select, poll, epoll, 可以参考Linux对应系统调用。前面的文章,我们讲述了BIO的概念,以及编程模型,由于BIO中服务器端的一些阻塞的点,导致服务端对于每一个客户端连接,都要开辟一个线程来处理,导致资源浪费,效率低。先开启服务端,再开启两个客户端发送数据,服务端接受连接后,会打印当前接受到的客户端总数,然后轮询接收数据后打印;客户端:基于BIO,连接服务端,并发送数据。原创 2024-04-23 11:31:48 · 920 阅读 · 1 评论 -
Java 网络编程之TCP(四):基于NIO中的selector实现服务端,解决客户端异常断开导致服务端不断读取OP_READ问题
上一篇文章中,没有使用Selector,实习服务端的读取多个客户端的数据;本文先使用Selector实现读取多个客户单数据的功能,然后做些扩展。1.服务端:基于Selector处理客户端的连接事件:OP_READ,处理客户端的数据具备事件:OP_READ。2.客户端:和上一篇一样,基于BIO实现连接和发送数据。一、基于NIO Selector读取多个客户的数据。先启动服务端,再启动2个客户端,客户端发送数据。会导致一直有read事件,这个要看看为啥。客户端1,exit 关闭连接。原创 2024-04-23 20:40:30 · 610 阅读 · 0 评论 -
Java NIO Buffer概念
由于 DirectBuffer 和 MappedBuffer 背后的存储内存是在堆外内存中分配,不受 JVM 管理,所以不能用一个 Java 基本类型的数组表示,而是直接记录这段堆外内存的起始地址。DirectBuffer 背后的存储内存是在堆外内存中分配,MappedBuffer 是通过内存文件映射将文件中的内容直接映射到堆外内存中,其本质也是一个 DirectBuffer。HeapBuffer 顾名思义它背后的存储内存是在 JVM 堆中分配,在堆中分配一个数组用来存放 Buffer 中的数据。原创 2024-06-24 09:40:52 · 371 阅读 · 0 评论