前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >android自定义密码键盘

android自定义密码键盘

作者头像
xiangzhihong
发布于 2018-01-29 02:30:38
发布于 2018-01-29 02:30:38
1.6K0
举报
文章被收录于专栏:向治洪向治洪

先上图

先看一下键盘的布局文件control_digitpasswordkeypad.xml

代码语言:js
AI代码解释
复制
<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
 android:id="@+id/digitkeypadrootlayout" 
 android:layout_width="fill_parent" 
 android:layout_height="fill_parent" 
 android:orientation="vertical" > 
 
 <LinearLayout 
 android:id="@+id/transpwdpdpanel" 
 android:layout_width="fill_parent" 
 android:layout_height="wrap_content" 
 android:layout_weight="1" 
 android:background="#000000" > 
 </LinearLayout> 
 
 <LinearLayout 
 android:layout_width="fill_parent" 
 android:layout_height="wrap_content" 
 android:layout_weight="0" 
 android:background="@drawable/keyboardbackground" 
 android:gravity="bottom" 
 android:orientation="vertical" 
 android:paddingBottom="4dp" 
 android:paddingLeft="4dp" 
 android:paddingRight="4dp" > 
 
 <LinearLayout 
 android:layout_width="fill_parent" 
 android:layout_height="wrap_content" 
 android:layout_marginLeft="4dp" 
 android:layout_marginRight="4dp" 
 android:orientation="horizontal" > 
 
 <EditText 
 android:id="@+id/digitpadedittext" 
 android:layout_width="fill_parent" 
 android:layout_height="wrap_content" 
 android:gravity="center_vertical|right" 
 android:singleLine="true" /> 
 </LinearLayout> 
 
 <LinearLayout 
 android:layout_width="fill_parent" 
 android:layout_height="wrap_content" 
 android:orientation="horizontal" > 
 
 <Button 
 android:id="@+id/digitkeypad_1" 
 android:layout_width="wrap_content" 
 android:layout_height="46dp" 
 android:layout_marginLeft="4dp" 
 android:layout_marginRight="2dp" 
 android:layout_weight="1" 
 android:background="@drawable/widget_keypad_digit" 
 android:gravity="center" 
 android:text="1" 
 android:textSize="22sp" > 
 </Button> 
 
 <Button 
 android:id="@+id/digitkeypad_2" 
 android:layout_width="wrap_content" 
 android:layout_height="46dp" 
 android:layout_marginLeft="2dp" 
 android:layout_marginRight="3dp" 
 android:layout_weight="1" 
 android:background="@drawable/widget_keypad_digit" 
 android:gravity="center" 
 android:text="2" 
 android:textSize="22sp" > 
 </Button> 
 
 <Button 
 android:id="@+id/digitkeypad_3" 
 android:layout_width="wrap_content" 
 android:layout_height="46dp" 
 android:layout_marginLeft="2dp" 
 android:layout_marginRight="4dp" 
 android:layout_weight="1" 
 android:background="@drawable/widget_keypad_digit" 
 android:gravity="center" 
 android:text="3" 
 android:textSize="22sp" > 
 </Button> 
 </LinearLayout> 
 
 <LinearLayout 
 android:layout_width="fill_parent" 
 android:layout_height="wrap_content" 
 android:orientation="horizontal" > 
 
 <Button 
 android:id="@+id/digitkeypad_4" 
 android:layout_width="wrap_content" 
 android:layout_height="46dp" 
 android:layout_marginLeft="4dp" 
 android:layout_marginRight="2dp" 
 android:layout_weight="1" 
 android:background="@drawable/widget_keypad_digit" 
 android:text="4" 
 android:textSize="22sp" > 
 </Button> 
 
 <Button 
 android:id="@+id/digitkeypad_5" 
 android:layout_width="wrap_content" 
 android:layout_height="46dp" 
 android:layout_marginLeft="2dp" 
 android:layout_marginRight="3dp" 
 android:layout_weight="1" 
 android:background="@drawable/widget_keypad_digit" 
 android:text="5" 
 android:textSize="22sp" > 
 </Button> 
 
 <Button 
 android:id="@+id/digitkeypad_6" 
 android:layout_width="wrap_content" 
 android:layout_height="46dp" 
 android:layout_marginLeft="2dp" 
 android:layout_marginRight="4dp" 
 android:layout_weight="1" 
 android:background="@drawable/widget_keypad_digit" 
 android:text="6" 
 android:textSize="22sp" > 
 </Button> 
 </LinearLayout> 
 
 <LinearLayout 
 android:layout_width="fill_parent" 
 android:layout_height="wrap_content" 
 android:orientation="horizontal" > 
 
 <Button 
 android:id="@+id/digitkeypad_7" 
 android:layout_width="80dp" 
 android:layout_height="46dp" 
 android:layout_marginLeft="4dp" 
 android:layout_marginRight="2dp" 
 android:layout_weight="1" 
 android:background="@drawable/widget_keypad_digit" 
 android:text="7" 
 android:textSize="22sp" > 
 </Button> 
 
 <Button 
 android:id="@+id/digitkeypad_8" 
 android:layout_width="80dp" 
 android:layout_height="46dp" 
 android:layout_marginLeft="2dp" 
 android:layout_marginRight="3dp" 
 android:layout_weight="1" 
 android:background="@drawable/widget_keypad_digit" 
 android:text="8" 
 android:textSize="22sp" > 
 </Button> 
 
 <Button 
 android:id="@+id/digitkeypad_9" 
 android:layout_width="80dp" 
 android:layout_height="46dp" 
 android:layout_marginLeft="2dp" 
 android:layout_marginRight="4dp" 
 android:layout_weight="1" 
 android:background="@drawable/widget_keypad_digit" 
 android:text="9" 
 android:textSize="22sp" > 
 </Button> 
 </LinearLayout> 
 
 <LinearLayout 
 android:layout_width="fill_parent" 
 android:layout_height="wrap_content" 
 android:orientation="horizontal" > 
 
 <Button 
 android:id="@+id/digitkeypad_c" 
 android:layout_width="80dp" 
 android:layout_height="46dp" 
 android:layout_marginLeft="4dp" 
 android:layout_marginRight="2dp" 
 android:layout_weight="1" 
 android:background="@drawable/keyboardclear" 
 android:text="" 
 android:textSize="22sp" > 
 </Button> 
 
 <Button 
 android:id="@+id/digitkeypad_0" 
 android:layout_width="80dp" 
 android:layout_height="46dp" 
 android:layout_marginLeft="2dp" 
 android:layout_marginRight="3dp" 
 android:layout_weight="1" 
 android:background="@drawable/widget_keypad_digit" 
 android:text="0" 
 android:textSize="22sp" > 
 </Button> 
 
 <Button 
 android:id="@+id/digitkeypad_ok" 
 android:layout_width="80dp" 
 android:layout_height="46dp" 
 android:layout_marginLeft="2dp" 
 android:layout_marginRight="4dp" 
 android:layout_weight="1" 
 android:background="@drawable/keyboardok" 
 android:text="" 
 android:textSize="22sp" > 
 </Button> 
 </LinearLayout> 
 </LinearLayout> 
 
