一、Rsync介绍

1、什么是Rsync

Rsync 即Remote Rynchronization,是一款开源的、快速的、多功能的、可实现全量或增量的本地或者远程数据镜像同步复制、备份的优秀工具。

类似于scp命令,但是优于scp,可以做增量的备份。Rsync还可以在本地主机的不同分区或目录之间全量及增量的复制数据,这类似与cp命令,同样优于cp命令(增量)。

Rsync 是一个远程数据同步工具,可通过 LAN/WAN 快速同步多台主机间的文件。

Rsync 使用所谓的“Rsync 演算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。

运行 Rsync server 的机器也叫 backup server,一个 Rsync server 可同时备份多个 client 的数据;也可以多个Rsync server 备份一个 client 的数据。
Rsync 可以搭配 rsh 或 ssh 甚至使用 daemon 模式。Rsync server 会打开一个873的服务通道(port),等待对方(客户端) Rsync 连接。连接时,Rsync server 会检查口令是否相符,若通过口令查核,则可以开始进行文件传输。第一次连通完成时,会把整份文件传输一次,下一次就只传送二个文件之间不同的部份。

2、Rsync特性

支持拷贝特殊文件如链接、设备等
支持排除特定文件或目录同步的功能,相当于打包命令tar的排除功能。
支持保持源文件或目录的权限、时间、软硬链接、属主属组等所有属性的不改变。
支持实现增量同步,既只同步发生变化的数据,因为数据传输效率很高。
支持使用rcp、rsh、ssh等方式配合传输文件,也可以直接通过socket(进程方式)传输。
支持匿名的或认证(无需系统用户)的进程模式传输,可实现方便安全的进行数据备份及镜像。

二、Rsync配置

1、Rsync安装

一般的linux系统上都默认安装得了rsync 。如若没有安装请自行安装。

2、Rsync主要配置文件

rsyncd.conf(主配置文件)、rsyncd.secrets(密码文件)

rsyncd.conf 服务器的主要配置文件:

transfer logging = true
log format = %h %o %f %l %b
log file = /wy/logs/rsyncd.log
pid file = /var/run/rsyncd.pid
[data]
path = /wy/data/doc
comment = wydoc
ignore errors = yes
read only = no
uid = root
gid = root
list = no
hosts allow = 115.182.93.132 10.200.93.132
hosts deny = *
max connections = 10
auth users = wy
secrets file = /etc/rsyncd.secrets
exclude = dir1/ dir2/

auth users是必须在服务器上存在的真实的系统用户,如果你想用多个用户以,号隔开,比如auth users = nobody,root

#在rsync 服务器中,全局定义有几个比较关健的,根据我们前面所给的配置文件 rsyncd.conf 文件;
  pid file = /var/run/rsyncd.pid 注:告诉进程写到 /var/run/rsyncd.pid 文件中;
  port = 873 注:指定运行端口,默认是873,您可以自己指定;
  address = 192.168.1.171 注:指定服务器IP地址
  uid = nobody
  gid = nobdoy
  注:服务器端传输文件时,要发哪个用户和用户组来执行,默认是nobody。 如果用nobody 用户和用户组,可能遇到权限问题,有些文件从服务器上拉不下来。所以我就偷懒,为了方便,用了root 。不过您可以在定义要同步的目录时定义的模块中指定用户来解决权限的问题。
  
