1. 程式人生 > >Netty搭建Socket伺服器(第一天學習)

Netty搭建Socket伺服器(第一天學習)

為什麼要學習netty

    當你寫了一段時間的客戶端以後你會發現除非你想寫opengl或者提別的複雜的圖形演算法,否則你不得不承認你只會寫一些邏輯的顯示,至於那些現在流行的,高併發,大資料,人工智慧就會越來越遠,於是我準備學習高併發的相關知識,順便也可以總結一下以前學習的c的linux網路程式設計的一些基礎知識。參考書(netty實戰)

第一天學習的程式碼

    我這裡的程式碼是jdk1.8

    使用工具Eclipse

    使用的netty-all-4.0.56.Final 這個版本

主類Hello_Server

package demo1;

import io.netty.bootstrap.ServerBootstrap;//伺服器執行緒
import io.netty.channel.ChannelFuture;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;

public class Hello_Server {
	private static final int portNumber = 7878;//埠
	public static void main(String[] args) throws InterruptedException{
		// TODO Auto-generated method stub
		EventLoopGroup bossGroup = new NioEventLoopGroup();//主執行緒
		EventLoopGroup workGroup = new NioEventLoopGroup();//工作執行緒
		try
		{
			System.out.print("伺服器已經啟動");
			ServerBootstrap b = new ServerBootstrap();
			b.group(bossGroup,workGroup);//裝入執行緒
			b.channel(NioServerSocketChannel.class);//制定Nio傳輸
			b.childHandler(new HelloServerInitializer());//新增到子channel的ChannelPipeline裡面
			ChannelFuture f = b.bind(portNumber).sync();//繫結埠
			
			f.channel().closeFuture().sync();//關閉
		}
		finally {
			bossGroup.shutdownGracefully();//關閉執行緒
			workGroup.shutdownGracefully();
		}
	}
}

對應的pipeline繫結事件類

HelloServerInitializer.java

package demo1;

import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.DelimiterBasedFrameDecoder;
import io.netty.handler.codec.Delimiters;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;

public class HelloServerInitializer extends ChannelInitializer<SocketChannel> {
	//初始化對的一些操作
	@Override
	protected void initChannel(SocketChannel ch) throws Exception
	{
		ChannelPipeline pipeline = ch.pipeline();//獲得連線
		//解析方式以\n作為標記
		pipeline.addLast("framer",new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter()));
		pipeline.addLast("decoder",new StringDecoder());
		pipeline.addLast("encode",new StringEncoder());
		//自己的邏輯
		pipeline.addLast("handler",new HelloServerHandler());
	}
}

處理我自己邏輯的類

HelloServerHandler.java

package demo1;

import java.net.InetAddress;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;