</LinearLayout> 

键盘布局文件截图如下:

下面看一下主界面的布局文件mian.xml

代码语言:js
AI代码解释
复制
<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
 android:layout_width="fill_parent" 
 android:layout_height="fill_parent" 
 android:orientation="vertical" > 
 
 <TextView 
 android:id="@+id/input" 
 android:layout_width="fill_parent" 
 android:layout_height="wrap_content" 
 android:hint="请输入数字" 
 /> 
 
</LinearLayout> 

主界面只有一个TextView控件,通过触发TextView的单击事件弹出自定义键盘

触发事件代码:

代码语言:js
AI代码解释
复制
TextView editText = (TextView)findViewById(R.id.input);  
editText.setOnClickListener(new OnClickListener() {  
 @Override 
 public void onClick(View v) {  
        showPassWdPadView();  
    }  
});  

弹出自定义键盘方法showPassWdPadView()

代码语言:js
AI代码解释
复制
private void showPassWdPadView() {  
 this.runOnUiThread(new Runnable() {  
 public void run() {  
 // 让一个视图浮动在你的应用程序之上 
                WindowManager windowmanager = (WindowManager) content.getSystemService(Context.WINDOW_SERVICE);  
                LayoutParams layoutparams = new LayoutParams(-1, -1, WindowManager.LayoutParams.FIRST_SUB_WINDOW, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.RGBA_8888);  
                layoutparams.gravity = Gravity.BOTTOM;  
                passwdview.findViewById(R.id.transpwdpdpanel).getBackground().setAlpha(140);  
                windowmanager.addView(passwdview, layoutparams);  
            }  
        });  
}  