use chroot = yes
  注:用chroot,在传输文件之前,服务器守护程序在将chroot 到文件系统中的目录中,这样做的好处是可能保护系统被安装漏洞侵袭的可能。缺点是需要超级用户权限。另外对符号链接文件,将会排除在外。也就是说,你在 rsync服务器上,如果有符号链接,你在备份服务器上运行客户端的同步数据时,只会把符号链接名同步下来,并不会同步符号链接的内容;这个需要自己来尝试   read only = yes
  注:read only 是只读选择,也就是说,不让客户端上传文件到服务器上。还有一个 write only选项,自己尝试是做什么用的吧;   #limit access to private LANs
  hosts allow=192.168.1.0/255.255.255.0 10.0.1.0/255.255.255.0
  注:在您可以指定单个IP,也可以指定整个网段,能提高安全性。格式是ip 与ip 之间、ip和网段之间、网段和网段之间要用空格隔开;   max connections = 5
  注:客户端最多连接数   motd file = /etc/rsyncd/rsyncd.motd
  注:motd file 是定义服务器信息的,要自己写 rsyncd.motd 文件内容。当用户登录时会看到这个信息。   log file = /var/log/rsync.log
  注:rsync 服务器的日志;   transfer logging = yes
  注:这是传输文件的日志   log format = %t %a %m %f %b
  syslog facility = local3
  timeout = 300 模块定义
  模块定义什么呢?主要是定义服务器哪个目录要被同步。每个模块都要以[name]形式。这个名字就是在rsync 客户端看到的名字,其实有点象Samba服务器提供的共享名。而服务器真正同步的数据是通过path 指定的。我们可以根据自己的需要,来指定多个模块。每个模块要指定认证用户,密码文件、但排除并不是必须的
  下面是前面配置文件模块的例子:   [home] #模块它为我们提供了一个链接的名字,在本模块中链接到了/home目录;要用[name] 形式
  path = /usr/local/tomcat/webapp/home/statics #指定文件目录所在位置,这是必须指定的
  auth users = root #认证用户是root ,是必须在服务器上存在的用户
  list=yes #list 意思是把rsync 服务器上提供同步数据的目录在服务器上模块是否显示列出来。默认是yes 。如果你不想列出来,就no ;如果是no是比较安全的,至少别人不知道你的服务器上提供了哪些目录。你自己知道就行了;
  ignore errors #忽略IO错误
  secrets file = /etc/rsyncd.secrets #密码存在哪个文件
  comment = linuxsir home data #注释可以自己定义
  exclude = dir1/ dir2/
  注:exclude是排除的意思,也就是说,要把/usr/local/tomcat/webapp/home/statics目录下的easylife和samba排除在外; dir1/和dir2/目录之间有空格分开

rsyncd.secrets

#目录、用户权限创建配置
[root@Rsync_A ~]# useradd rsync -s /sbin/nologin -M
[root@Rsync_A ~]# grep rsync /etc/passwd
rsync:x:502:502::/home/rsync:/sbin/nologin
#修改属主
[root@Rsync_A ~]# chown rsync.rsync /skyex/
[root@Rsync_A ~]# ls -ld /skyex/
drwxr-xr-x 2 rsync rsync 167936 May 30 22:10 /skyex/
#配置密码文件(格式---> 用户:密码)
[root@Rsync_A ~]# echo "rsync_backup:skyex" >> /etc/rsync.password
[root@Rsync_A ~]# cat /etc/rsync.password
rsync_backup:skyex
#修改权限更改密码文件权限600
[root@Rsync_A ~]# chmod 600 /etc/rsync.password
[root@Rsync_A ~]# ls -ld /etc/rsync.password
-rw------- 1 root root 19 May 27 22:14 /etc/rsync.password

3、启动Rsync服务

#启动rsync
[root@Rsync_A ~]# rsync --daemon
#查看rsync进程
[root@Rsync_A ~]# ps -ef|grep rsync
root 2779 1 0 22:41 ? 00:00:00 rsync --daemon
root 2785 2678 0 22:41 pts/0 00:00:00 grep rsync
#根据端口查看进程
[root@Rsync_A ~]# lsof -i tcp:873
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsync 2779 root 4u IPv4 8610 0t0 TCP *:rsync (LISTEN)
[root@Rsync_A ~]# netstat -lntup |grep 873
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 2779/rsync

    Rsync 客户端配置

#配置密码文件
[root@Rsync_B ~]# echo "skyex">>/etc/rsync.secrets
[root@Rsync_B ~]# cat /etc/rsync.secrets
skyex
#更改密码文件权限为600
[root@Rsync_B ~]# chmod 600 /etc/rsync.secrets
[root@Rsync_B ~]# ls -ld /etc/rsync.secrets
-rw------- 1 root root 6 May 27 22:17 /etc/rsync.secrets

三、Rsync的工作方式

