1. 使用Floodlight管理OVS桥

  (1) 下载:https://codeload.github.com/floodlight/floodlight/tar.gz/v1.2
  (2) tar xf floodlight-1.2.tar.gz -C /tmp
    cd /tmp/floodlight-1.2
    make #只需要make下即可生成 floodlight.jar
    ./floodlight.sh #启动floodlight.

  (3)ovs-vsctl set-controller ovs-switch tcp:192.168.10.10:6653
   当 OVS 交换机连接到 Floodlight 控制器后,理论上所有的流表规则应该交给控制器来建立。由于 OVS 交换机和控制器之间是通过网络通讯来传递数据的,所以网络连接失败会影响到 Flow 的建立。针对这种情况,OVS 提供了两种处理模式:
  • standlone: 默认模式。如果 OVS 交换机超过三次无法正常连接到 OpenFlow 控制器,OVS 交换机自己会负责建立流表。在这种模式下,OVS 和常见的 L2 交换机相似。与此同时,OVS 也会继续尝试连接控制器,一旦网络连接恢复,OVS 会再次切换到使用控制器进行流表管理。
  • secure: 在 secure 模式下,如果 OVS 无法正常连接到 OpenFlow 控制器,OVS 会不停的尝试与控制器重新建立连接,而不会自己负责建立流表。

  (4) 设置 OVS 的连接模式为 secure 模式
    ovs-vsctl set Bridge ovs-switch fail-mode=secure

  (5) 查看 OVS 的状态,“is_connected:true”代表 OVS 已经成功连接到了 Floodlight
    ovs-vsctl show
     30282710-d401-4187-8e13-52388f693df7
      Bridge ovs-switch
        Controller "tcp:192.168.10.10:6653"
          is_connected: true

  (6) 连接Floodlight Web GUI
    http://192.168.10.10:8080/ui/index.html

  (7) Floodlight RESTServer的参考资料:
    FloodLight开发者文档(译文),共五页
    文档一: http://blog.csdn.net/sherkyoung/article/details/27826277