这里用到了WindowManager,具体用法可参考网上。

下面是主界面的全部代码

代码语言:js
AI代码解释
复制
import android.app.Activity;  
import android.content.Context;  
import android.graphics.PixelFormat;  
import android.os.Bundle;  
import android.view.Gravity;  
import android.view.View;  
import android.view.WindowManager;  
import android.view.View.OnClickListener;  
import android.view.WindowManager.LayoutParams;  
import android.widget.TextView;  
 
public class AndroidInputNumberActivity extends Activity {  
 private DigitPasswordKeyPad dpk;  
 private View passwdview;  
 private Context content ;  
 @Override 
 public void onCreate(Bundle savedInstanceState) {  
 super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
 
        content = this;  
 
        dpk = new DigitPasswordKeyPad(this);  
        passwdview = dpk.setup();  
 
        TextView editText = (TextView)findViewById(R.id.input);  
        editText.setOnClickListener(new OnClickListener() {  
 @Override 
 public void onClick(View v) {  
                showPassWdPadView();  
            }  
        });  
    }  
 
 private void showPassWdPadView() {  
 this.runOnUiThread(new Runnable() {  
 public void run() {  
 // 让一个视图浮动在你的应用程序之上 
                    WindowManager windowmanager = (WindowManager) content.getSystemService(Context.WINDOW_SERVICE);  
                    LayoutParams layoutparams = new LayoutParams(-1, -1, WindowManager.LayoutParams.FIRST_SUB_WINDOW, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.RGBA_8888);  
                    layoutparams.gravity = Gravity.BOTTOM;  
                    passwdview.findViewById(R.id.transpwdpdpanel).getBackground().setAlpha(140);  
                    windowmanager.addView(passwdview, layoutparams);  
                }  
            });  
    }  
}  

上面代码中passwdview这个对象就是弹出键盘界面的View实例,passwdview这个对象是在DigitPasswordKeyPad中初始化得到。

DigitPasswordKeyPad类自定义键盘类,继承自View类

代码语言:js
AI代码解释
复制
import android.content.Context;  
import android.text.InputType;  
import android.view.LayoutInflater;  
import android.view.View;  
import android.widget.Button;  
import android.widget.EditText;  
 
/** 
 * 系统定制的数字密码键盘 
 * 
 * @author twf 
 * 
 */ 
public class DigitPasswordKeyPad extends View {  
 private Context ctx = null;  
 private View v;  
 private String digitnum = "";  
 private int length = 6;  
 
 private Button digitkeypad_1;  
 private Button digitkeypad_2;  
 private Button digitkeypad_3;  
 private Button digitkeypad_4;  
 private Button digitkeypad_5;  
 private Button digitkeypad_6;  
 private Button digitkeypad_7;  
 private Button digitkeypad_8;  
 private Button digitkeypad_9;  
 private Button digitkeypad_0;  
 private Button digitkeypad_c;  
 private Button digitkeypad_ok;  
 private EditText digitkeypad_edittext;  
 
 private boolean isPwd;  
 
 public DigitPasswordKeyPad(Context ctx) {  
 super(ctx);  
 this.ctx = ctx;  
    }  
 
 @Override 
 protected void onLayout(boolean arg0, int arg1, int arg2, int arg3, int arg4) {  
    }  
 
