作者:聂勇 欢迎转载,请保留作者信息并说明文章来源!
MySQL默认的utf8只支持三字节字符,不支持Emoji表情符(四字节),如果有四字节的字符写入会报错。从MySQL 5.5开始,提供了utf8mb4,支持四字节的字符。
许多使用iphone的用户来在填写昵称的时候会加入Emoji表情符,如果MySQL没有使用utf8mb4字符集,这样的昵称信息就无法写入。
|
|
Variable_name | Value |
---|---|
character_set_client | utf8 |
character_set_connection | utf8 |
character_set_database | utf8 |
character_set_filesystem | binary |
character_set_results | utf8 |
character_set_server | utf8 |
character_set_system | utf8 |
character_sets_dir | /home/sdkserver/local/mysql-5.5.43/share/charsets/ |
8 rows in set (0.00 sec)
|
|
Variable_name | Value |
---|---|
collation_connection | utf8_general_ci |
collation_database | utf8_unicode_ci |
collation_server | utf8_unicode_ci |
3 rows in set (0.00 sec)
打开MySQL的配置文件,将字符集的配置修改成如下:
|
|
Variable_name | Value |
---|---|
character_set_client | utf8mb4 |
character_set_connection | utf8mb4 |
character_set_database | utf8mb4 |
character_set_filesystem | binary |
character_set_results | utf8mb4 |
character_set_server | utf8mb4 |
character_set_system | utf8 |
character_sets_dir | /home/nieyong/local/mysql-5.5.43/share/charsets/ |
8 rows in set (0.00 sec)
|
|
Variable_name | Value |
---|---|
collation_connection | utf8mb4_general_ci |
collation_database | utf8mb4_general_ci |
collation_server | utf8mb4_general_ci |
3 rows in set (0.00 sec)
]]>作者:聂勇 欢迎转载,请保留作者信息并说明文章来源!
上一篇文章《Gson教程-自定义序列化》介绍了使用Gson的自定义序列化满足一些业务场景下的需求。同样的,反序列化(JSON字符串转换成Java对象)也需要自定义,使用方式与序列化一样,两步搞定:
JsonDeserializer
接口。注册
自定义的反序列化实现。1、有如下JSON字符串,需要转换成Person对象。
{“PersonName”:”aofeng”,”PersonAge”:32}
2、Person有两个属性:name和age,点击查看源代码。
实现JsonDeserializer接口的deserialize方法:
创建一个GsonBuilder,使用registerTypeAdapter
方法注册自定义的序列化实现,然后生成Gson对象来进行序列化。
运行上述代码,输出信息如下:
Person [name=aofeng, age=32]
附:完整的源代码
作者:聂勇 欢迎转载,请保留作者信息并说明文章来源!
上一篇文章《Gson教程-序列化与反序列化基础操作》介绍了Gson的特性和基本的使用方法。如果碰上一些特殊的使用场景:
怎么办呢?Gson提供了自定义
序列化和反序列化,并且实现也非常简单,两步搞定:
JsonSerializer
接口。注册
自定义的序列化实现。1、一个POJO类:Person
,有两个属性:name和age。源代码如下。
2、序列化成JSON字符串时,name字段名输出为PersonName,age字段名输出为PersonAge。
实现JsonSerializer接口的serialize方法,想怎么弄都可以随心所欲 :)
创建一个GsonBuilder,使用registerTypeAdapter
方法注册自定义的序列化实现,然后生成Gson对象来进行序列化。
运行上述代码,输出信息如下:
{“PersonName”:”aofeng”,”PersonAge”:32}
附:完整的源代码
作者:聂勇 欢迎转载,请保留作者信息并说明文章来源!
Gson是众多开源JSON类库中的一个,使用非常简单,使用toJson和fromJson方法可将JSON字符串和Java对象相互转换,主要的特性有:
下面,通过几段代码展示Gson如何将Java中常用的POJO、数组和集合序列化成JSON字符串,并反序列化。
1、一个POJO类:Person
,有两个属性:name和age。
源代码文件
2、对Person
进行序列化与反序列化。
源代码文件
运行SimpleObjectSerialize
,控制台输出如下信息:
{“name”:”NieYong”,”age”:33}
Person [name=AoFeng, age=32]
将整型对象数组、字符串数组和对象数组序列化成JSON字符串。
源代码文件
运行ArraySerialize
,控制台输出如下信息:
[9,7,5]
[“张三”,”李四”,”王五”]
[{“name”:”小明”,”age”:10},{“name”:”马丽”,”age”:9}]
将JSON字符串反序列化成整型对象数组、字符串数组和对象数组。
源代码文件
运行ArrayDeserialize
,控制台输出如下信息:
———- 整型数组 ———-
9
7
5
———- 字符串数组 ———-
张三
李四
王五
———- 对象数组 ———-
Person [name=小明, age=10]
Person [name=马丽, age=9]
将List、Set和Map序列化成JSON字符串。
源代码文件
运行CollectionsSerialize
,控制台输出如下信息:
[9,8,0]
[“Best”,”World”,”Hello”]
{“xiaomin”:{“name”:”小明”,”age”:21},”marry”:{“name”:”马丽”,”age”:20}}
将JSON字符串反序列化成List、Set和Map对象。
源代码文件
运行CollectionDeserialize
,控制台输出如下信息:
———- 整型List ———-
9
8
0
———- 字符串Set ———-
Best
World
Hello
———- Map ———-
xiaomin=Person [name=小明, age=21]
marry=Person [name=马丽, age=20]
作者:聂勇 欢迎转载,请保留作者信息并说明文章来源!
GIT对多分支有着非常好的支持,团队的项目逐渐从HG迁移至GIT。迁移后,如何能保留原来HG项目中的提交历史和tag,是一个必须要解决的问题,fast-export
正是因此而产生。
1、获取fast-export工具。
说明:
$OPEN_SOURCE_DIR
为存放开源项目的目录 ,如:/devdata/projects/open_source/2、新建GIT本地仓库并初始化。
说明:
$GIT_REPO_ROOT
为存放GIT项目的目录 ,如:/devdata/projects/git/3、使用fast-export将HG项目转换成GIT项目。
说明:
<HG项目本地仓库路径>
为/devdata/projects/game/threadpool-jws-merge。4、将本地GIT仓库与远程GIT仓库建立关联并推送代码。
说明;
<迁移的目的GIT仓库>
为 git@git.aofeng.local:jws-module/threadpool.git5、将标签(tag)推送至远程GIT仓库。
作者:聂勇 欢迎转载,请保留作者信息并说明文章来源!
|
|
1、下载Nginx源码并解压。
2、编译三步曲。
1)编译配置。
配置成功,系统输出类似如下信息:
Configuration summary + using PCRE library: /home/sdkserver/build/pcre-8.21 + using OpenSSL library: /home/sdkserver/build/openssl-1.0.2c + md5: using OpenSSL library + sha1: using OpenSSL library + using zlib library: /home/sdkserver/build/zlib-1.2.5 nginx path prefix: "/home/sdkserver/local/nginx-1.9.2" nginx binary file: "/home/sdkserver/local/nginx-1.9.2/sbin/nginx" nginx configuration prefix: "/home/sdkserver/local/nginx-1.9.2/conf" nginx configuration file: "/home/sdkserver/local/nginx-1.9.2/conf/nginx.conf" nginx pid file: "/home/sdkserver/local/nginx-1.9.2/logs/nginx.pid" nginx error log file: "/home/sdkserver/local/nginx-1.9.2/logs/error.log" nginx http access log file: "/home/sdkserver/local/nginx-1.9.2/logs/access.log" nginx http client request body temporary files: "/home/sdkserver/local/nginx-1.9.2/temp/body" nginx http proxy temporary files: "/home/sdkserver/local/nginx-1.9.2/temp/proxy" nginx http fastcgi temporary files: "/home/sdkserver/local/nginx-1.9.2/temp/fastcgi" nginx http uwsgi temporary files: "/home/sdkserver/local/nginx-1.9.2/temp/uwsgi" nginx http scgi temporary files: "/home/sdkserver/local/nginx-1.9.2/temp/scgi"
2)编译安装。
1、启动Nginx。
2、停止Nginx。
1)安全停止。
或
2)快速停止。
或
或
3、重启Nginx。
或
4、检查配置文件的语法是否正确。
作者:聂勇 欢迎转载,请保留作者信息并说明文章来源!
前一篇文章《CentOS6 Minimal 安装桌面(GNOME)》写了如何给CentOS安装图形桌面系统,这篇文章说明通过安装增强包来实现VirtualBox中的CentOS6.x实现全屏和分辨率自动调整。
整个过程分为4个步聚,许多人因为没有安装显卡驱动导致安装了增强包后无法实现分辨率自动调整。注:所有的安装必须拥有root权限。
1、安装编译所需的依赖包
2、安装内核开发包
3、安装ATI/AMD显卡驱动
1)增加新的公钥。
2)安装yum-plugin-fastestmirror。
3)安装显卡驱动。
4、安装VirtualBox增强包
系统输出如下信息:
Verifying archive integrity… All good.
Uncompressing VirtualBox 4.3.28 Guest Additions for Linux…………
VirtualBox Guest Additions installer
Removing installed version 4.3.28 of VirtualBox Guest Additions…
Copying additional installer modules …
Installing additional modules …
Removing existing VirtualBox non-DKMS kernel modules [确定]
Building the VirtualBox Guest Additions kernel modules
Building the main Guest Additions module [确定]
Building the shared folder support module [确定]
Building the OpenGL support module [确定]
Doing non-kernel setup of the Guest Additions [确定]
You should restart your guest to make sure the new modules are actually usedInstalling the Window System drivers
Installing X.Org Server 1.15 modules [确定]
Setting up the Window System to use the Guest Additions [确定]
You may need to restart the the Window System (or just restart the guest system)
to enable the Guest Additions.Installing graphics libraries and desktop services componen[确定]
重启系统,CentOS就可根据窗口大小自动调整分辨率了:
如果没有安装显卡驱动,安装了增强包后虚拟机中的CentOS不能自动根据窗口大小的改变而自动调整分辨率,只显示了两个分辨率:
作者:聂勇 欢迎转载,请保留作者信息并说明文章来源!
使用CentOS Minimal ISO安装好系统后,因为没有安装桌面系统无法运行GUI应用。先参考我写的前一篇文章《CentOS6 Minimal 文本模式下配置网络》配置好网络,然后执行如下命令:
大约要下载350MB左右的文件进行安装,安装完成后,执行如下命令:
启动桌面后的效果如下:
如果要想每次启动后自动进入桌面系统,需要修改配置:
找到如下内容:
将id:3:initdefault:
改成id:5:initdefault:
。
作者:聂勇 欢迎转载,请保留作者信息并说明文章来源!
随着生产环境服务器硬件的升级,其操作系统从RedHat5.x改用RedHat6.x,个人的开发环境也要从CentOS5.x改用CentOS6.x,避免因依赖库版本不同导致兼容问题。
CentOS6.6安装在VirtualBox中,配置有两块网卡,新装后的系统默认是不能连接网络的,需要手工设置:
由于同时开启多个虚拟机,不希望它们的IP地址因启动顺序不同而发生变化,因此需要对网卡2的IP地址进行静态设置,网卡1的IP地址使用DHCP动态分配。
注:以下的操作必须具有root权限。
1、进入/etc/sysconfig/network-scripts
目录,可以看到网卡的配置文件:
2、编辑网卡1的配置文件ifcfg-eth0
:
将ONBOOT
的值改成yes,最终的文件内容如下:
编辑网卡2的配置文件ifcfg-eth1
:
将ONBOOT
的值改成yes,BOOTPROTO
的值改成static,并增加IPADDR
和NETMASK
两行,最终的文件内容如下:
执行如下命令重启网卡:
执行如下命令显示网卡信息:
系统显示如下信息:
1: lo:
mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0:mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:cd:c3:2e brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
inet6 fe80::a00:27ff:fecd:c32e/64 scope link
valid_lft forever preferred_lft forever
3: eth1:mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:20:93:41 brd ff:ff:ff:ff:ff:ff
inet 192.168.56.103/24 brd 192.168.56.255 scope global eth1
inet6 fe80::a00:27ff:fe20:9341/64 scope link
valid_lft forever preferred_lft forever
执行如下命令验证是否可正常地连接到公网:
系统显示如下信息,说明已经成功地连接到公网:
]]>PING www.google.com (216.58.221.100) 56(84) bytes of data.
64 bytes from hkg07s01-in-f4.1e100.net (216.58.221.100): icmp_seq=1 ttl=50 time=7.08 ms
64 bytes from hkg07s01-in-f4.1e100.net (216.58.221.100): icmp_seq=2 ttl=50 time=7.79 ms
64 bytes from hkg07s01-in-f4.1e100.net (216.58.221.100): icmp_seq=3 ttl=50 time=7.23 ms
64 bytes from hkg07s01-in-f4.1e100.net (216.58.221.100): icmp_seq=4 ttl=50 time=6.88 ms— www.google.com ping statistics —
4 packets transmitted, 4 received, 0% packet loss, time 3018ms
rtt min/avg/max/mdev = 6.889/7.248/7.793/0.342 ms
作者:聂勇 欢迎转载,请保留作者信息并说明文章来源!
在大型的互联网系统中,读的请求非常频繁,单个数据库节点不能满足读的要求,常见的做法是:读写分离
,将读操作分布至多个数据库从节点。
除了高性能外,高可用和容灾也是不容忽视的要求,许多系统会做数据备份,通过主从复制将数据备份至另一台物理服务器或者异地机房。
MySQL支持多种类型的数据复制:
MySQL的复制过程:Master输出bin log(二进制日志),Slave拉取bin log写入本地的relay log(中继日志),然后解析重放操作。详细步聚如下:
说明:
打开Master的配置文件my.cnf:
修改内容:
打开Slave的配置文件my.cnf:
修改内容:
注:配置完成后,重启master和slave。
1)登陆Master。
2)在Master建立用于主从复制的账号并授权。
结果如下:
3)导出Master的数据库。
在操作系统命令行执行如下命令:
说明:
4)查看Master状态。
结果如下:
1)登陆Slave。
在操作系统命令行执行如下命令:
2)导入数据库。
在mysql命令行执行如下命令:
3)查看Slave状态。
在mysql命令行执行如下命令:
4)配置复制。
在mysql命令行执行如下命令:
说明:db19826.sql中有一行内容记录导出数据时bin log日志文件及其位置。
5)启动Slave线程。
在mysql命令行执行如下命令:
6)查看Slave状态。
在mysql命令行执行如下命令:
mysql输出如下信息:
*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.56.102 Master_User: repl_user Master_Port: 19826 Connect_Retry: 60 Master_Log_File: mysql-bin.000008 Read_Master_Log_Pos: 107 Relay_Log_File: relay-bin.000002 Relay_Log_Pos: 253 Relay_Master_Log_File: mysql-bin.000008 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 107 Relay_Log_Space: 403 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 26 1 row in set (0.00 sec)
注:Slave_IO_Running和Slave_SQL_Running必须都是Yes,否则就说明存在错误,主从同步没有配置成功。
在Master的mysql命令行输入如下命令:
在Slave的mysql命令行输入如下命令:
1、在Master新建一个表,SQL语句如下:
然后再插入一条记录:
2、进入Slave查看,同样可以看到新增了一个表account_cp,并且存在一条一样的记录。
作者:聂勇 欢迎转载,请保留作者信息并说明文章来源!
MySQL有多种安装方式:编译安装、二进制发布包安装。我想大家的第一反应是使用二进制安装,选择针对当前系统发布的二进制直接安装就行,比编译安装简单得多。但编译安装有它的好处:
那多实例有什么用途呢?在业务早期,系统的访问量较小,许多模块的读写操作不频繁,从节约成本的角度和系统以后的扩展性考虑,会在一台物理机中部署多个MySQL实例,不同的模块使用不同的实例,如果其中某个模块的读写量不断上升,到达一定程度后再将它使用的实例迁移至另外的服务器。
另外,在研发的开发环境和测试的测试环境中,部署的环境要模拟生产环境的架构,也往往采用在同一台物理服务器中部署多个MySQL实例的情况,进行主从同步、主主同步的配置。
|
|
1、配置。
2、生成可执行文件。
3、安装到指定目录。
说明:创建两个实例,实例1使用端口19826,实例2使用端口19836。
说明:
1、新建目录。
2、创建系统配置文件。
进入目录$MySQL_DATA_DIR/data19826,新建文件my.cnf。内容类似如下:
3、初始化实例,生成MySQL系统数据库信息。
进入MySQL安装目录,执行命令:
MySQL在终端输出如下提示信息:
Installing MySQL system tables... 150512 16:41:35 [Note] /home/nieyong/local/mysql-5543/bin/mysqld (mysqld 5.5.43-log) starting as process 27522 ... OK Filling help tables... 150512 16:41:36 [Note] /home/nieyong/local/mysql-5543/bin/mysqld (mysqld 5.5.43-log) starting as process 27528 ... OK 。。。 。。。
1、新建目录。
2、创建系统配置文件。
将\$MySQL_DATA_DIR/data19826/my.cnf复制到目录\$MySQL_DATA_DIR/data19836下,将内容中所有的19826都改成19836
。
3、初始化实例,生成MySQL系统数据库信息。
进入MySQL安装目录,执行命令:
1、启动实例19826。
进入MySQL安装目录,执行命令:
2、启动实例19836。
进入MySQL安装目录,执行命令:
3、查看MySQL各实例进程信息。
在终端执行命令:
系统显示如下进程信息:
nieyong 28452 26805 0 17:34 pts/2 00:00:00 /bin/sh ./bin/mysqld_safe --defaults-file=/home/nieyong/local/mysql-5543/data/data19826/my.cnf nieyong 28857 28452 0 17:34 pts/2 00:00:00 /home/nieyong/local/mysql-5543/bin/mysqld --defaults-file=/home/nieyong/local/mysql-5543/data/data19826/my.cnf --basedir=/home/nieyong/local/mysql-5543 --datadir=/home/nieyong/local/mysql-5543/data/data19826/data/ --plugin-dir=/home/nieyong/local/mysql-5543/lib/plugin --log-error=/home/nieyong/local/mysql-5543/data/data19826/log/mysql.err --pid-file=/home/nieyong/local/mysql-5543/data/data19826/tmp/mysql.pid --socket=/home/nieyong/local/mysql-5543/data/data19826/tmp/mysql.sock --port=19826 nieyong 28886 26805 0 17:36 pts/2 00:00:00 /bin/sh ./bin/mysqld_safe --defaults-file=/home/nieyong/local/mysql-5543/data/data19836/my.cnf nieyong 29291 28886 0 17:36 pts/2 00:00:00 /home/nieyong/local/mysql-5543/bin/mysqld --defaults-file=/home/nieyong/local/mysql-5543/data/data19836/my.cnf --basedir=/home/nieyong/local/mysql-5543 --datadir=/home/nieyong/local/mysql-5543/data/data19836/data/ --plugin-dir=/home/nieyong/local/mysql-5543/lib/plugin --log-error=/home/nieyong/local/mysql-5543/data/data19836/log/mysql.err --pid-file=/home/nieyong/local/mysql-5543/data/data19836/tmp/mysql.pid --socket=/home/nieyong/local/mysql-5543/data/data19836/tmp/mysql.sock --port=19836
1、修改的root用户的密码并且限制只能本机登陆。
进入MySQL安装目录,执行如下命令:
注:将new-password替代成实际的密码
。
2、使用root用户登陆。
3、查看数据库信息。
在mysql提示符后输入命令:
1、修改root用户的密码并且限制只能本机登陆。
注:将new-password替代成实际的密码
。
进入MySQL安装目录,执行如下命令:
进入MySQL安装目录,执行如下命令:
作者:聂勇 欢迎转载,请保留作者信息并说明文章来源!
当浏览器本地缓存的数据已经过期或无法判断是否为最新版本,就会向服务器发起请求进行核对,常见的是Last-Modified
与If-Modified-Since
结合使用。
注:一些WEB服务器在实现时,只是比较If-Modified-Since与文档的修改时间是否一致,并没有确认是否在这个时间之后修改过。
1)浏览器首次访问时,请求的Header中没有If-Modified-Since。
2)响应状态码为200,响应的Header中返回了Last-Modified并完整地返回了文件内容。
1)浏览器再次访问,请求的Header携带了If-Modified-Since,其值为上次响应的Last-Modified的时间。
2)此文件没有修改过,服务器返回响应状态码为304,响应的Body为空。
1)在服务器修改文件。
2)浏览器的请求的Header携带If-Modified-Since。
3)由于文件已修改并且比If-Modified-Since的时间新,因此响应状态码为200,返回文件内容并在响应的Header中返回了Last-Modified,其值为文件的最新修改时间。
作者:聂勇 欢迎转载,请保留作者信息并说明文章来源!
1、下载源码包。
2、解压缩。
3、安装。
注:需要root权限
|
|
执行脚本的结果:
]]>set的结果: True
get的结果: NieYong
delete的结果: 1
作者:聂勇 欢迎转载,请保留作者信息并说明文章来源!
1、下载源码包。
2、解压缩。
3、安装。
注:需要root权限
|
|
我的开发服务器默认的umask设置为0037,结果安装后,在root用户下可以正常地使用mysql.connector模块,但是切换至其他的普通账号时,会报错:
ImportError: No module named mysql.connector
解决方法:
在执行python setup.py install
之前,先执行umask 0022
。
作者:聂勇 欢迎转载,请保留作者信息并说明文章来源!
在日常分析和定位生产环境的问题时,经常会碰到各种各样的网络问题,查看应用监听端口上连接的数量、各种状态的连接数量分布成为常用的手段之一。但一些同学看不懂使用netstat过滤出来的各种状态是什么含义以及各种状态的连接数量分布可能存在什么问题。其实只要弄懂了TCP/IP建立连接(即三次握手)和关闭连接(即四次挥手),上面的问题迎刃而解。
发送SYN
(seq=x)包到服务器,并进入SYN_SENT状态
,等待服务器的确认。SYN:同步序列编号(Synchronize Sequence Numbers)。收到SYN
包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(seq=y),即发送SYN+ACK
包,此时服务器进入SYN_RECV状态
;收到SYN+ACK
包,向服务器发送ACK
(ack=y+1)包,此包发送完毕,客户端和服务器进入ESTABLISHED状态
,完成三次握手。完成三次握手,客户端与服务器开始传送数据。下面是通过Wirkshark抓包得到的TCP/IP三次握手的数据包截图:
说明:
目的: 防止已经失效的连接请求到达服务端,创建无效的连接,浪费资源。
说明: 当客户端发出的第一个连接请求在网络上的某个节点被滞留了(网络会存在许多不可靠的因素),过一段时间后突然又到达了服务端,服务端误以为这是一个新的建立连接的请求,于是就会向客户端发出确认包并建立连接。
实际上客户端当前并没有发出创建连接的请求,就会丢弃服务端的确认包。而服务端却创建了连接并等待客户端发送数据,浪费了相关的资源。
攻击方伪造IP地址发送大量的SYN包,使服务端发送的SYN+ACK包得不到确认,服务器端将为了维护一个非常大的半连接列表而消耗非常多的资源,服务器失去响应,即服务器端受到了SYN Flood攻击。
注:挥手动作可由客户端或服务器任意一方发起。
下面是通过Wirkshark抓包得到的TCP/IP四次挥手的数据包截图:
说明:
TCP是全双工通道,一方发起关闭请求只关闭了一个方向上的通道,所以建立连接的双方都要发起关闭请求并确认来关闭各自方向上的数据通道。
作者:聂勇 欢迎转载,请保留作者信息并说明文章来源!
之前写过一篇《用X Window在终端运行GUI程序和远程操作Linux桌面》,讲的是在Windows下使用XManager来在终端命令行上运行SUSE Linux上的GUI程序,但XManager是商业付费软件,如果是在商业环境(公司)使用破解版存在法律风险。
一直使用Kitty / Putty作为SSH客户端来登陆Linux服务器执行指令,但有时要执行一些GUI程序又得切换屏幕打开Linux的图形界面,总是感觉这样不太顺畅,于是就想到了x Windows这个利器。通过Google和Stackflow找到了一些免费的替代XManager的软件,最后选择Xming。
1、从http://sourceforge.net/projects/xming/下载Xming 6.9版本。
2、双击”Xming-6-9-0-31-setup.exe”开始安装。
定义Xming的安装路径:
设置是否安装Putty做为SSH客户端。因为要与已有的Kitty / Putty结合使用,所以选择”Don’t install an SSH client”:
选择关联.xlaunch文件:
如果勾选”Launch Xming”会默认Display Number为0。
以Kitty为例
,选择一个Session,选择菜单项:Connection -> SSH -> X11,勾选Enable X11 forwarding
,然后在X display location
中填入”127.0.0.1:0”。
1、以root账号登陆,编辑SSH服务器的配置文件。
开启TCP转发和X11转发:
1、打开Kitty的Session,在终端登陆Linux。
2、设置环境变量DISPLAY。
说明:
3、在命令行执行指令启动eclipse:
eclipse启运完成后,在Windows的窗口会显示如下的界面:
如果在终端执行指令启动eclipse时报错:
Xlib: connection to “192.168.56.101:0.0” refused by server
Xlib: No protocol specified
说明Xming的权限设置有问题,打开Xming的日志:
会发现有类似client 4 rejected From ip 192.168.56.102的提示信息:
2、在桌面上打开Xming的快捷方式,在目标的命令行中加上-ac
的参数:
1、在启动应用程序之前,在终端的命令行中执行如下命令:
我目前用的输入法是scim:
如果用的输入法是gcin,则执行如下命令:
2、在打开的应用程序中就可以输入中文了:
作者:聂勇 欢迎转载,请保留作者信息并说明文章来源!
SecureCRT支持用sz
和rz
命令在SSH会话中上传和下载文件,但如果用KiTTY和Putty
的同学怎么办呢?已经有人提供了解决方案,在Putty的基础上新做了一个LePutty,支持ZModem协议,新版本的KiTTY也支持ZModem
。
进入LePutty官网,点击红色方框下载LePutty。
1、打开LePutty的压缩包,可看到里面有一个win32-lrzsz-*.zip的压缩文件。
2、打开win32-lrzsz-.zip,可看到里面有sz.exe和rz.exe。
3、将sz.exe和rz.exe提取出来。
1、打开KiTTY的配置文件:%APPDATA%/KiTTY/kitty.ini
,增加zmodem支持。
2、打开Session,找到ZModem
项,分别填入rz和sz命令的完整地址。
3、打开Session,在标题栏上右键,打开右键菜单,可以看到出现了”Zmodem Receive”和”Zmodem Upload”两个菜单项。
# 四、使用ZModem上传下载文件
1、下载文件。
输入命令sz 文件路径,示例如下:
然后在KiTTY/Putty的标题栏右键, 选择Zmodem Receive 。
2、上传文件。
输入命令rz,示例如下:
然后在KiTTY/Putty的标题栏右键, 选择Zmodem Upload 。
]]>作者:聂勇 欢迎转载,请保留作者信息并说明文章来源!
在Linux中,执行man 命令会显示该命令的详细帮助信息,但默认的黑底白字看起来不是很舒服,将不同的关键字用不同的颜色显示有助于阅读,方便快速定位所需内容。
1、打开用户配置文件。
2、增加如下配置。
作者:聂勇 欢迎转载,请保留作者信息并说明文章来源!
使用多个虚拟机,将开发环境和工作沟通环境分开(即时通,办公系统都只能在windows下使用…),将开发环境的服务提供给外部访问时,需要在主机上通过代理配置数据转发。
VirtualBox提供了端口转发的功能,可以将主机中的端口转发至指定IP的虚拟机中的端口,支持TCP协议和UDP协议。但有一个缺点:需要重启虚拟主机才生效。
其实在Windows中,如果想做端口转发,可以使用Windows自身携带的服务:netsh
,使用netsh interface portproxy
指令,新增和修改配置信息后,即时生效,并且重启系统后配置信息仍然存在,非常方便。适用于WindowsXP、Windows7,其他的版本还没有试过,支持IPv4和IPv6,但是只支持TCP协议。
netsh interface portproxy add v4tov4 - 添加通过 IPv4 的 IPv4 和代理连接到的侦听项目。
netsh interface portproxy add v4tov6 - 添加通过 IPv6 的 IPv4 和代理连接到的侦听项目。
netsh interface portproxy add v6tov4 - 添加通过 IPv4 的 IPv6 和代理连接到的侦听项目。
netsh interface portproxy add v6tov6 - 添加通过 IPv6 的 IPv6 和代理连接到的侦听项目。
以netsh interface portproxy add v4tov4
为例,其语法格式如下:
参数:
标记 | 值 |
---|---|
listenport | IPv4 侦听端口。 |
connectaddress | IPv4 连接地址。 |
connectport | IPv4 连接端口。 |
listenaddress | IPv4 侦听地址。 |
protocol | 使用的协议。现在只支持 TCP。 |
说明: 添加通过 IPv4 的 IPv4 和代理连接到的侦听项目。
|
|
将本地的8080端口的数据转发至192.168.56.101上的8080端口。
|
|
将本地的9090端口的数据转发至192.168.56.101上的9090端口。
netsh interface portproxy show all - 显示所有端口代理参数。
netsh interface portproxy show v4tov4 - 显示 IPv4 代理连接到另一个 IPv4 端口的参数。
netsh interface portproxy show v4tov6 - 显示 IPv4 代理连接到 IPv6 的参数。
netsh interface portproxy show v6tov4 - 显示 IPv6 代理连接到 IPv4 的参数。
netsh interface portproxy show v6tov6 - 显示 IPv6 代理连接到另一个 IPv6 端口的参数。
|
|
控制台显示如下信息:
侦听 ipv4 | 连接到 ipv4 | ||
---|---|---|---|
地址 | 端口 | 地址 | 端口 |
1 | 8080 | 192.168.56.101 | 8080 |
1 | 9090 | 192.168.56.101 | 9080 |
netsh interface portproxy set v4tov4 - 更新通过 IPv4 的 IPv4 和代理连接到的侦听项目。
netsh interface portproxy set v4tov6 - 更新通过 IPv6 的 IPv4 和代理连接到的侦听项目。
netsh interface portproxy set v6tov4 - 更新通过 IPv4 的 IPv6 和代理连接到的侦听项目。
netsh interface portproxy set v6tov6 - 更新通过 IPv6 的 IPv6 和代理连接到的侦听项目。
以netsh interface portproxy set v4tov4
为例,其语法格式如下:
参数:
标记 | 值 |
---|---|
listenport | IPv4 侦听端口。 |
connectaddress | IPv4 连接地址。 |
connectport | IPv4 连接端口。 |
listenaddress | IPv4 侦听地址。 |
protocol | 使用的协议。现在只支持 TCP。 |
说明: 更新通过 IPv4 的 IPv4 和代理连接到的侦听项目。
|
|
将本地9090端口改成转发至192.168.56.101的9080端口中。
netsh interface portproxy delete v4tov4 - 删除通过 IPv4 的 IPv4 和代理连接到的侦听项目。
netsh interface portproxy delete v4tov6 - 删除通过 IPv6 的 IPv4 和代理连接到的侦听项目。
netsh interface portproxy delete v6tov4 - 删除通过 IPv4 的 IPv6 和代理连接到的侦听项目。
netsh interface portproxy delete v6tov6 - 删除通过 IPv6 的 IPv6 和代理连接到的侦听项目。
以netsh interface portproxy delete v4tov4
为例,其语法格式如下:
参数:
标记 | 值 |
---|---|
listenport | 要侦听的 IPv4 端口。 |
listenport | 要侦听的 IPv4 地址。 |
protocol | 要使用的协议。当前仅支持 TCP。 |
注释: 删除要侦听的 IPv4 的项并通过 Ipv4 代理连接。
|
|
删除本地端口9090的端口转发配置。
]]>作者:聂勇 欢迎转载,请保留作者信息并说明文章来源!
前一篇文章《Redis命令指南》讲解了通过命令行的方式执行Key=>的存储操作,在实际的项目开发中,各种语言是使用Redis的客户端库来与Redis交互。针对Java语言,Redis官方推荐Jedis。
Jedis提供了多种操作方式:单机单连接方式、单机连接池方式、多机分布式+连接池方式。
此方式仅建议用于开发环境做调试用。
运行上述代码,控制台输出:
set指令执行结果:OK
get指令执行结果:Hello, Redis!
此方式适用于仅使用单个Redis实例的场景。
运行上述代码,控制台输出:
set指令执行结果:OK
get指令执行结果:Hello, Redis!
在规模较大的系统中,往往会有多个Redis实例做负载均衡。并且还实现主从备份,当主实例发生故障时,切换至从实例提供服务。
类似于Memcached的客户端,Jedis也提供了客户端分布式操作的方式,采用一致性哈希算法。
运行上述代码,控制台输出:
]]>set指令执行结果:OK
get指令执行结果:Hello, Redis!