2. OVS多路径 与 STP 实验.
  参考:openvswitch group(select) to multipatch:http://www.lofter.com/tag/OpenvSwitch

  拓扑结构
  每个OVS 交换机连线上的数字为:OVS OpenFlow Port编号.

    

    实验步骤:
    (1) 构建拓扑结构
      # 创建OVS交换机
      ovs-vsctl add-br s1
      ovs-vsctl add-br s21
      ovs-vsctl add-br s22
      ovs-vsctl add-br s23
      ovs-vsctl add-br s3

      # 创建Network Namesapce,来充当虚拟PC
      ip netns add c1    #ip netns若不支持,需升级iproute*.rpm.
      ip netns add c2
      ip netns add c3
      ip netns add h1
      ip netns add h2
      ip netns add h3

      # OVS交换机 S1 上的连线
      ovs-vsctl add-port s1 c1
      ovs-vsctl set interface c1 type=internal
      ip link set c1 netns c1
      ip netns exec c1 ifconfig c1 192.168.0.101/24 up

      ovs-vsctl add-port s1 c2
      ovs-vsctl set interface c2 type=internal
      ip link set c2 netns c2
      ip netns exec c2 ifconfig c2 192.168.0.102/24 up

      ovs-vsctl add-port s1 c3
      ovs-vsctl set interface c3 type=internal
      ip link set c3 netns c3
      ip netns exec c3 ifconfig c3 192.168.0.103/24 up

      # OVS交换机 S3 上的连线
      ovs-vsctl add-port s3 h1
      ovs-vsctl set interface h1 type=internal
      ip link set h1 netns h1
      ip netns exec h1 ifconfig h1 192.168.0.1/24 up

      ovs-vsctl add-port s3 h2
      ovs-vsctl set interface h2 type=internal
      ip link set h2 netns h2
      ip netns exec h2 ifconfig h2 192.168.0.2/24 up

      ovs-vsctl add-port s3 h3
      ovs-vsctl set interface h3 type=internal
      ip link set h3 netns h3
      ip netns exec h3 ifconfig h3 192.168.0.3/24 up

      # OVS交换机 S1 与 S21、S22、S23的连线
      ovs-vsctl add-port s1 s1-s21
      ovs-vsctl set interface s1-s21 type=patch options:peer=s21-s1
      ovs-vsctl add-port s21 s21-s1
      ovs-vsctl set interface s21-s1 type=patch options:peer=s1-s21

      ovs-vsctl add-port s1 s1-s22
      ovs-vsctl set interface s1-s22 type=patch options:peer=s22-s1
      ovs-vsctl add-port s22 s22-s1
      ovs-vsctl set interface s22-s1 type=patch options:peer=s1-s22

      ovs-vsctl add-port s1 s1-s23
      ovs-vsctl set interface s1-s23 type=patch options:peer=s23-s1
      ovs-vsctl add-port s23 s23-s1
      ovs-vsctl set interface s23-s1 type=patch options:peer=s1-s23

      # OVS交换机 S3 与 S21、S22、S23的连线
      ovs-vsctl add-port s3 s3-s21
      ovs-vsctl set interface s3-s21 type=patch options:peer=s21-s3
      ovs-vsctl add-port s21 s21-s3
      ovs-vsctl set interface s21-s3 type=patch options:peer=s3-s21

      ovs-vsctl add-port s3 s3-s22
      ovs-vsctl set interface s3-s22 type=patch options:peer=s22-s3
      ovs-vsctl add-port s22 s22-s3
      ovs-vsctl set interface s22-s3 type=patch options:peer=s3-s22

      ovs-vsctl add-port s3 s3-s23
      ovs-vsctl set interface s3-s23 type=patch options:peer=s23-s3
      ovs-vsctl add-port s23 s23-s3
      ovs-vsctl set interface s23-s3 type=patch options:peer=s3-s23

      #启动STP(生成树协议)
      ovs-vsctl set bridge s1 stp_enable=true
      ovs-vsctl set bridge s21 stp_enable=true
      ovs-vsctl set bridge s22 stp_enable=true
      ovs-vsctl set bridge s23 stp_enable=true
      ovs-vsctl set bridge s3 stp_enable=true

    # 启动STP后, 被block的接口
    ovs-vsctl list port |grep -E 'name|status'
      name : "s21-s1"
      status : {stp_port_id="8001", stp_role=root, stp_sec_in_state="8414", stp_state=forwarding}
      name : "s1-s21"
      status : {stp_port_id="8003", stp_role=designated, stp_sec_in_state="8414", stp_state=forwarding}
      name : "s3-s21"
      status : {stp_port_id="8002", stp_role=alternate, stp_sec_in_state="8442", stp_state=blocking}
      name : "s22-s1"
      status : {stp_port_id="8001", stp_role=root, stp_sec_in_state="8414", stp_state=forwarding}