1、主机本地间的数据传输(类似cp命令的功能)
    2、借助rcp、ssh等通道来传输数据(类似scp命令的功能)
    3、以守护进程(socket)的方式传输数据

本地数据传输模式(local-only mode)

1 Local: rsync [OPTION...] SRC... [DEST]

通过远程shell进行数据传输(remote shell mode)

1 Access via remote shell:
2 Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
3 Push: rsync [OPTION...] SRC... [USER@]HOST:DEST

通过守护进程的方式进行数据传输

1 Access via rsync daemon:
2 Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
3 rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
4 Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
5 rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST

Rsync命令同步参数选项
  rsync [OPTION...] SRC ... DEST
  常用参数选项说明:
  -v, --verbose 详细模式输出,传输时的进度等信息
  -z, --compress 传输时进行压缩以提高传输效率,--compress-level=NUM可按级别压缩
  -r, --recursive 对子目录以递归模式,即目录下的所有目录都同样传输,注意是小写r
  -t, --times 保持文件时间信息
  -o, --owner 保持文件属主信息
  -p, --perms 保持文件权限
  -g, --group 保持文件属组信息
  -P, --progress 显示同步的过程及传输时的进度等信息
  -a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rtopgDl 
  -D, --devices 保持设备文件信息
  -l, --links 保留软链接
  -e, --rsh=COMMAND 使用的信道协议, 指定替代rsh的shell程序。例如:ssh 
  --exclude=PATTERN 指定排除不需要传输的文件模式

rsync -avz /opt/ /mnt #加/,只同步目录内的内容
   rsync -avz /opt /mnt #不加/,会将目录和目录内的内容一起同步

四、具体应用

通过Rsync在本地传输数据实践

#通过rsync命令,推送56_rsync_a.log到10.0.0.57的家目录
[root@Rsync_A ~]# ll
total 76
-rw-r--r-- 1 root root 0 May 30 20:34 56_rsync_a.log
-rw------- 1 root root 967 May 21 02:09 anaconda-ks.cfg
-rw-r--r-- 1 root root 41751 May 21 02:08 install.log
-rw-r--r-- 1 root root 4688 May 21 02:06 install.log.syslog
-rw-r--r-- 1 root root 2832 May 13 11:08 system_init.sh
[root@Rsync_A ~]# rsync -avzP 56_rsync_a.log root@10.0.0.57:~
sending incremental file list
56_rsync_a.log
0 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1)
14 sent 75 bytes received 31 bytes 212.00 bytes/sec
total size is 0 speedup is 0.00
17 [root@Rsync_B ~]# ll
total 68
-rw-r--r-- 1 root root 0 May 30 20:34 56_rsync_a.log
-rw------- 1 root root 967 May 21 02:09 anaconda-ks.cfg
-rw-r--r-- 1 root root 41751 May 21 02:08 install.log
-rw-r--r-- 1 root root 4688 May 21 02:06 install.log.syslog
#通过rsync命令,拉取10.0.0.57主机/tmp目录数据到本地/tmp目录下
[root@Rsync_B tmp]# ll
total 4
-rw-r--r-- 1 root root 0 May 30 21:38 57.tmp.log
drwx------ 2 root root 4096 May 30 21:04 ssh-XpIRDi2492
30 [root@Rsync_A ~]# ll /tmp/
total 8
drwx------ 2 root root 4096 May 30 20:09 ssh-aiWOPN2537
-rw-r--r-- 1 root root 2832 May 13 11:08 system_init.sh
[root@Rsync_A ~]# rsync -avz root@10.0.0.57:/tmp /tmp
receiving incremental file list
tmp/
tmp/57.tmp.log
tmp/.ICE-unix/
tmp/ssh-XpIRDi2492/
tmp/ssh-XpIRDi2492/agent.2492
42 sent 45 bytes received 210 bytes 510.00 bytes/sec
total size is 0 speedup is 0.00
[root@Rsync_A ~]# ll /tmp/
total 12
drwx------ 2 root root 4096 May 30 20:09 ssh-aiWOPN2537
-rw-r--r-- 1 root root 2832 May 13 11:08 system_init.sh
drwxrwxrwt 4 root root 4096 May 30 2013 tmp
[root@Rsync_A ~]# tree /tmp/
/tmp/
|-- ssh-aiWOPN2537
| `-- agent.2537
|-- system_init.sh
`-- tmp
|-- 57.tmp.log
`-- ssh-XpIRDi2492
`-- agent.2492
59 3 directories, 4 files

