Netty为基础的Socket长连接高并发服务器微家开发之路(2)--第一版简略服务器编码

  • 作者
  • 戈寒
  • 2022-11-20 07:32:04
  • 阅读  198

事隔上一篇《前言》发表在微家上已经有了近一周了,看来本人还是惰性太大,这么久了,才来开始写第二篇。其实这篇代码是在22号左右就已经提交到GIT上面去了。(所有源码都可以在GIT(https://github.com/KING754/unicorn)上看到),当然其中,也有很大部分时间,是在构思应该怎么来写本文章乃到怎么写本系列的文章。因为,代码太少了,好像文章也不用怎么写,看代码基本就可以,但如果不写,等到下次一起写,好像又跨度太大了。想来想去,还是把一些重点代码贴过来,然后做以简单的说明。我相信这样,对我代码的演变过程,是一个更好的总结与思考。

此类文章本人将会按一个系列的形式进行书写。该系列文章,主要记录从零开始,利用Netty搭建一个TCP的Socket长连接服务器项目的过程。本系列文章原始出处微家(www.wejias.com),转载请注明出处。

  • POM引用NETTY

       本人在开发时NETTY5仍然只有两个alpha版本,为了安全起见,本人决定用4.0的最新版本4.0.56

       <dependency>
        <groupId>io.netty</groupId>
        <artifactId>netty-all</artifactId>
        <version>4.0.56.Final</version>
      </dependency>
  • 引入slf4j和logback

      <dependency>        
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.25</version>
      </dependency>
            
      <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-core</artifactId>
        <version>1.1.7</version>
      </dependency>
            
      <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.1.7</version>
      </dependency>

做初用maven的来说,做下面两点入门级的备注事项:

备注1:maven原始远程中央库(即下载JAR包的地址),是在国外,所以我朝程序猿并不友好,所以需要对其修改,指向国内的镜像,如下:

        以指向阿里镜向为例,
        1.找到本地库(存JAR的目录)或者全局(MAVEN安装目录/conf/)的setting.xml
        在mirrors节点下,添加如下内容:
        <mirror>
            <id>nexus-aliyun</id>
            <mirrorOf>central</mirrorOf>
            <name>Nexus aliyun</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public</url>
	    </mirror>

备注2:对于初用maven的人来说,有一个困惑,我这些maven地址,上哪里去找呢?有些jar官方地址还特别不好找.

          所以分享一个查询网址:http://mvnrepository.com/


重点代码部分:

NettyServer
public class NettyServer {
        private EventLoopGroup      bossGroup   = null;
        private EventLoopGroup      workerGroup = null;
        private ServerBootstrap      bootStrap   = null;
        
        public void  launch(int serverPort){
            String osName = System.getProperty("os.name");
            this.initThreadGroup(osName);
            
            bootStrap = new ServerBootstrap();
            bootStrap.group(bossGroup, workerGroup);
            this.initServerChannel(osName);
            
            bootStrap.childOption(ChannelOption.TCP_NODELAY, true);
            bootStrap.childOption(ChannelOption.SO_KEEPALIVE, true);
            bootStrap.childOption(ChannelOption.SO_REUSEADDR, true);
            
            bootStrap.childHandler(new ServerChannel());
            ChannelFuture future = bootStrap.bind(serverPort);
        }
        
         private void initThreadGroup(String osName){
                    if(osName.trim().equals("Linux")){
                        this.bossGroup = new EpollEventLoopGroup(ServerCoreInfo.DEFAULT_NETTY_CORE_THREAD_NUM);
                        this.workerGroup = new EpollEventLoopGroup(ServerCoreInfo.DEFAULT_NETTY_WORK_THREAD_NUM);
                    }else{
                        this.bossGroup = new NioEventLoopGroup(ServerCoreInfo.DEFAULT_NETTY_CORE_THREAD_NUM);
                        this.workerGroup = new NioEventLoopGroup(ServerCoreInfo.DEFAULT_NETTY_WORK_THREAD_NUM);
                    }
                }
    
                private void initServerChannel(String osName){
                    if(osName.trim().equals("Linux")){
                        this.bootStrap.channel(EpollServerSocketChannel.class);
                    }else{
                        this.bootStrap.channel(NioServerSocketChannel.class);
                    }
                }
}

以上Server启动的需要调用的初始化方向的接口.其中几个线程组,可以根据系统选不同的IO方式进行构造,以确保其中当前系统最优的方案.其中可以大部分朋友可能对这个String osName = System.getProperty("os.name")取出值比较担心,不知道是些什么值.此处贴一下百度出来的,较为清晰的答案:

os.nameos.versionos.archComments
Linux2.0.31x86IBM Java 1.3
Linux(*)i386Sun Java 1.3.1, 1.4 or Blackdown Java; (*) os.version depends on Linux Kernel version
Linux(*)x86_64Blackdown Java; note x86_64 might change to amd64; (*) os.version depends on Linux Kernel version
Linux(*)sparcBlackdown Java; (*) os.version depends on Linux Kernel version
Linux(*)ppcBlackdown Java; (*) os.version depends on Linux Kernel version
Linux(*)armv41Blackdown Java; (*) os.version depends on Linux Kernel version
Linux(*)i686GNU Java Compiler (GCJ); (*) os.version depends on Linux Kernel version
Linux(*)ppc64IBM Java 1.3; (*) os.version depends on Linux Kernel version
Mac OS7.5.1PowerPC
Mac OS8.1PowerPC
Mac OS9.0, 9.2.2PowerPCMacOS 9.0: java.version=1.1.8, mrj.version=2.2.5; MacOS 9.2.2: java.version=1.1.8 mrj.version=2.2.5
Mac OS X10.1.3ppc
Mac OS X10.2.6ppcJava(TM) 2 Runtime Environment, Standard Edition (build 1.4.1_01-39)
Java HotSpot(TM) Client VM (build 1.4.1_01-14, mixed mode)
Mac OS X10.2.8ppcusing 1.3 JVM: java.vm.version=1.3.1_03-74, mrj.version=3.3.2; using 1.4 JVM: java.vm.version=1.4.1_01-24, mrj.version=69.1
Mac OS X10.3.1, 10.3.2, 10.3.3, 10.3.4ppcJDK 1.4.x
Mac OS X10.3.8ppcMac OS X 10.3.8 Server; using 1.3 JVM: java.vm.version=1.3.1_03-76, mrj.version=3.3.3; using 1.4 JVM: java.vm.version=1.4.2-38; mrj.version=141.3
Windows 954.0x86
Windows 984.10x86Note, that if you run Sun JDK 1.2.1 or 1.2.2 Windows 98 identifies itself as Windows 95.
Windows Me4.90x86
Windows NT4.0x86
Windows 20005.0x86
Windows XP5.1x86Note, that if you run older Java runtimes Windows XP identifies itself as Windows 2000.
Windows 20035.2x86java.vm.version=1.4.2_06-b03; Note, that Windows Server 2003 identifies itself only as Windows 2003.
Windows CE3.0 build 11171armCompaq iPAQ 3950 (PocketPC 2002)
OS/220.40x86
Solaris2.xsparc
SunOS5.7sparcSun Ultra 5 running Solaris 2.7
SunOS5.8sparcSun Ultra 2 running Solaris 8
SunOS5.9sparcJava(TM) 2 Runtime Environment, Standard Edition (build 1.4.0_01-b03)
Java HotSpot(TM) Client VM (build 1.4.0_01-b03, mixed mode)
MPE/iXC.55.00PA-RISC
HP-UXB.10.20PA-RISCJDK 1.1.x
HP-UXB.11.00PA-RISCJDK 1.1.x
HP-UXB.11.11PA-RISCJDK 1.1.x
HP-UXB.11.11PA_RISCJDK 1.2.x/1.3.x; note Java 2 returns PA_RISC and Java 1 returns PA-RISC
HP-UXB.11.00PA_RISCJDK 1.2.x/1.3.x
HP-UXB.11.23IA64NJDK 1.4.x
HP-UXB.11.11PA_RISC2.0JDK 1.3.x or JDK 1.4.x, when run on a PA-RISC 2.0 system
HP-UXB.11.11PA_RISCJDK 1.2.x, even when run on a PA-RISC 2.0 system
HP-UXB.11.11PA-RISCJDK 1.1.x, even when run on a PA-RISC 2.0 system
AIX5.2ppc64sun.arch.data.model=64
AIX4.3Power
AIX4.1POWER_RS
OS/39039002.10.00J2RE 1.3.1 IBM OS/390 Persistent Reusable VM
FreeBSD2.2.2-RELEASEx86
Irix6.3mips
Digital Unix4.0alpha
NetWare 4.114.11x86
OSF1V5.1alphaJava 1.3.1 on Compaq (now HP) Tru64 Unix V5.1
OpenVMSV7.2-1alphaJava 1.3.1_1 on OpenVMS 7.2

其它代码主要是ServerChannel和ServerIoHandler类,但是本版本这两个类的代码都比较简单,以上代码片段主要是本人认为,需要特别说明的地方。更全的代码可在Github上查看。

本项目,主要采用以上开源框架技术。另外再从设置上或者代码上,进行优化。最终期望,本项目成为一个高负载,高并发的TCP服务器。本系列文章主要记录本项目开发的过程,以及过程中遇到的问题。记录其的主要目的,是想让自己能够在开发之后,更系统,全面且静下心来梳理相关知识点。与此同时,提高自己,也希望对其它准备相关项目的小伙伴,起到抛砖引玉的作用。当然,只要是代码就会BUG,如果看过文章,你发现有什么不对或者不合理地方,非常欢迎和谢谢指正。

当然最好最直接的方式,是通过页面底的众多联系方式找到我,和我直接开聊讨论。

具体的联系有QQ号:2091263530,QQ群:688543468

或者关注我们公众号”微家频道“,或者微博”微家频道“。


阿里云大力度优惠.云服务器最低可以两折起。也很多优惠券。具体【点击优惠进行详细了解。

Netty为基础的Socket长连接高并发服务器微家开发之路(2)--第一版简略服务器编码

  • 2022-11-20 07:32:04
  • 阅读  198

事隔上一篇《前言》发表在微家上已经有了近一周了,看来本人还是惰性太大,这么久了,才来开始写第二篇。其实这篇代码是在22号左右就已经提交到GIT上面去了。(所有源码都可以在GIT(https://github.com/KING754/unicorn)上看到),当然其中,也有很大部分时间,是在构思应该怎么来写本文章乃到怎么写本系列的文章。因为,代码太少了,好像文章也不用怎么写,看代码基本就可以,但如果不写,等到下次一起写,好像又跨度太大了。想来想去,还是把一些重点代码贴过来,然后做以简单的说明。我相信这样,对我代码的演变过程,是一个更好的总结与思考。

此类文章本人将会按一个系列的形式进行书写。该系列文章,主要记录从零开始,利用Netty搭建一个TCP的Socket长连接服务器项目的过程。本系列文章原始出处微家(www.wejias.com),转载请注明出处。

  • POM引用NETTY

       本人在开发时NETTY5仍然只有两个alpha版本,为了安全起见,本人决定用4.0的最新版本4.0.56

       <dependency>
        <groupId>io.netty</groupId>
        <artifactId>netty-all</artifactId>
        <version>4.0.56.Final</version>
      </dependency>
  • 引入slf4j和logback

      <dependency>        
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.25</version>
      </dependency>
            
      <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-core</artifactId>
        <version>1.1.7</version>
      </dependency>
            
      <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.1.7</version>
      </dependency>

做初用maven的来说,做下面两点入门级的备注事项:

备注1:maven原始远程中央库(即下载JAR包的地址),是在国外,所以我朝程序猿并不友好,所以需要对其修改,指向国内的镜像,如下:

        以指向阿里镜向为例,
        1.找到本地库(存JAR的目录)或者全局(MAVEN安装目录/conf/)的setting.xml
        在mirrors节点下,添加如下内容:
        <mirror>
            <id>nexus-aliyun</id>
            <mirrorOf>central</mirrorOf>
            <name>Nexus aliyun</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public</url>
	    </mirror>

备注2:对于初用maven的人来说,有一个困惑,我这些maven地址,上哪里去找呢?有些jar官方地址还特别不好找.

          所以分享一个查询网址:http://mvnrepository.com/


重点代码部分:

NettyServer
public class NettyServer {
        private EventLoopGroup      bossGroup   = null;
        private EventLoopGroup      workerGroup = null;
        private ServerBootstrap      bootStrap   = null;
        
        public void  launch(int serverPort){
            String osName = System.getProperty("os.name");
            this.initThreadGroup(osName);
            
            bootStrap = new ServerBootstrap();
            bootStrap.group(bossGroup, workerGroup);
            this.initServerChannel(osName);
            
            bootStrap.childOption(ChannelOption.TCP_NODELAY, true);
            bootStrap.childOption(ChannelOption.SO_KEEPALIVE, true);
            bootStrap.childOption(ChannelOption.SO_REUSEADDR, true);
            
            bootStrap.childHandler(new ServerChannel());
            ChannelFuture future = bootStrap.bind(serverPort);
        }
        
         private void initThreadGroup(String osName){
                    if(osName.trim().equals("Linux")){
                        this.bossGroup = new EpollEventLoopGroup(ServerCoreInfo.DEFAULT_NETTY_CORE_THREAD_NUM);
                        this.workerGroup = new EpollEventLoopGroup(ServerCoreInfo.DEFAULT_NETTY_WORK_THREAD_NUM);
                    }else{
                        this.bossGroup = new NioEventLoopGroup(ServerCoreInfo.DEFAULT_NETTY_CORE_THREAD_NUM);
                        this.workerGroup = new NioEventLoopGroup(ServerCoreInfo.DEFAULT_NETTY_WORK_THREAD_NUM);
                    }
                }
    
                private void initServerChannel(String osName){
                    if(osName.trim().equals("Linux")){
                        this.bootStrap.channel(EpollServerSocketChannel.class);
                    }else{
                        this.bootStrap.channel(NioServerSocketChannel.class);
                    }
                }
}

以上Server启动的需要调用的初始化方向的接口.其中几个线程组,可以根据系统选不同的IO方式进行构造,以确保其中当前系统最优的方案.其中可以大部分朋友可能对这个String osName = System.getProperty("os.name")取出值比较担心,不知道是些什么值.此处贴一下百度出来的,较为清晰的答案:

os.nameos.versionos.archComments
Linux2.0.31x86IBM Java 1.3
Linux(*)i386Sun Java 1.3.1, 1.4 or Blackdown Java; (*) os.version depends on Linux Kernel version
Linux(*)x86_64Blackdown Java; note x86_64 might change to amd64; (*) os.version depends on Linux Kernel version
Linux(*)sparcBlackdown Java; (*) os.version depends on Linux Kernel version
Linux(*)ppcBlackdown Java; (*) os.version depends on Linux Kernel version
Linux(*)armv41Blackdown Java; (*) os.version depends on Linux Kernel version
Linux(*)i686GNU Java Compiler (GCJ); (*) os.version depends on Linux Kernel version
Linux(*)ppc64IBM Java 1.3; (*) os.version depends on Linux Kernel version
Mac OS7.5.1PowerPC
Mac OS8.1PowerPC
Mac OS9.0, 9.2.2PowerPCMacOS 9.0: java.version=1.1.8, mrj.version=2.2.5; MacOS 9.2.2: java.version=1.1.8 mrj.version=2.2.5
Mac OS X10.1.3ppc
Mac OS X10.2.6ppcJava(TM) 2 Runtime Environment, Standard Edition (build 1.4.1_01-39)
Java HotSpot(TM) Client VM (build 1.4.1_01-14, mixed mode)
Mac OS X10.2.8ppcusing 1.3 JVM: java.vm.version=1.3.1_03-74, mrj.version=3.3.2; using 1.4 JVM: java.vm.version=1.4.1_01-24, mrj.version=69.1
Mac OS X10.3.1, 10.3.2, 10.3.3, 10.3.4ppcJDK 1.4.x
Mac OS X10.3.8ppcMac OS X 10.3.8 Server; using 1.3 JVM: java.vm.version=1.3.1_03-76, mrj.version=3.3.3; using 1.4 JVM: java.vm.version=1.4.2-38; mrj.version=141.3
Windows 954.0x86
Windows 984.10x86Note, that if you run Sun JDK 1.2.1 or 1.2.2 Windows 98 identifies itself as Windows 95.
Windows Me4.90x86
Windows NT4.0x86
Windows 20005.0x86
Windows XP5.1x86Note, that if you run older Java runtimes Windows XP identifies itself as Windows 2000.
Windows 20035.2x86java.vm.version=1.4.2_06-b03; Note, that Windows Server 2003 identifies itself only as Windows 2003.
Windows CE3.0 build 11171armCompaq iPAQ 3950 (PocketPC 2002)
OS/220.40x86
Solaris2.xsparc
SunOS5.7sparcSun Ultra 5 running Solaris 2.7
SunOS5.8sparcSun Ultra 2 running Solaris 8
SunOS5.9sparcJava(TM) 2 Runtime Environment, Standard Edition (build 1.4.0_01-b03)
Java HotSpot(TM) Client VM (build 1.4.0_01-b03, mixed mode)
MPE/iXC.55.00PA-RISC
HP-UXB.10.20PA-RISCJDK 1.1.x
HP-UXB.11.00PA-RISCJDK 1.1.x
HP-UXB.11.11PA-RISCJDK 1.1.x
HP-UXB.11.11PA_RISCJDK 1.2.x/1.3.x; note Java 2 returns PA_RISC and Java 1 returns PA-RISC
HP-UXB.11.00PA_RISCJDK 1.2.x/1.3.x
HP-UXB.11.23IA64NJDK 1.4.x
HP-UXB.11.11PA_RISC2.0JDK 1.3.x or JDK 1.4.x, when run on a PA-RISC 2.0 system
HP-UXB.11.11PA_RISCJDK 1.2.x, even when run on a PA-RISC 2.0 system
HP-UXB.11.11PA-RISCJDK 1.1.x, even when run on a PA-RISC 2.0 system
AIX5.2ppc64sun.arch.data.model=64
AIX4.3Power
AIX4.1POWER_RS
OS/39039002.10.00J2RE 1.3.1 IBM OS/390 Persistent Reusable VM
FreeBSD2.2.2-RELEASEx86
Irix6.3mips
Digital Unix4.0alpha
NetWare 4.114.11x86
OSF1V5.1alphaJava 1.3.1 on Compaq (now HP) Tru64 Unix V5.1
OpenVMSV7.2-1alphaJava 1.3.1_1 on OpenVMS 7.2

其它代码主要是ServerChannel和ServerIoHandler类,但是本版本这两个类的代码都比较简单,以上代码片段主要是本人认为,需要特别说明的地方。更全的代码可在Github上查看。

本项目,主要采用以上开源框架技术。另外再从设置上或者代码上,进行优化。最终期望,本项目成为一个高负载,高并发的TCP服务器。本系列文章主要记录本项目开发的过程,以及过程中遇到的问题。记录其的主要目的,是想让自己能够在开发之后,更系统,全面且静下心来梳理相关知识点。与此同时,提高自己,也希望对其它准备相关项目的小伙伴,起到抛砖引玉的作用。当然,只要是代码就会BUG,如果看过文章,你发现有什么不对或者不合理地方,非常欢迎和谢谢指正。

当然最好最直接的方式,是通过页面底的众多联系方式找到我,和我直接开聊讨论。

具体的联系有QQ号:2091263530,QQ群:688543468

或者关注我们公众号”微家频道“,或者微博”微家频道“。


阿里云大力度优惠.云服务器最低可以两折起。也很多优惠券。具体【点击优惠进行详细了解。

诗与远方

  • 请你用慈悲心和温和的态度
    把你的不满与委屈说出来
    别人就容易接受得多地多

诗与远方

  • 诚实的面对你内心的矛盾和缺点
    不要欺骗你自己

诗与远方

  • 成功要爬上梯子才能到达
    双手插在口袋里的人是爬不上去的

诗与远方

  • 良心是每一个人最公正的审判官
    你骗得了别人
    却永远骗不了你自己的良心

诗与远方

  • 不要因为小小的争执
    疏远了你的至亲好友
    也不要因为小小的怨恨
    忘记了别人的恩情

诗与远方

  • 凡是能多站在别人的角度着想
    就能做到,理解,体谅

诗与远方

  • 当幻想和现实面对时
    总是很痛苦的
    要么你被痛苦击倒
    要么你把痛苦踩在脚下

诗与远方

  • 梯子的梯阶从来不是用来搁脚的
    它只是让人们的脚踏上去
    以便让另一只脚能够再往上攀登

诗与远方

  • 毁灭一个人只要一句话
    培植一个人却要千句话
    所以请你多多口下留情

诗与远方

  • 财以不炫为富,官以不显为贵
    名以不彰为誉,施以不报为惠

诗与远方

  • 世界原本就不是属于你
    因此你用不着抛弃
    要抛弃的是一切的执着
    万物皆为我所用,但非我所属

诗与远方

  • 只要自觉心安,东西南北都好
    如有一人未度,切莫自觉逃了

诗与远方

  • 崇高的理想就像生长在高山上的鲜花
    如果要摘下它
    勤奋才是攀登的途径

诗与远方

  • 人之谤我也
    与其能辩,不如能容
    人之侮我也
    与其能防,不如能化

诗与远方

  • 不要在你的智慧中夹杂着傲慢
    不要使你的谦虚缺乏智慧

诗与远方

  • 看透大事者超脱,看不透者执着
    看透小事者豁达,看不透者计较

诗与远方

  • 坚韧是成功的一大要素
    只要在成功之门上敲得够久够大声
    终会把成功唤醒

诗与远方

  • 根本不必回头去看咒骂你的人是谁
    如果有一条疯狗咬了你一口
    难道你也要趴下去反咬它一口吗

诗与远方

  • 交有道之人,莫结无义之友
    饮清净之茶,莫贪花色之酒
    开方便之门,闲是非之口

诗与远方

  • 谦虚但不自卑
    自信但不自大
    自由但不放纵
    人一生很难做到这三点

诗与远方

  • 活着一天,就是有福气,就该珍惜
    当我哭泣没有鞋子穿的时候
    我发现有人没有脚……

诗与远方

  • 不要让追求之舟停泊在幻想的港湾
    而应扬起奋斗的风帆
    驶向现实生活的大海

诗与远方

  • 不要刻意去猜测他人的想法
    如果你没有智慧与经验的正确判断
    通常都会有偏差的

诗与远方

  • 心中装满自己的看法与想法的人
    是听不见别人的声音的

诗与远方

  • 要了解一个人
    只需要看他的出发点与目的地是否相同
    就可以知道他是否真心

诗与远方

  • 一个人如果不能从内心去原谅别人
    那他就放不下怨恨,得不到快乐的生活

诗与远方

  • 你不要一直不满人家
    你应该一直检讨自己才是
    不满人家,是苦了你自己

诗与远方

  • 你硬要把单纯的事情看得很复杂
    那你会很痛苦

诗与远方

  • 当你劝告别人时
    若不顾及别人的自尊心
    那么再好的言语都是没有用的

诗与远方

  • 一份耕耘,一份收获,付出就会有回报
    不曾遭遇过失败,因为一直往成功方向发展
    所碰到的都是暂时的挫折

诗与远方

  • 同样的瓶子
    你为什么要装毒药呢
    同样的心理
    你为什么要充满着烦恼呢

诗与远方

  • 把气氛的心境转化为柔和
    把柔和的心境转化为爱
    如此,这个世间将更加完美

诗与远方

  • 说话不要有攻击性
    不要有杀伤力
    不夸已能,勿扬人恶,自然能化敌为友

诗与远方

  • 如果你不给自己烦恼
    别人也永远不可能给你烦恼
    因为你不会放在自己的心上

诗与远方

  • 懦弱的人只会裹足不前
    莽撞的人只能引火烧身
    只有真正勇敢的人才能所向披靡

诗与远方

  • 多一分心力去注意别人
    就少一分心力反省自己

诗与远方

  • 有时候我们要冷静问问自己
    我们再追求什么
    我们活着为了什么

诗与远方

  • 彩云飘在空中,自然得意洋洋
    但最多智能换取几声赞美
    唯有化作雨并倾注于土壤之中
    才能给世界创造芳菲

诗与远方

  • 当你快乐时你要想,这快乐不是永恒的
    当你痛苦时你要想,这痛苦也不是永恒的

诗与远方

  • 快乐是一份自然
    做自己想做的事
    做好自己选择的事
    自然地做人,自然地笑,自然地生活

诗与远方

  • 狂妄的人有救
    自卑的人没有救
    认识自己,相信自己,改变自己
    才能改变别人对你的态度

诗与远方

  • 只要永不放弃,持之以恒
    每次挫折,都是你进步的阶梯
    如果你逃避退缩,那就等于自毁前途

诗与远方

  • 用伤害别人的手段来掩饰自己缺点的人是可耻的

诗与远方

  • 玩像玩的,干像干的
    人生苦短,能享受时就享受,能轻松时就轻松
    不要跟自己过不去,要保持一种良好的心境

诗与远方

  • 责人要含蓄,忌太尽
    劝人要委婉,忌太直
    警人要疑似,忌太真

诗与远方

  • 你一定要宽恕众生
    不论他有多坏,甚至伤害过你
    你只有放下了,才能得到真正的快乐

诗与远方

  • 要是面前有一堵墙
    不要轻易退缩逃避
    要想办法绕过去,超越过去
    即使有困难也不要轻易放弃

诗与远方

  • 势不可使尽,聪明不可用尽
    福不可享尽,便宜不可占尽

诗与远方

  • 当你对自己诚实的时候
    世界上没有人能够欺骗得了你

诗与远方

  • 心是最大的骗子
    别人能骗你一时
    而它却会骗你一辈子

诗与远方

  • 大多数的人一辈子只做了三件事
    自欺,欺人,被人欺

诗与远方

  • 一个人如果没有感受过苦难
    就不会体会到他人的苦难
    你要学救苦救难的精神,就得先受苦受难

诗与远方

  • 每一个人都拥有生命
    但并非每个人都懂得生命,珍惜生命
    不了解生命的人,体会不到生命的价值

诗与远方

  • 生活可以是甜的,也可以是苦的
    但不能是没味的
    你可以胜利,也可以失败
    但你不能屈服

随意打赏