 public void setEditTextIsPwd(boolean ispwd) {  
 if (ispwd) {  
            digitkeypad_edittext.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);  
        } else {  
            digitkeypad_edittext.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);  
        }  
 this.isPwd = ispwd;  
    }  
 
 public View setup() {  
        LayoutInflater lif = LayoutInflater.from(ctx);  
        v = lif.inflate(R.layout.control_digitpasswordkeypad, null);  
 
 // 初始化 对象 
        digitkeypad_1 = (Button) v.findViewById(R.id.digitkeypad_1);  
        digitkeypad_2 = (Button) v.findViewById(R.id.digitkeypad_2);  
        digitkeypad_3 = (Button) v.findViewById(R.id.digitkeypad_3);  
        digitkeypad_4 = (Button) v.findViewById(R.id.digitkeypad_4);  
        digitkeypad_5 = (Button) v.findViewById(R.id.digitkeypad_5);  
        digitkeypad_6 = (Button) v.findViewById(R.id.digitkeypad_6);  
        digitkeypad_7 = (Button) v.findViewById(R.id.digitkeypad_7);  
        digitkeypad_8 = (Button) v.findViewById(R.id.digitkeypad_8);  
        digitkeypad_9 = (Button) v.findViewById(R.id.digitkeypad_9);  
        digitkeypad_0 = (Button) v.findViewById(R.id.digitkeypad_0);  
        digitkeypad_c = (Button) v.findViewById(R.id.digitkeypad_c);  
        digitkeypad_ok = (Button) v.findViewById(R.id.digitkeypad_ok);  
        digitkeypad_edittext = (EditText) v.findViewById(R.id.digitpadedittext);  
 
 // 添加点击事件 
        DigitPasswordKeypadOnClickListener dkol = new DigitPasswordKeypadOnClickListener();  
        digitkeypad_1.setOnClickListener(dkol);  
        digitkeypad_2.setOnClickListener(dkol);  
        digitkeypad_3.setOnClickListener(dkol);  
        digitkeypad_4.setOnClickListener(dkol);  
        digitkeypad_5.setOnClickListener(dkol);  
        digitkeypad_6.setOnClickListener(dkol);  
        digitkeypad_7.setOnClickListener(dkol);  
        digitkeypad_8.setOnClickListener(dkol);  
        digitkeypad_9.setOnClickListener(dkol);  
        digitkeypad_0.setOnClickListener(dkol);  
        digitkeypad_c.setOnClickListener(dkol);  
        digitkeypad_ok.setOnClickListener(new DigitPasswordKeypadFinshOnClikcListener());  
 
 return v;  
    }  
 
 private class DigitPasswordKeypadFinshOnClikcListener implements OnClickListener {  
 
 @Override 
 public void onClick(View v) {  
 int viewId = v.getId();  
 
 if (viewId == R.id.digitkeypad_ok) {  
 // 点击完成 
 // 设置值回页面 
 // 隐藏自己View 
 // if (isPwd) { 
 // jsimpl.hidePasswdPad(digitkeypad_edittext.getText().toString()); 
 // } else { 
 // jsimpl.hideCallNumPad(digitkeypad_edittext.getText().toString()); 
 // } 
                DigitPasswordKeyPad.this.setVisibility(View.GONE);  
            }  
        }  
    }  
 
 public void initInputLable(String str, int length) {  
        str = str.trim();  
        digitnum = str;  
 this.length = length;  
        digitkeypad_edittext.setText(digitnum);  
        digitkeypad_edittext.setSelection(digitnum.length());  
    }  
 
 private class DigitPasswordKeypadOnClickListener implements OnClickListener {  
 
 @Override 
 public void onClick(View v) {  
 int viewId = v.getId();  
 
 switch (viewId) {  
 case R.id.digitkeypad_1:  
 if (digitnum.length() == length) {  
 return;  
                } else {  
                    digitnum += 1;  
                }  
 break;  
 case R.id.digitkeypad_2:  
 if (digitnum.length() == length) {  
 return;  
                } else {  
                    digitnum += 2;  
                }  
 break;  
 case R.id.digitkeypad_3:  
 if (digitnum.length() == length) {  
 return;  
                } else {  
                    digitnum += 3;  
                }  
 break;  
 case R.id.digitkeypad_4:  
 if (digitnum.length() == length) {  
 return;  
                } else {  
                    digitnum += 4;  
                }  
 break;  
 case R.id.digitkeypad_5:  
 if (digitnum.length() == length) {  
 return;  
                } else {  
                    digitnum += 5;  
                }  
 break;  
 case R.id.digitkeypad_6:  
 if (digitnum.length() == length) {  
 return;  
                } else {  
                    digitnum += 6;  
                }  
 break;  
 case R.id.digitkeypad_7:  
 if (digitnum.length() == length) {  
 return;  
                } else {  
                    digitnum += 7;  
                }  
 break;  
 case R.id.digitkeypad_8:  
 if (digitnum.length() == length) {  
 return;  
                } else {  
                    digitnum += 8;  
                }  
 break;  
 case R.id.digitkeypad_9:  
 if (digitnum.length() == length) {  
 return;  
                } else {  
                    digitnum += 9;  
                }  
 break;  
 case R.id.digitkeypad_0:  
 if (digitnum.length() == length) {  
 return;  
                } else {  
                    digitnum += 0;  
                }  
 
 break;  
 case R.id.digitkeypad_c:// 后退 
 if (digitnum.length() > 0) {  
                    digitnum = digitnum.substring(0, digitnum.length() - 1);  
                }  
 break;  
            }  
 // 格式化 数据 
            digitkeypad_edittext.setText(digitnum);  
            digitkeypad_edittext.setSelection(null != digitnum ? digitnum.length() : 0);  
        }  
 
    }  
}  
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2014-01-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Netty Review - 优化Netty通信:如何应对粘包和拆包挑战_自定义长度分包编解码码器
Netty Review - 借助SimpleTalkRoom初体验异步网络编程的魅力
小小工匠
2023/12/25
4380
Netty Review - 优化Netty通信:如何应对粘包和拆包挑战_自定义长度分包编解码码器
在netty中使用protobuf并实现数据加密传输
  最近学习netty,为了实践一些知识点,写了一个小demo,完成了client和server端之间的加密数据传输,并使用了protobuf对数据进行封装,代码虽然简单,但对初学者学习netty应该会有些许帮助,特此记录分享。   首先来看Server的实现,Server和所有的netty示例代码差不多,都是构建netty的ServerBootstrap。
