海康面试一般有几轮hr,Netty之JavaNIO编程模型介绍02,Java未来路在何方

listenChannel = ServerSocketChannel.open();

//绑定端口

listenChannel.socket().bind(new InetSocketAddress(PORT));

//设置非阻塞模式

listenChannel.configureBlocking(false);

//将该listenChannel 注册到selector

listenChannel.register(selector, SelectionKey.OP_ACCEPT);

}catch (IOException e) {

e.printStackTrace();

}

}

//监听

public void listen() {

System.out.println("监听线程: " + Thread.currentThread().getName());

try {

//循环处理

while (true) {

int count = selector.select();

if(count > 0) {//有事件处理

//遍历得到selectionKey 集合

Iterator iterator = selector.selectedKeys().iterator();

while (iterator.hasNext()) {

//取出selectionkey

SelectionKey key = iterator.next();

//监听到accept

if(key.isAcceptable()) {

SocketChannel sc = listenChannel.accept();

sc.configureBlocking(false);

//将该 sc 注册到seletor

sc.register(selector, SelectionKey.OP_READ);

//提示

System.out.println(sc.getRemoteAddress() + " 上线 ");

}

if(key.isReadable()) { //通道发送read事件,即通道是可读的状态

//处理读 (专门写方法…)

readData(key);

}

//当前的key 删除,防止重复处理

iterator.remove();

}

} else {

System.out.println(“等待…”);

}

}

}catch (Exception e) {

e.printStackTrace();

}finally {

//发生异常处理…

}

}

//读取客户端消息

private void readData(SelectionKey key) {

//取到关联的channle

SocketChannel channel = null;

try {

//得到channel

channel = (SocketChannel) key.channel();

//创建buffer

ByteBuffer buffer = ByteBuffer.allocate(1024);

int count = channel.read(buffer);

//根据count的值做处理

if(count > 0) {

//把缓存区的数据转成字符串

String msg = new String(buffer.array());

//输出该消息

System.out.println("form 客户端: " + msg);

//向其它的客户端转发消息(去掉自己), 专门写一个方法来处理

sendInfoToOtherClients(msg, channel);

}

}catch (IOException e) {

try {

System.out.println(channel.getRemoteAddress() + " 离线了…");

//取消注册

key.cancel();

//关闭通道

channel.close();

}catch (IOException e2) {

e2.printStackTrace();;

}

}

}

//转发消息给其它客户(通道)

private void sendInfoToOtherClients(String msg, SocketChannel self ) throws IOException{

System.out.println(“服务器转发消息中…”);

System.out.println("服务器转发数据给客户端线程: " + Thread.currentThread().getName());

//遍历 所有注册到selector 上的 SocketChannel,并排除 self

for(SelectionKey key: selector.keys()) {

//通过 key 取出对应的 SocketChannel

Channel targetChannel = key.channel();

//排除自己

if(targetChannel instanceof SocketChannel && targetChannel != self) {

//转型

SocketChannel dest = (SocketChannel)targetChannel;

//将msg 存储到buffer

ByteBuffer buffer = ByteBuffer.wrap(msg.getBytes());

//将buffer 的数据写入 通道

dest.write(buffer);

}

}

}

public static void main(String[] args) {

//创建服务器对象

GroupChatServer groupChatServer = new GroupChatServer();

groupChatServer.listen();

}

}

//可以写一个Handler

class MyHandler {

public void readData() {

}

public void sendInfoToOtherClients(){

}

}

客户端代码

package com.dpb.netty.nio;

import java.io.IOException;

import java.net.InetSocketAddress;

import java.nio.ByteBuffer;

import java.nio.channels.SelectionKey;

import java.nio.channels.Selector;

import java.nio.channels.SocketChannel;

import java.util.Iterator;

import java.util.Scanner;

import java.util.Set;

