1.socket
在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。
socket 的典型应用就是 Web 服务器和浏览器:浏览器获取用户输入的URL,向服务器发起请求,服务器分析接收到的URL,将对应的网页内容返回给浏览器,浏览器再经过解析和渲染,就将文字、图片、视频等元素呈现给用户。
学习 socket,也就是学习计算机之间如何通信,并编写出实用的程序。
2.第三方LBS
LBS定位你简单理解点就是通过基站网络去定位的
相对GPS来说,对信号的要求是比较低的
QQ浏览器这种,用的就是LBS定位,可以直接找到附近有什么美食景点什么的,还可以直接导航带你过去
3.Thread的setDaemon(true)方法的作用
定义:守护线程--也称“服务线程”,在没有用户线程可服务时会自动离开。优先级:守护线程的优先级比较低,用于为系统中的其它对象和线程提供服务。
设置:通过setDaemon(true)来设置线程为“守护线程”;将一个用户线程设置为守护线程的方式是在 线程对象创建 之前 用线程对象的setDaemon方法。
thread = new Thread(this);
thread.setDaemon(true);
thread.start();
当java虚拟机中没有非守护线程在运行的时候,java虚拟机会关闭。当所有常规线程运行完毕以后,守护线程不管运行到哪里,虚拟机都会退出运行。所以你的守护线程最好不要写一些会影响程序的业务逻辑。否则无法预料程序到底 会出现什么问题。
4. EventLoopGroup
netty是一款全异步,无阻塞的高性能框架,
etty是一款非阻塞框架,acceptor接收请求,poller起select的作用,像一个列车一样,把请求来回在acceptor和线程池之间传递,因为如果没有poller,就不是NIO了而是传统的BIO,NIO的作用就是创建一个通道channel,用这个通道来处理一堆请求。
我们都知道,netty的实例化,需要启动两个EventLoopGroup,事件循环组
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
一个boos,一个worker。
EventLoopGroup 的类图如下:
5.Bootstrap是什么
Bootstrap是一个做网页的框架(目前最流行的WEB前端框架之一),就是说你只需要写HTML标签调用它的类你就可以很快速的做一个高大上的网页,你不用担心兼容问题,提供了很多样式供你选择!
比如你需要做一个网站的文本显示对吧,你自己写的话你需要写很多代码,但是如果你使用bootstrap框架来写的话,只需要写好HTML标签然后调用类名就可以了!代码展示如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Bootstrap 实例 - 强调</title>
<link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
<small>本行内容是在标签内</small><br>
<strong>本行内容是在标签内</strong><br>
<em>本行内容是在标签内,并呈现为斜体</em><br>
<p class="text-left">向左对齐文本</p>
<p class="text-center">居中对齐文本</p>
<p class="text-right">向右对齐文本</p>
<p class="text-muted">本行内容是减弱的</p>
<p class="text-primary">本行内容带有一个 primary class</p>
<p class="text-success">本行内容带有一个 success class</p>
<p class="text-info">本行内容带有一个 info class</p>
<p class="text-warning">本行内容带有一个 warning class</p>
<p class="text-danger">本行内容带有一个 danger class</p>
</body>
</html>
————————————————
版权声明:本文为CSDN博主「这孩子谁懂哈」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhaomengszu/article/details/87923083
效果如下:
作用:
用它提供的样式和组件快速写网站
你只需要引用一些定义好的类,也就是class名字,就可以创建出已经有非常漂亮的样式的网页,而且支持自适应,是一个很不错的框架。
简而言之:你只需要了解相关的class、标签名称等所代表的意思,然后在构建页面的时候,导入bootstrap的JS、css等,它就会去表现相应的效果出来。
6.创建日志
private static final Logger logger= LoggerFactory.getLogger(ShiroConfig.class);
我们经常这样创建日志实例,那么为什么要用static还有final呢??
网上搜集了一些简单的答案:
定义成static final,logger变量不可变,读取速度快
static 修饰的变量是不管创建了new了多少个实例,也只创建一次,节省空间,如果每次都创建Logger的话比较浪费内存;final修饰表示不可更改,常量
将域定义为static,每个类中只有一个这样的域.而每一个对象对于所有的实例域却都有自己的一份拷贝.,用static修饰既节约空间,效率也好。final 是本 logger 不能再指向其他 Logger 对象
7.Servlet中的ServletRequestEvent和 ServletRequestListener
ServletRequestEvent类提供有关ServletRequest生命周期事件的通知。 事件的源是Web应用程序的ServletContext。 ServletRequestListener接收ServletRequestEvent生成的通知,并根据这些通知执行一些指定的任务。
ServletRequestListener常用方法:
方法 | 描述 |
---|---|
void requestDestroyed(ServletRequestEvent e) | 当请求将超出Web应用程序的范围时调用。 |
void requestInitialized(ServletRequestEvent e) | 当请求即将进入Web应用程序范围时调用。 |
因此,可以轻松实现ServletRequestListener接口,并为其定义的两个方法requestDestroyed()
和requestInitialized()
提供定义。
顾名思义,这些方法将在初始化请求和销毁请求时调用,因此我们可以将它们用于各种目的,例如销毁请求时进行变量清理 ,或在收到请求时执行一些初始检查等。
8.ServerTransaction
服务器适配类
9.Request对象中getHeader、requestHeaders、request.getHeaderNames三者区别
1.request.getHeader("Accept-Encoding");//获取单个请求头name对应的value值
2.request.getHeaders("Accept-Encoding");//获取多个同名请求头对应的一组value值,因此返回枚举类型数据
3.request.getHeaderNames();//获取请求头的所有name值,返回的数据也是一个枚举类型的数据,将枚举中的元素依次遍历出来,根据name获取对应的value值,即可得到Http请求头的所有信息
/*
* 获取头信息和请求数据
*/
public class RequestDemo2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/**
* 获取头信息
*/
String headValue = request.getHeader("Accept-Encoding");//获取单个请求头name对应的value值
System.out.println(headValue);
System.out.println("--------------");
Enumeration e = request.getHeaders("Accept-Encoding");//获取多个同名请求头对应的一组value值,因此返回枚举类型数据
/**
* 将数据遍历出来
*/
while(e.hasMoreElements()){
//遍历枚举中存储的每一个元素
String value = (String)e.nextElement();
System.out.println(value);//将值输出
}
System.out.println("----------------");
/**
* 获取所有请求头信息
*/
Enumeration er = request.getHeaderNames();//获取请求头的所有name值
while(er.hasMoreElements()){
String name =(String) er.nextElement();
String value = request.getHeader(name);
System.out.println(name+"="+value);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
}
运行结果如下:
10.DeviceInfo:设备信息
11.进制
hex表示十六进制,oct表示八进制,dec表示十进制。bin表示二进制。
12.gbk解码
String str=packet.content().toString(Charset.forName("gbk"));
12.java中trim()方法是用来干什么的?
trim()的作用是去掉字符串两端的多余的空格,注意,是两端的空格,且无论两端的空格有多少个都会去掉,当然,中间的那些空格不会被去掉,如:
String s = " a s f g "; String s1 = s.trim();
那么s1就是"a s f g",可见,这和上面所说的是一样的。
trim()不仅可以去掉空格,还能去掉其他一些多余的符号,这些符号分别是:
\t \n \v \f \r \x0085 \x00a0 ? \u2028 \u2029
翻译过来分别是:水平制表符,换行符,垂直制表符,换页符,回车,后面的这几个除了问号外,其他的都是转义符形式写法。
13. TCP和UDP
TCP是双通道的通信模式,因此TCP的连接其实是两条物理连接,即客户端到服务器和服务器到客户端的连接,三次握手
UDP是单通道
14.Java中toHexString()
toHexString(int i)
以十六进制的无符号整数形式返回一个整数参数的字符串表示形式。
15.什么是re?
正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE)
String str = "abc"
re(str) 解析收到的字符串 (str 就是收到的字符串)
公网情况下ip和端口是有时间限制的
List<Product> redisProductList = redisTemplate.boundListOps("productList").range(0,-1);这里.range(0,-1)就是取所有数据,当然,如果只取前十条数据也可以写成.range(0,10),写成-1就是取所有.
存:
String sendAppFriendCircle = RedisKey.getFriendCircleKey("fq:sendAppFriendCircle:" + dataBean.getEditId(), dataBean.getEditId());
appRedisTemplate.opsForValue().set(sendAppFriendCircle, appFriendsGoodsVo, 2, TimeUnit.HOURS);
取:
V2AppFriendsGoodsVo appFriendsGoodsVo = (V2AppFriendsGoodsVo) appRedisTemplate.opsForValue().get(sendAppFriendCircle);
@Autowired
private RestTemplate restTemplate;
public void setToRedis()
{
//存值
//key----键
//value----值
redisTemplate.boundValueOps("key").set(value);
}
//取值
String key= (String) redisTemplate.boundValueOps("key").get();