xindoo
2024/08/07
2040
Netty之旅二:口口相传的高性能Netty到底是什么?
高清思维导图原件(xmind/pdf/jpg)可以关注公众号:一枝花算不算浪漫 回复netty01即可。
一枝花算不算浪漫
2020/08/25
7980
Netty之旅二:口口相传的高性能Netty到底是什么?
2025春招,Netty面试题汇总
>大家好,我是 V 哥。2025年春招Java 面试,肯定绕不开 Netty 的相关问题,V哥替大家跟几位大厂技术主管交流后,整理的一些 2025 年可能会遇到的 Netty 面试题,涵盖基础概念、核心组件、性能优化、故障排查等方面,分享给大家,收藏起来备用。
威哥爱编程
2025/02/05
1450
Netty服务开发及性能优化
Netty是一个异步基于事件驱动的高性能网络通信框架,可以看做是对NIO和BIO的封装,并提供了简单易用的API、Handler和工具类等,用以快速开发高性能、高可靠性的网络服务端和客户端程序。
闻说社
2023/04/12
5870
netty 构建server和client 服务
编程学习的方法,我认为是以小见大,在理解一个东西之前一定要先会用,并用熟它,这样理解才会快。 就跟理解自行车一样,不会骑,然后先开始研究,最终可能会研究明白,但是毕竟还是事倍功半。 所以先构建一个可以使自己理解的项目,再一点一点学习原理是一种比较好的方式。
潇洒
2023/10/20
2520
Netty Review - 借助SimpleTalkRoom初体验异步网络编程的魅力
小小工匠
2023/12/21
1480
Netty Review - 借助SimpleTalkRoom初体验异步网络编程的魅力
Netty 的编码 解码 案例
1、HTTP 中有一个 Nagle 算法,每个报文都是一段的,使用网络发送发现网络效率低,然后 HTTP 设置一个算法,设置到一定程度发,所以出现一些延时,提高销量,所以形成了粘包
BUG弄潮儿
2021/07/22
1.1K0
Socket粘包问题终极解决方案—Netty版(2W字)!
上一篇我们讲了《Socket粘包问题的3种解决方案》,但没想到评论区竟然炸了。介于大家的热情讨论,以及不同的反馈意见,本文就来做一个扩展和延伸,试图找到问题的最优解,以及消息通讯的最优解决方案。
磊哥
2021/01/14
5990
Socket粘包问题终极解决方案—Netty版(2W字)!
Netty框架
Netty 是由 JBOSS 提供的一个 Java 开源框架。Netty 提供异步的、基于事件驱动的网络应用程序框架,用以快速开发高性能、高可靠性的网络 IO 程序。
全栈程序员站长
2022/07/22
3690
Netty框架
Netty接收数据时一次读取多少字节以及读多少次
本篇使用Netty构建一个简单的服务端,使用Python构建一个简单的客户端,然后客户端向服务端发送数据,然后观察Netty每次读取的字节数.
书唐瑞
2022/06/02
9040
Netty接收数据时一次读取多少字节以及读多少次
Netty的部分案例实现
Netty简单入门案例实现 server端 package com.shi.netty.netty1.simple; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; import io.netty.channel.EventL
用户5927264
2020/06/16
6210
netty 构建一个简易服务
构建一个只有Server服务端的netty服务,不需要额外的编写client去访问,也就是说使用现在的软件去访问。 最简单的就是使用浏览器去访问,浏览是HTTP协议,所以服务必须是一个支持HTTP协议的应用。
潇洒
2023/10/20
2090
netty 构建一个简易服务
【Netty】使用 Netty 开发 HTTP 服务器
① HTTP 服务器端 : 在服务器端使用 Netty 开发 HTTP 服务器 , 该 HTTP 服务器监听 8888 端口 ;
韩曙亮
2023/03/27
6250
【Netty】使用 Netty 开发 HTTP 服务器
Netty一文深入
通过2个位置指针来协助缓冲区的读写,读使用 readerIndex,写使用 writerIndex。
趣学程序-shaofeer
2020/07/17
7860
Netty一文深入
史诗级最强教科书式“NIO与Netty编程”
java.nio全称java non-blocking IO,是指JDK1.4开始提供的新API。从JDK1.4开始,Java提供了一系列改进的输入/输出的新特性,也被称为NIO(既New IO),新增了许多用于处理输入输出的类,这些类都被放在java.nio包及子包下,并且对原java.io包中的很多类进行改写,新增类满足NIO的功能。 NIO和BIO有着相同的目的和作用,但是它们的实现方式完全不同,BIO以流的方式处理数据,而NIO以块的方式处理数据,块I/O的效率比流I/O高很多。另外,NIO是非阻塞式的,这一点跟BIO也很不相同,使用它可以提供非阻塞式的高伸缩性网络。 NIO主要有三大核心部分 :Channel(通道),Buffer(缓冲区),Selector(选择器)。传统的BIO基于字节流和字符流进行操作,而NIO基于Channel和Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。Selector(选择区)用于监听多个通道的事件(比如 :连接打开,数据到达)。因此使用单个线程就可以监听多个数据管道。
海仔
2019/08/26
9390
史诗级最强教科书式“NIO与Netty编程”
【Java】Netty创建网络服务端客户端(TCP/UDP)
Netty是一个基于Java的异步事件驱动的网络应用程序框架,专门用于快速开发高性能、可扩展和可维护的网络服务器和客户端。它提供了简单而强大的API,使开发人员能够轻松地构建各种网络应用,包括TCP、UDP、HTTP、WebSocket等。
DevFrank
2024/07/24
8690
【Java】Netty创建网络服务端客户端(TCP/UDP)
Netty | 工作流程 & 核心组件讲解 & 代码案例
我们先来看看Netty的工作原理图,简单说一下工作流程,然后通过这张图来一一分析Netty的核心组件。
宁在春
2022/10/31
3.8K1
Netty | 工作流程 & 核心组件讲解 & 代码案例
java架构之路-(netty专题)netty的基本使用和netty聊天室
  上次博客,我们主要说了我们的IO模型,BIO同步阻塞,NIO同步非阻塞,AIO基于NIO二次封装的异步非阻塞,最重要的就是我们的NIO,脑海中应该有NIO的模型图。
小菜的不能再菜
2020/02/23
1.3K0
一个异步无限发送的Netty实例
官方案例地址:https://netty.io/4.1/xref/io/netty/example/echo/package-summary.html
Java猫说
2019/08/20
1.1K0
推荐阅读
相关推荐
Netty Review - 优化Netty通信:如何应对粘包和拆包挑战_自定义长度分包编解码码器
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档