.      ...
      name : "s3-s22"
      status : {stp_port_id="8001", stp_role=root, stp_sec_in_state="8414", stp_state=forwarding}
      name : "s1-s23"
      status : {stp_port_id="8001", stp_role=designated, stp_sec_in_state="8414", stp_state=forwarding}
      name : "s3-s23"
      status : {stp_port_id="8003", stp_role=alternate, stp_sec_in_state="8442", stp_state=blocking}
      name : "s23-s3"
      status : {stp_port_id="8001", stp_role=designated, stp_sec_in_state="8414", stp_state=forwarding}
      name : "s1-s22"
      status : {stp_port_id="8002", stp_role=designated, stp_sec_in_state="8414", stp_state=forwarding}
      name : "s23-s1"
      status : {stp_port_id="8002", stp_role=root, stp_sec_in_state="8414", stp_state=forwarding}
      name : "s22-s3"
      status : {stp_port_id="8002", stp_role=designated, stp_sec_in_state="8414", stp_state=forwarding}
      name : "s21-s3"
      status : {stp_port_id="8002", stp_role=designated, stp_sec_in_state="8414", stp_state=forwarding}

  # 由于STP启动后,它会自动发现环路,并阻塞部分冗余链路防止环路.但这就妨碍了
  # 我们多路径的实现需求。
  # 关闭STP,添加OpenFLow规则,避免手动避免环路.
  # 禁止STP
    ovs-vsctl set bridge s1 stp_enable=false
    ovs-vsctl set bridge s21 stp_enable=false
    ovs-vsctl set bridge s22 stp_enable=false
    ovs-vsctl set bridge s23 stp_enable=false
    ovs-vsctl set bridge s3 stp_enable=false

  #S1上添加多路径规则
  # 修改OVS 交换机支持的OpenFlow版本为OpenFlow 1.3,默认支持OpenFlow 1.0
    ovs-vsctl set bridge s1 protocols=OpenFlow13
    ovs-vsctl set bridge s21 protocols=OpenFlow13
    ovs-vsctl set bridge s22 protocols=OpenFlow13
    ovs-vsctl set bridge s23 protocols=OpenFlow13
    ovs-vsctl set bridge s3 protocols=OpenFlow13

  # 在S1上添加实现多路径的组.
    ovs-ofctl -O OpenFlow13 add-group s1 \
      group_id=5566,type=select,bucket=output:4,bucket=output:5,bucket=output:6
  # 查看添加的组规则
    ovs-ofctl -O OpenFlow13 dump-groups s1
      OFPST_GROUP_DESC reply (OF1.3) (xid=0x2):
      group_id=5566,type=select,bucket=actions=output:4,bucket=actions=output:5,bucket=actions=output:6

  # 在S1上添加C1、C2、C3进入的流规则
  # (1) 把端口1~3进入的流量都定向导组ID为5566的多路径桶中,让其自动选择转发端口.
    ovs-ofctl -O OpenFlow13 add-flow s1 priority=10,in_port=1,actions=group:5566
    ovs-ofctl -O OpenFlow13 add-flow s1 priority=10,in_port=2,actions=group:5566
    ovs-ofctl -O OpenFlow13 add-flow s1 priority=10,in_port=3,actions=group:5566

  # (2) 添加进入C1~3的流规则
    ovs-ofctl -O OpenFlow13 add-flow s1 priority=1,ip,ip_dst=192.168.0.101,actions=output:1
    ovs-ofctl -O OpenFlow13 add-flow s1 priority=1,ip,ip_dst=192.168.0.102,actions=output:2
    ovs-ofctl -O OpenFlow13 add-flow s1 priority=1,ip,ip_dst=192.168.0.103,actions=output:3

    ovs-ofctl -O OpenFlow13 add-flow s1 priority=1,arp,ip_dst=192.168.0.101,actions=output:1
    ovs-ofctl -O OpenFlow13 add-flow s1 priority=1,arp,ip_dst=192.168.0.102,actions=output:2
    ovs-ofctl -O OpenFlow13 add-flow s1 priority=1,arp,ip_dst=192.168.0.103,actions=output:3
  # 注:
    # 添加priority是希望,流规则匹配时优先匹配协议地址,若是去往S1直连主机,则可直接转发.
    # 避免先走多路径导致网络不通 或 多走冤枉路。优先级的值是越小越优先。
  #疑问:
    # OpenFlow中有0~254张流表,ovs-ofctl命令中mod-table参数可修改流表的行为,其中man手册中
    #说OpenFlow1.0流表匹配是从0查到254,找到第一个匹配流表项终止,OpenFlow1.2以上,似乎不是这样,
    #我测试了将ip,arp的匹配项放到table 0中, 将多路径的匹配项放到table 1中,但发现table 1中没有任何
    #匹配项,而且C1 ping h1~3都不通. 接着我将所有表项都放到table 1中,结果全都不通了,而且流表项都
    #没有匹配. 我尝试 ovs-ofctl -O OpenFlow13 mod-table s1 1 continue,修改流表匹配行为,但没有
    #效果,因此想通过在不同流表中添加规则实现优先的方式,我没能实现. 还没需继续学习。

  # 在S21、S22、S23上添加防止环路的流规则
    ovs-ofctl -O OpenFlow13 add-flow s21 in_port=1,actions=output:2
    ovs-ofctl -O OpenFlow13 add-flow s21 in_port=2,actions=output:1
    ovs-ofctl -O OpenFlow13 add-flow s22 in_port=1,actions=output:2
    ovs-ofctl -O OpenFlow13 add-flow s22 in_port=2,actions=output:1
    ovs-ofctl -O OpenFlow13 add-flow s23 in_port=1,actions=output:2
    ovs-ofctl -O OpenFlow13 add-flow s23 in_port=2,actions=output:1

  # 在S3上添加流规则
    ovs-ofctl -O OpenFlow13 add-flow s3 ip,ip_dst=192.168.0.1,actions=output:1
    ovs-ofctl -O OpenFlow13 add-flow s3 ip,ip_dst=192.168.0.2,actions=output:2
    ovs-ofctl -O OpenFlow13 add-flow s3 ip,ip_dst=192.168.0.3,actions=output:3

    ovs-ofctl -O OpenFlow13 add-flow s3 arp,ip_dst=192.168.0.1,actions=output:1
    ovs-ofctl -O OpenFlow13 add-flow s3 arp,ip_dst=192.168.0.2,actions=output:2
    ovs-ofctl -O OpenFlow13 add-flow s3 arp,ip_dst=192.168.0.3,actions=output:3

    ovs-ofctl -O OpenFlow13 add-flow s3 ip,ip_dst=192.168.0.101,actions=output:4
    ovs-ofctl -O OpenFlow13 add-flow s3 ip,ip_dst=192.168.0.102,actions=output:5
    ovs-ofctl -O OpenFlow13 add-flow s3 ip,ip_dst=192.168.0.103,actions=output:6

    ovs-ofctl -O OpenFlow13 add-flow s3 arp,ip_dst=192.168.0.101,actions=output:4
    ovs-ofctl -O OpenFlow13 add-flow s3 arp,ip_dst=192.168.0.102,actions=output:5
    ovs-ofctl -O OpenFlow13 add-flow s3 arp,ip_dst=192.168.0.103,actions=output:6

  #查看流规则
    ovs-ofctl -O OpenFlow13 dump-flows s1

  #测试:
    # C1 ping C2
    [root@node2 ~]# ip netns exec c1 ping 192.168.0.102
      PING 192.168.0.102 (192.168.0.102) 56(84) bytes of data.
      64 bytes from 192.168.0.102: icmp_seq=1 ttl=64 time=1.47 ms

    # C1 ping h1
    [root@node2 ~]# ip netns exec c1 ping 192.168.0.1
      PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
      64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=6.32 ms

    # h1 ping C3
    [root@node2 ~]# ip netns exec h1 ping 192.168.0.103
      PING 192.168.0.103 (192.168.0.103) 56(84) bytes of data.
      64 bytes from 192.168.0.103: icmp_seq=1 ttl=64 time=4.02 ms

    # h1 ping h3
    [root@node2 ~]# ip netns exec h1 ping 192.168.0.3
      PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.
      64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=2.50 ms

  # 查看流规则匹配情况,n_packets 可用来判断流规则匹配次数.
    [root@node2 ~]# ovs-ofctl -O OpenFlow13 dump-flows s1
      OFPST_FLOW reply (OF1.3) (xid=0x2):
      cookie=0x0, duration=12107.097s, table=0, n_packets=4, n_bytes=168, priority=1,arp,arp_tpa=192.168.0.103 actions=output:3
      cookie=0x0, duration=12152.967s, table=0, n_packets=4, n_bytes=392, priority=1,ip,nw_dst=192.168.0.101 actions=output:1
      cookie=0x0, duration=12121.400s, table=0, n_packets=2, n_bytes=84, priority=1,arp,arp_tpa=192.168.0.102 actions=output:2
      。。。。