借助rcp、ssh等通道来传输数据实践

#通过ssh通道推送数据
[root@Rsync_A ~]# rsync -avzP -e "ssh -p22" 56_rsync_a.log root@10.0.0.57:/tmp
sending incremental file list
56_rsync_a.log
0 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1)
7 sent 75 bytes received 31 bytes 212.00 bytes/sec
total size is 0 speedup is 0.00
10 [root@Rsync_B ~]# ll /tmp/
total 4
-rw-r--r-- 1 root root 0 May 30 20:34 56_rsync_a.log
-rw-r--r-- 1 root root 0 May 30 21:38 57.tmp.log
drwx------ 2 root root 4096 May 30 21:04 ssh-XpIRDi2492
#通过ssh通道拉取数据
[root@Rsync_A ~]# rsync -avz -e "ssh -p22" root@10.0.0.57:/tmp .
receiving incremental file list
tmp/
tmp/56_rsync_a.log
tmp/57.tmp.log
tmp/.ICE-unix/
tmp/ssh-XpIRDi2492/
tmp/ssh-XpIRDi2492/agent.2492
26 sent 64 bytes received 274 bytes 676.00 bytes/sec
total size is 0 speedup is 0.00
[root@Rsync_A ~]# ll
total 80
-rw-r--r-- 1 root root 0 May 30 20:34 56_rsync_a.log
-rw------- 1 root root 967 May 21 02:09 anaconda-ks.cfg
-rw-r--r-- 1 root root 41751 May 21 02:08 install.log
-rw-r--r-- 1 root root 4688 May 21 02:06 install.log.syslog
-rw-r--r-- 1 root root 2832 May 13 11:08 system_init.sh
drwxrwxrwt 4 root root 4096 May 30 2013 tmp
[root@Rsync_A ~]# tree tmp/
tmp/
|-- 56_rsync_a.log
|-- 57.tmp.log
`-- ssh-XpIRDi2492
`-- agent.2492
43 1 directory, 3 files

通过ssh key+rsync实现批量免密码加密分发数据

#批量将任意文件服务分发至/tmp目录下
#!/bin/sh
. /etc/init.d/functions
if [ $# -ne 1 ];then
echo "Usage:$0 argv"
exit
fi
for ip in `cat iplist`
do
rsync -avzP $1 -e "ssh -p 52113" lican888@$ip:~ >&/dev/null
ssh -p52113 -t lican888@$ip sudo rsync ~/$1 /etc >&/dev/null
if [ $? -eq 0 ];then
action "fenfa $1 successful." /bin/true
else
action "fenfa $1 failure." /bin/false
fi
done

 以守护进程(socket)的方式传输数据

 Rsync推送数据

#推送/var/www/html到服务器端
[root@Rsync_B script]# cd /var/www/
[root@Rsync_B www]# tar zcvf html_$(date +%F).tar.gz ./html/
./html/
./html/d
./html/a
./html/c
./html/e
./html/b
./html/f
[root@Rsync_B www]# ll
total 8
drwxr-xr-x 2 root root 4096 May 30 23:44 html
-rw-r--r-- 1 root root 190 May 30 23:59 html_2013-05-30.tar.gz
[root@Rsync_B www]#
#推送数据压缩包至rsync服务器skyex模块内
[root@Rsync_B www]# rsync -avzP html_2013-05-30.tar.gz rsync_backup@10.0.0.56::skyex
Password:
sending incremental file list
html_2013-05-30.tar.gz
190 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1)
24 sent 277 bytes received 27 bytes 46.77 bytes/sec
total size is 190 speedup is 0.62
#免密码输入,推送数据
[root@Rsync_B www]# rsync -avzP html_2013-05-30.tar.gz rsync_backup@10.0.0.56::skyex --password-file=/etc/rsync.password
sending incremental file list
31 sent 43 bytes received 8 bytes 102.00 bytes/sec
total size is 190 speedup is 3.73
[root@Rsync_B www]#
#通过rsync协议进行推送
[root@Rsync_B www]# rsync -avzP html_2013-05-30.tar.gz rsync://rsync_backup@10.0.0.56/skyex --password-file=/etc/rsync.password
sending incremental file list
39 sent 43 bytes received 8 bytes 102.00 bytes/sec
total size is 190 speedup is 3.73
[root@Rsync_B www]#