public class GroupChatClient {

//定义相关的属性

private final String HOST = “127.0.0.1”; // 服务器的ip

private final int PORT = 6667; //服务器端口

private Selector selector;

private SocketChannel socketChannel;

private String username;

//构造器, 完成初始化工作

public GroupChatClient() throws IOException {

selector = Selector.open();

//连接服务器

socketChannel = socketChannel.open(new InetSocketAddress(“127.0.0.1”, PORT));

//设置非阻塞

socketChannel.configureBlocking(false);

//将channel 注册到selector

socketChannel.register(selector, SelectionKey.OP_READ);

//得到username

username = socketChannel.getLocalAddress().toString().substring(1);

System.out.println(username + " is ok…");

}

//向服务器发送消息

public void sendInfo(String info) {

info = username + " 说:" + info;

try {

socketChannel.write(ByteBuffer.wrap(info.getBytes()));

}catch (IOException e) {

e.printStackTrace();

}

}

//读取从服务器端回复的消息

public void readInfo() {

try {

int readChannels = selector.select();

if(readChannels > 0) {//有可以用的通道

Iterator iterator = selector.selectedKeys().iterator();

while (iterator.hasNext()) {

SelectionKey key = iterator.next();

if(key.isReadable()) {

//得到相关的通道

SocketChannel sc = (SocketChannel) key.channel();

//得到一个Buffer

ByteBuffer buffer = ByteBuffer.allocate(1024);

//读取

sc.read(buffer);

//把读到的缓冲区的数据转成字符串

String msg = new String(buffer.array());

System.out.println(msg.trim());

}

}

iterator.remove(); //删除当前的selectionKey, 防止重复操作

} else {

//System.out.println(“没有可以用的通道…”);

}

}catch (Exception e) {

e.printStackTrace();

}

}

public static void main(String[] args) throws Exception {

//启动我们客户端

GroupChatClient chatClient = new GroupChatClient();

//启动一个线程, 每个3秒,读取从服务器发送数据

new Thread() {

public void run() {

while (true) {

chatClient.readInfo();

try {

Thread.currentThread().sleep(3000);

}catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}.start();

//发送数据给服务器端

Scanner scanner = new Scanner(System.in);

while (scanner.hasNextLine()) {

String s = scanner.nextLine();

chatClient.sendInfo(s);

}

}

}

效果

在这里插入图片描述

七、NIO与零拷贝

========================================================================

零拷贝基本介绍

零拷贝是网络编程的关键,很多性能优化都离不开。

在 Java 程序中,常用的零拷贝有 mmap(内存映射) 和 sendFile。那么,他们在 OS 里,到底是怎么样的一个的设计?我们分析 mmap 和 sendFile 这两个零拷贝

另外我们看下NIO 中如何使用零拷贝

传统IO数据读写

Java 传统 IO 和 网络编程的一段代码

File file = new File(“test.txt”);

RandomAccessFile raf = new RandomAccessFile(file, “rw”);

byte[] arr = new byte[(int) file.length()];

raf.read(arr);

Socket socket = new ServerSocket(8080).accept();

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

总结

其他的内容都可以按照路线图里面整理出来的知识点逐一去熟悉,学习,消化,不建议你去看书学习,最好是多看一些视频,把不懂地方反复看,学习了一节视频内容第二天一定要去复习,并总结成思维导图,形成树状知识网络结构,方便日后复习。

这里还有一份很不错的《Java基础核心总结笔记》,特意跟大家分享出来

目录:

部分内容截图:

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

其他的内容都可以按照路线图里面整理出来的知识点逐一去熟悉,学习,消化,不建议你去看书学习,最好是多看一些视频,把不懂地方反复看,学习了一节视频内容第二天一定要去复习,并总结成思维导图,形成树状知识网络结构,方便日后复习。

这里还有一份很不错的《Java基础核心总结笔记》,特意跟大家分享出来

目录:

[外链图片转存中…(img-VpOSH6fp-1712519109398)]

部分内容截图:

[外链图片转存中…(img-WYpMjwM0-1712519109398)]

[外链图片转存中…(img-LVH6VBs8-1712519109398)]

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

  • 18
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值