public class HelloServerHandler extends SimpleChannelInboundHandler<String> {
	//收到資料
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, String msg)
            throws Exception {
        //ChannelHandlerContext 返回事件的物件
        // 收到訊息直接列印輸出
        System.out.println(ctx.channel().remoteAddress() + " Say : " + msg);

        // 返回客戶端訊息 - 我已經接收到了你的訊息
        ctx.writeAndFlush("Received your message !");
    }
    
    
    /*
     * 如果連線錯誤事件
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
    	// TODO Auto-generated method stub
    	cause.printStackTrace();
    	ctx.close();
    }
    

    /*
     * 覆蓋 channelActive 方法 在channel被啟用的時候觸發 (在建立連線的時候)
     * channelActive 和 channelInActive 在後面的內容中講述,這裡先不做詳細的描述
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        System.out.println("RamoteAddress : " + ctx.channel().remoteAddress()
                + " active !");
        ctx.writeAndFlush("Welcome to "
                + InetAddress.getLocalHost().getHostName() + " service!\n");
        super.channelActive(ctx);
    }
}

使用dos命令telnet 127.0.0.1 7878來做連線測試如果成功如圖所示


這說明我的初級伺服器已經連線成功!當然還有不完善的地方比如不能傳送中文。

相關推薦

Netty搭建Socket伺服器第一學習

為什麼要學習netty    當你寫了一段時間的客戶端以後你會發現除非你想寫opengl或者提別的複雜的圖形演算法,否則你不得不承認你只會寫一些邏輯的顯示,至於那些現在流行的,高併發,大資料,人工智慧就會越來越遠,於是我準備學習高併發的相關知識,順便也可以總結一下以前學習的c

搭建SVN伺服器centos 7.3

一、安裝svn # 安裝subversion yum install subversion # 檢視subversion的安裝路徑 rpm -ql subversion 二、建立svn版本庫 # 建立svn版本庫所在目錄 mkdir -p /data/svn/svn_repo

吳伯凡-自我迭代與自我迭代的第一步--》模式識別第一更新

自我迭代 什麼是自我迭代 簡單的講自我迭代就是對自己的認知系統,進行持續系統的優化 那怎麼樣進行自我迭代呢? 自我迭代的第一步就是,要找準自己的定位,說的大白話一些,就是要認清自己是那塊料,古人不是常說人貴有自知之明嘛,說的就是這個意思 而比較好的教育方式,是因材施教,而這要求老師有能力去發現每個學

centos7搭建git伺服器多使用者版

建立倉庫並分享到組: git init --shared=group test 建立組: groupadd git 切換專案所屬組: chgrp -R git test 建立使用者1: useradd test1 -g git passwd test1 建立使用者2

centOS7 搭建LAMP伺服器apache+php+MariaDB

安裝httpd yum install httpd 配置ServerName vi /etc/httpd/conf/httpd.conf 將#ServerName www.example.com:80修改為ServerName localhost:80

2018年10月06號第一視訊

** 第一天視訊總結 *學習linux終端命令 注意:命令大小寫要分清楚 1.cd為切換路徑 2.pwd為檢視當前目錄位置 3.clear為清空 4.絕對路徑是可以從home資料夾的python目錄直接跳轉到boot資料夾:當前目錄為home:cd /boot

Centos7搭建JavaWeb伺服器Java+MySQL+Tomcat

0、資原始檔 百度網盤連結: java+tomcatLinux安裝包: linux連線工具SmarTTY(比較好用,支援windows向虛擬機器上傳檔案): 1、Centos7環境 利用VMware Workstation,並新建安裝虛擬機器CentOS7

node 搭建簡單伺服器-用於mock資料

 1.安裝express依賴(是一個基於 Node.js 平臺,快速、開放、極簡的 Web 開發框架)     npm install express --save 2.看程式碼就好了   node  serves.js就能開啟服務 //安裝express依賴 並用變數

Centos7安裝搭建FTP伺服器最簡便方法

  簡介: vsftpd 是“very secure FTP daemon”的縮寫,安全性是它的一個最大的特點。 vsftpd 是一個 UNIX 類作業系統上執行的伺服器的名字,它可以執行在諸如 Linux、BSD、Solaris、 HP-UNIX等系統上面,是一個完全免費的、開放原始碼的

FastDFS+Nginx搭建圖片伺服器親測OK

前言 操作環境:CentOS7 X64,以下操作都是單機環境。 我把所有的安裝包下載到/softpackage/下,解壓到當前目錄。 先做一件事,修改hosts,將檔案伺服器的ip與域名對映(單機TrackerServer環境),因為後面很多配置裡面都需要去配置伺服器地址,ip變

搭建git伺服器在windows server

專案程式碼的分支管理一直是一個很頭疼的問題,因為使用的是svn。於是開始嘗試使用git。目前公共的git伺服器使用量比較廣泛就是github和碼雲。github私有庫是收費的,碼雲雖然不收費,但是使用者數量有限制。想著還是自己搭建一個git伺服器吧。搭建的環境是在window

搭建Git伺服器Ubuntu虛擬機器和windows客戶端

         一直以來用Git都是用的別人的伺服器, 比如oschina 和github,  今天因為工作需要在自己的ubuntu上搭建了自己Git 伺服器, 以下記錄一些步驟和碰到的問題

搭建 Git 伺服器基於 CentOS 7

對於規模比較小的團隊,可以直接搭建 Git 伺服器,逐個收集研發同學的證書配置進來即可。如果團隊規模比較大,可以直接採用 GitLab、Drone 等現成的帶有許可權管理的 Git 服務。 伺服器端操作 安裝 Git 對於 CentOS,可以直

spring cloud系列一 搭建配置伺服器分散式配置管理configserver

分散式配置管理應該是分散式系統和微服務應用的第一步。想象一下如果你有幾十個服務或應用需要配置,而且每個服務還分為開發、測試、生產等不同維度的配置,那工作量是相當大的,而且還容易出錯。如果能把各個應用的

Centos7搭建DNS伺服器僅正解

本文介紹一下DNS伺服器的搭建 用的是3臺伺服器: linux主機:192.168.1.200/24作為DNS伺服器 server主機:192.168.1.201/24作為需要被解析的主機 linux主機:192.168.1.202/24作為被解析的主機

python3第一學習數據類型

絕對值 pre return col pytho tar .html art 整數 參考blog地址:http://www.cnblogs.com/wupeiqi/articles/5444685.html,然後根據上面知識點練習並總結。 一.數字(int) 1.數字

C語言學習第一

項目 align getchar include 下載安裝 類型 reg 程序 nbsp 1、工具和資源   Visual Studio 2017社區免費版,使用Visual Studio Installer下載安裝,安裝完成點擊修改,安裝C++桌面模塊。   根據C Pr

Golang學習(第一 IDE--goland快捷鍵對應的VS類似快捷鍵

Goland常用快捷鍵 檔案相關快捷鍵: CTRL+E,開啟最近瀏覽過的檔案。 CTRL+SHIFT+E,開啟最近更改的檔案。 CTRL+N,可以快速開啟struct結構體。 CTRL+SHIFT+N,可以快速開啟檔案。 程式碼格式化: CTRL+ALT+T,可以把程式碼包在一個塊內,例如i

tensorflow學習筆記第一-深度卷積神經網路

一、在這裡首先需要了解一些概念性的東西,當然我是才接觸,還不太熟悉: 1.numpy      NumPy系統是Python的一種開源的數值計算擴充套件。這種工具可用來儲存和處理大型矩陣,比Python自身的巢狀列表(nested l

tensorflow學習筆記第一-MNIST機器學習入門

MNIST機器學習入門 這個是關於tensorflow的中文文件: http://wiki.jikexueyuan.com/project/tensorflow-zh/tutorials/mnist_beginners.html MNIST是一個入門級的