3. OVS的SPAN功能测试
  SPAN:Switched Port Analyzer(交换端口分析器),这是一种交换机端口镜像技术,目的是将某些端口进入和出去的流量都,复制一份到指定端口 做协议分析.
    注:端口监控分为两种:本地SPAN 和 远程SPAN(RSPAN),RSPAN:通常采用VLAN来实现将跨交换机的复制端口流量.

  拓扑:

    

    本地SPAN:
    ovs-vsctl add-br s1

  # OVS交换机 S1 上的连线
    ovs-vsctl add-port s1 c1
    ovs-vsctl set interface c1 type=internal
    ip link set c1 netns c1
    ip netns exec c1 ifconfig c1 10.0.0.1/24 up

    ovs-vsctl add-port s1 c2
    ovs-vsctl set interface c2 type=internal
    ip link set c2 netns c2
    ip netns exec c2 ifconfig c2 10.0.0.2/24 up

    ovs-vsctl add-port s1 c3
    ovs-vsctl set interface c3 type=internal -- set port c3 tag=20
    ip link set c3 netns c3
    ip netns exec c3 ifconfig c3 10.0.0.3/24 up

  # OVS交换机 S3 上的连线
    ovs-vsctl add-port s3 h1
    ovs-vsctl set interface h1 type=internal -- set port h1 tag=10
    ip link set h1 netns h1
    ip netns exec h1 ifconfig h1 192.168.0.1/24 up

    ovs-vsctl add-port s3 h2
    ovs-vsctl set interface h2 type=internal -- set port h2 tag=10
    ip link set h2 netns h2
    ip netns exec h2 ifconfig h2 192.168.0.2/24 up

  # 将C1、C2的流量镜像到C3端口.
    ovs-vsctl set bridge s1 mirrors=@mymirror1 \
      -- --id=@monPort1 get port c1 \
      -- --id=@monPort2 get port c2 \
      -- --id=@AnalyzerPort get port c3 \
      -- --id=@mymirror1 \
      create mirror name=testMirror1 select-dst-port=@monPort1,@monPort2 output-port=@AnalyzerPort

  #查看Mirror配置
    [root@node2 ~]# ovs-vsctl list mirror
      _uuid : 2933ec23-2548-4726-9c0e-1af09be722e7
      external_ids : {}
      name : "testMirror1"
      output_port : 881345f5-af51-4a4c-9a74-7f0f1697f78e
      output_vlan : []
      select_all : false
      # "4eaa1eb5-3bc8-4df9-98c7-eaf254adacd4": 此为端口的uuid
      select_dst_port : [4eaa1eb5-3bc8-4df9-98c7-eaf254adacd4, 6ba87998-9176-499a-bfc7-ba6b054965ea]
      select_src_port : [4eaa1eb5-3bc8-4df9-98c7-eaf254adacd4, 6ba87998-9176-499a-bfc7-ba6b054965ea]
      select_vlan : []
      statistics : {tx_bytes=0, tx_packets=0}

  #查看C3端口上收到的报文:
    [root@node2 ~]# ip netns exec c3 tcpdump -enpi c3
      tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
      listening on c3, link-type EN10MB (Ethernet), capture size 65535 bytes
      03:38:47.558423 fa:9d:2c:d8:1c:f0 > Broadcast, ethertype ARP (0x0806), length 42: Request who-has 10.0.0.2 tell 10.0.0.1, length 28
      03:38:47.559365 da:a3:6e:d1:83:3c > fa:9d:2c:d8:1c:f0, ethertype ARP (0x0806), length 42: Reply 10.0.0.2 is-at da:a3:6e:d1:83:3c, length 28
      03:38:47.559488 fa:9d:2c:d8:1c:f0 > da:a3:6e:d1:83:3c, ethertype IPv4 (0x0800), length 98: 10.0.0.1 > 10.0.0.2: ICMP echo request, id 60252, seq 1, length 64
      03:38:47.559876 da:a3:6e:d1:83:3c > fa:9d:2c:d8:1c:f0, ethertype IPv4 (0x0800), length 98: 10.0.0.2 > 10.0.0.1: ICMP echo reply, id 60252, seq 1, length 64

  RSPAN的配置:
    ovs-vsctl \
      -- --id=@myMirror2 \
      create mirror name=testRSPAN select-all=true select-vlan=10 output-vlan=20 \
      -- set bridge s1 mirrors=@myMirror2

  GRE隧道的SPAN配置参考:
    ovs-vsctl add-br br0
    ovs-vsctl add-port br0 eth0
    ovs-vsctl add-port br0 tap0
    ovs-vsctl add-port br0 gre0 \
      -- set interface gre0 type=gre options:remote_ip=192.168.1.10 \
      -- --id=@p get port gre0 \
      -- --id=@m create mirror name=m0 select-all=true output-port=@p \
      -- set bridge br0 mirrors=@m

  删除SPAN 和 删除 GRE参考:
    ovs-vsctl clear bridge br0 mirrors
    ovs-vsctl del-port br0 gre0