客户端拉取

/usr/bin/rsync -avzP --password-file=/etc/rsyncd/rsyncd.secrets root@192.168.1.100::data /var/www/statics/

 五、总结

 Rsync 工作模式

  1.拷贝本地文件;当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。

2.使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST路径地址包含单个冒号":"分隔符时启动该模式。

3.使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC地址路径包含单个冒号":"分隔符时启动该模式。

4. 从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含"::"分隔符时启动该模式。

5. 从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含"::"分隔符时启动该模式。

6. 列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。

通过与crontab结合使用,让这个脚本定时运行。

Rsync 服务端部署流程

  1、配置rsync配置文件
  2、创建同步的本地目录/skyex,并根据需要授权rsync服务的用户可读写/ skyex。目录和/etc/rsync.passwore为配置文件中path = / skyex参数的配置
  3、账号及密码文件配置
  4、启动rsync服务
 
Rsync客户端配置流程
  1、echo “123”>/etc/rsync.password
  2、chmod 600 /etc/rsync.password
  提示:客户端的和服务端的/etc/rsync.password没有任何关系。只要/etc/rsync.password和客户端rsync命令中的参数--password-file=/etc/rsync.password中的路径对应即可。
 
Rsync服务端的排错思路
  1、查看rsync服务配置文件路径是否正确,默认路径为/etc/rsyncd.conf
  2、查看配置文件里host allow,host deny,允许的ip网段是否允许客户端访问的ip网段。
  3、查看配置文件中path参数里的路径是否存在,权限是否正确(正常应为配置文件中的UID参数对应的属主和组)
  4、查看rsync服务是否启动。查看命令为:ps -ef|grep rsync,端口是否存在netstat -lnt|grep 873
  5、查看iptables防火墙和selinux是否开启允许rsync服务通过,也可以考虑关闭。
  6、查看服务端rsync配置的密码文件是否为600权限,密码文件格式是否正确,正确格式为:用户名:密码,文件路径和配置文件里的secrect file路径一致。
 
Rsync客户端的排错思路
  1、查看客户端rsync配置的密码文件是否为600的权限,密码文件格式是否正确  注意:仅需要有密码。并且和服务端的密码一致。
  2、用telnet链接rsync服务器IP地址873端口,查看服务是否启动(可测试服务端防火墙是否阻挡)。telnet 10.0.0.141 873
  3、客户端执行命令时rsync -avzrtopgP rsync_backup@10.0.0.51::skyex/test /test --password-file=/etc/rsync.password

参考:http://www.cnblogs.com/lycn/articles/3259331.html

由于本人经验有限,文章中难免会有错误,请浏览文章的您指正或有不同的观点共同探讨!