OpenVSwitch2.0.0版本则参考配置:

  # ovs-vsctl -- set Bridge br-vxlan mirrors=@my1 \
       -- --id=@m1 get port tun0 -- --id=@a1 get port p1 \
       -- --id=@my1 create mirror name=t1 select-dst-port=@m1 select-src-port=@m1 output-port=@a1
    85df4437-c903-4110-9061-1d54d36c0427
  

  # ovs-vsctl list mirror
    _uuid : 85df4437-c903-4110-9061-1d54d36c0427
    external_ids : {}
    name : "t1"
    output_port : 206ace18-b3e6-4423-9216-5088a60b82c1
    output_vlan : []
    select_all : false
    select_dst_port : [8e1dd937-dd97-4446-89c8-af304ff960a5]
    select_src_port : [8e1dd937-dd97-4446-89c8-af304ff960a5]
    select_vlan : []
    statistics : {tx_bytes=0, tx_packets=0}

OpenVSwitch实验参考的更多相关文章

  1. (原创)openvswitch实验连载1-fedora 17下安装openvswitch

    1 软件安装 1.1测试环境和网络拓朴 大部分朋友估计也没有一个真实环境来完全整个的测试,所以我也是使用了在一台PC机上使用Vmware Workstation的方式来进行实验.总体结构是在PC机上安 ...

  2. (原创)openvswitch实验连载2-cisco模拟器IOU-Web安装及网络环境配置

    IOU的使用可以选择自己到官网https://docs.google.com/file/d/0B2AgRhS2cfxCQ01tN2NrQ0pvNUk/edit下载iou-web 软件,然后部署在lin ...

  3. VFP 实验参考答案

    1.    使用for循环计算1到1000之间能既能被7整除也能被11整除的所有的数的和.(结果为6006)源程序代码 sum=0 i=1 for i=1 to 1000 if((i%7=0) and ...

  4. 利用DoHome APP和音箱控制小车的实验参考步骤

    准备材料: Arduino Uno 一块 Arduino 扩展板        购买链接 DT-06模块一个       购买链接 安卓手机一个 小度音箱一个 小车一个 杜邦线若干 1.DT-06固件 ...

  5. 利用DoHome APP和音箱控制LED灯实验参考步骤

    准备材料: Arduino Uno 一块 Arduino 扩展板        购买链接 DT-06模块一个       购买链接 安卓手机一个 小度音箱一个 小灯珠一个 杜邦线若干 1.DT-06固 ...

  6. 利用DoHome APP和音箱控制继电器通断电实验参考步骤

    准备材料: Arduino Uno 一块 Arduino 扩展板        购买链接 DT-06模块一个       购买链接 安卓手机一个 小度音箱一个 继电器模块一个 杜邦线若干 1.DT-0 ...

  7. 干货分享: 长达150页的openvswitch的ppt,不实验无真相

    下载链接: Openvswitch实验教程 http://files.cnblogs.com/popsuper1982/Openvswtich.pptx 一.概论 Software Defined N ...

  8. 【uTenux实验】任务管理

    任务就是一个无限循环.uTenux提供的任务管理功能是很强大的,包括建立和删除一个任务,启动或退出任务,取消一个任务的启动请求,改变任务的优先级和査询任务状态,使任务进人睡眠状态和唤醒状态,取消唤醒请 ...

  9. 【uTenux实验】内存池管理(固定内存池和可变内存池)

    1.固定内存池管理实验 内存管理是操作系统的一个基础功能.uTenux的内存池管理函数提供了基于软件的内存池管理和内存块分配管理.uTenux的内存池有固定大小的内存池和大小可变的内存池之分,它们被看 ...

随机推荐

  1. 在Asp.Net Core MVC 3.0 视图运行时编译

    在正常情况下,视图在生成的时候就会变为 xxx.Views.dll,在开发的时候,这样很不方便,因为很多的时候,我们只是修改一个样式,调整一些JavaScript代码,这个时候要把项目调试暂停下来,生 ...

  2. 使用wcftestclient.exe测试时,增加“最大消息大小配额”--maxReceivedMessa

    使用 WcfTestClient.exe工具测试的时候,可能会出现:这样的提示: 已超过传入消息(65536)的最大消息大小配额.若要增加配额,请使用相应绑定元素上的 MaxReceivedMessa ...

  3. 【转载】socket通信-C#实现tcp收发字符串文本数据

    在日常碰到的项目中,有些场景需要发送文本数据,也就是字符串,比如简单的聊天文字,JSON字符串等场景.那么如何如何使用SharpSocket来收发此类数据呢?其中要掌握的关键点是什么呢? 点击查看原博 ...

  4. typing类型注解库

    简介 动态语言的灵活性使其在做一些工具,脚本时非常方便,但是同时也给大型项目的开发带来了一些麻烦. 自python3.5开始,PEP484为python引入了类型注解(type hints),虽然在p ...

  5. Dubbo(三):框架设计

    整体设计 图例说明: 图中左边淡蓝背景的为服务消费方使用的接口,右边淡绿色背景的为服务提供方使用的接口,位于中轴线上的为双方都用到的接口. 图中从下至上分为十层,各层均为单向依赖,右边的黑色箭头代表层 ...

  6. uni-app学习

    1. 学习uni-app 1.1. 概述 号称一次编写多端运行的前端框架,架构图如下 对某些不同平台的特殊功能,可以通过条件进行自动编译,也就是写两套代码,不同的环境会选择不同代码编译 1.2. 推荐 ...

  7. ajax往后台传值的一些方式

    $('#del1').click(function () { $.ajax({ url: 'http://localhost:8089/test1', data: {a: 1, b: 2}, type ...

  8. 英语rubyspinel红尖晶石rubyspinel单词

    红尖晶石(rubyspinel或Red spinel)其红色是因含铬而致^像红宝石和红色石榴子石一样,红 尖晶石也曾被叫作红玉,这就造成了红色宝石的混乱,因为世界上一些最大的著名“红宝 石”,如英国王 ...

  9. android scroller用法及属性

    正文 一.结构 public class Scroller extends Object java.lang.Object android.widget.Scroller 二.概述 这个类封装了滚动操 ...

  10. ES6 对象解构赋值(浅拷贝 VS 深拷贝)

    对象的扩展运算符(...)用于取出参数对象的所有可遍历属性,拷贝到当前对象之中. 拷贝对象 let aa = { age: 18, name: 'aaa' } let bb = {...aa}; co ...