Linux Rsync的更多相关文章

  1. linux rsync 实际应用

    linux rsync 实际应用 一.rsync的概述 rsync是类unix系统下的数据镜像备份工具,从软件的命名上就可以看出来了——remote sync.rsync是Linux系统下的文件同步和 ...

  2. linux rsync同步工具

    linux rsync同步工具 1.rsync介绍rsync是一款开源的.快速的.多功能的.可实现全量及增量的本地或远程数据同步备份的优秀工具.rsync软件适用于unix/linux/windows ...

  3. Linux Rsync实现文件同步备份(转载)

    原文地址:Linux Rsync实现文件同步备份作者:夷北 转自:http://www.mike.org.cn/blog/index.php?load=read&id=639###pp=0 [ ...

  4. Linux rsync实现断点续传

    Linux 主机之间即时传送文件,scp命令大家都很熟悉但当要传送的文件较大,过程中如果网络中断了,就比较悲剧了.这时候可以考虑使用rsync命令替代scp,实现断点续传文件. 试验:rsync使用 ...

  5. Server Data Synchronization Via Linux rsync、rsync+inotify Between Load Balance Server

    目录 . 远程文件同步的应用场景 . rsync+crontab . rsync+inotify 1. 远程文件同步的应用场景 在负载均衡集群的应用场景中,往往在多台web server的前端有一个提 ...

  6. Linux rsync 命令详解

    服务器之间常常要保持些文件或目录的一致,比如一些大的软件下载网站,它们通常使用多台服务器来提供下载服务.当一台服务器上的文件更新后,其它的服务器 也需要更新,而且 在更新的时候应该是只对新增或是修改过 ...

  7. Linux rsync 同步

    rsync 是一个快速增量文件传输工具,它可以用于在同一主机备份内部的备分,我们还可以把它作为不同主机网络备份工具之用.本文主要讲述的是如何自架rsync服务器,以实现文件传输.备份和镜像.相对tar ...

  8. Linux rsync 同步实践

    目录[-] 1. rsync 同步的大致思路 2. rsync的安装 3. rsync的配置 4. rsync的基本操作 服务器端启动 注2. 实时同步 注3. rsync通过linux防火墙 公司网 ...

  9. linux rsync服务

    1.rsync介绍rsync是一个开源的,快速的,多功能的,可实现全量及增量的本地或远程数据同步备份的优秀工具,rsync软件适用于nunix/linux/windows多操作系统上运行.官方网站:h ...

随机推荐

  1. 统计工具之QQ图

    正态 QQ 图和普通 QQ 图 分位数-分位数 (QQ) 图是两种分布的分位数相对彼此进行绘制的图.评估数据集是否正态分布,并分别研究两个数据集是否具有相似的分布. 如何构建正态 QQ 图 首先,数据 ...

  2. 使用ImageLoader实现图片异步加载

    注:下面使用的是包:1.8.4,其他版本包的,DisplayImageOptions defaultOptions和 ImageLoaderConfiguration config2配置不一样,请看官 ...

  3. DataReader 链接关闭解惑篇

    不管是啥xxDataReader,都是继承DataReader实现的,所以是有共性的,因此标题就以DataReader为题了. 情况一:DataReader 默认链接不关闭 static void M ...

  4. Spring原来属于这家公司

    Spring几年前被VMware公司收购,如今Spring版权隶属于Pivotal.Pivotal ONE对Spring提供整合.Greenplum提供了大数据服务,GEMFIRE内存集群技术帮助12 ...

  5. 未能加载文件或程序集“System.Web.Razor”或它的某一个依赖项。文件或目录损坏且无法读取。

    “/”应用程序中的服务器错误. 未能加载文件或程序集“System.Web.Razor”或它的某一个依赖项.文件或目录损坏且无法读取. (异常来自 HRESULT:0x80070570) 说明: 执行 ...

  6. Labview实现幅度信号调制(AM)

    Labview实现幅度信号调制(AM) 时域上的表达式: 其中,m(t)是交流信号分量,均值为0,需要被调制的信号,此处选择一个正弦信号,正好满足要求. A0是一个直流分量,表示叠加的直流分量,用加法 ...

  7. 查找bad sql的方法:

    --查找bad sql的方法: select * from (select buffer_gets, sql_text from v$sqlarea ; -- 执行次数多的SQL select sql ...

  8. h264码流分析

    ---------------------------------------------------------------------------------------------------- ...

  9. Struts2入门教程

    最近闲来无事,学习s2sh框架,这里先写一点struts2的入门 我的环境 eclipse 4.3.2 tomcat 7.0.52 jdk 1.7.0_45 struts2 2.3.16.3 在ecl ...

  10. Java_Swing实现小球沿正弦曲线运动的代码

    1 package zuidaimapack_1; import java.awt.*; import javax.swing.*; /** *Java_Swing实现小球沿正弦曲线运动的代码 * @ ...