① ftp的特点是什么
【特点】FTP协议具有4个基本特点:
1、提供交互式的访问,使得用户更容易通过 操作命令与远程系统交互。
2、允许客户指定存储文件的类型与格式。
3、具备鉴别控制能力,允许文件具有存取权 限。
4、屏蔽了计算机系统的细节,因而适合于在 异构网络中任意计算机之间传送文件。
二、FTP的运行机制主要包括:FTP服务器、匿名FTP。
1、FTP服务器
FTP也是一个客户机/服务器系统。简单地说,支持FTP协议的服务器就是FTP服务器。
用户通过一个支持FTP协议的客户机程序,连接到在远程主机上的FTP服务器程序。用户通过客户机程序向服务器程序发出命令,服务器程序执行用户所发出的命令,并将执行的结果返回到客户机。
2、匿名FTP
在匿名FTP机制下,用户可通过它连接到远程主机上,并从其下载文件,而无需成为其注册用户。系统管理员建立了一个特殊的用户ID,名为anonymous,Internet上的任何人在任何地方都可使用该用户ID。
通过FTP程序连接匿名FTP主机的方式同连接普通FTP主机的方式差不多,只是在要求提供用户标识ID时必须输入anonymous,该用户ID的口令可以是任意的字符串。
网络—ftp
网络—FTP协议
② ftp服务器的工作原理是什么
FTP是File Transfer Protocol(文件传输协议)的缩写,用来在两台计算机之间互相传送文件。相比于HTTP,FTP协议要复杂得多。复杂的原因,是因为FTP协议要用到两个TCP连接,一个是命令链路,用来在FTP客户端与服务器之间传递命令;另一个是数据链路,用来上传或下载数据。
FTP协议有两种工作方式:PORT方式和PASV方式,中文意思为主动式和被动式。
PORT(主动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,客户端在命令链路上用PORT命令告诉服务器:“我打开了XXXX端口,你过来连接我”。于是服务器从20端口向客户端的XXXX端口发送连接请求,建立一条数据链路来传送数据。
PASV(被动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,服务器在命令链路上用PASV命令告诉客户端:“我打开了XXXX端口,你过来连接我”。于是客户端向服务器的XXXX端口发送连接请求,建立一条数据链路来传送数据。
③ VPN与一般的文件传输服务FTP有何区别
虚拟专用网络(Virtual Private Network ,简称VPN)指的是在公用网络上建立专用网络的技术。其之所以称为虚拟网,主要是因为整个VPN网络的任意两个节点之间的连接并没有传统专网所需的端到端的物理链路,而是架构在公用网络服务商所提供的网络平台,如Internet、ATM(异步传输模式〉、Frame Relay (帧中继)等之上的逻辑网络,用户数据在逻辑链路中传输。它涵盖了跨共享网络或公共网络的封装、加密和身份验证链接的专用网络的扩展。VPN主要采用了隧道技术、加解密技术、密钥管理技术和使用者与设备身份认证技术。
FTP(File Transfer Protocol, FTP)是TCP/IP网络上两台计算机传送文件的协议,FTP是在TCP/IP网络和INTERNET上最早使用的协议之一,它属于网络协议组的应用层。FTP客户机可以给服务器发出命令来下载文件,上载文件,创建或改变服务器上的目录。
④ 如何异步读取FTP
一:开发背景
由于需要对多个服务器发布大的数据包,所以自己在LINUX用C语言,开发了一个传送器工具。因为上传时需要支持断点续传,所以自己参考ftp-rfc959和一些文章开发了这个支持断点续传的上传工具。整个工具分两部分开发的:一是支持断点续传的Ftp工具,包含下载和上传功能。二是同时对多个服务器发布不同数据包的传送器工具。本文只是对断点续传的商船和下载作探讨。
二:实现
其实Ftp上传下载的实现很简单,首先Ftp服务器端要支持文件的定位,
然后就是通过建立的Socket用Ftp服务器命令和服务器交互.
有些也可以通过Socket做自己的客户端和服务器端,但是有些服务器是自己能管理控制的,而且原来自己也写过一些这样C/S模式的工具,简单消息的传送接收还不错。
但用来传输文件效率很低,比文件传送协议FTP(File Transfer Protocol)差的太多。 利用Ftp的服务端可以省去服务器端的开发,而且可以向任何开放Ftp服务的服务器上传送文件,可以不考虑对方安装的
是什么的操作系统。
三:FTP
文件传送协议 FTP 只提供文件传送的一些基本的服务,它使用 TCP 可靠的运输服务。FTP 的主要功能是减少或消除在不同操作系统下处理文件的不兼容性。
FTP 使用客户服务器方式。
一个 FTP 服务器进程可同时为多个客户进程提供服务。FTP的服务器进程由两大部分组成:一个主进程,负责接受新的请求;另外有若干个从属进程,负责处理单个请求。
A、通常的方式:
控制连接在整个会话期间一直保持打开,FTP 客户所发出的传送请求通过控制连接发送给控制进程,但控制连接并不用来传送文件,实际用于传输文件的是“数据连接”。
控制进程在接收到 FTP 客户发送来的文件传输请求后就创建一个“数据传送进程”和一个“数据连接”,并将数据连接连接到“数据传送进程”,数据传送进程实际完成文件的传送,在传送完毕后关闭“数据传送连接”并结束运行
当客户进程向服务器进程发出建立连接请求时,要寻找连接服务器进程的熟知端口(21),同时还要告诉服务器进程自己的另一个端口号码,用于建立数据传送连接。接着,服务器进程用自己传送数据的熟知端口(20)与客户进程所提供的端口号码建立数据传送连接。
B、 被动模式:
FTP客户端发出的连接请求,一般通过服务器的21号端口建立控制连接,专门用来传输一些字符串命令和响应信息。控制命令通道一定是由客户端向服务器的连接(默认的端口是21,也可以指定端口,这要看服务器的设置)。
PASV:通过控制通道通过发送PASV 服务器命令到 FTP服务器。请求建立被动模式数据连接通道。 (客户端的命令 passive)
服务器返回连接的信息(227 Entering Passive Mode (70,0,10,62,120,18) )地址和端口。端口=最后第二位乘256再加上最后一位(120*256+18)。(注意端口设为0的情况) 如: *f_port = atoi(port_1) * 256 + atoi(port_2);
服务器端和客户端身份转换,原客户端在本地建立监听,监听来自原服务器远端的连接请求建立数据连接通道。
四、 实现方法:
A、下载:
1、向服务器发送“REST + 本地文件长度”,告诉服务器,客户端要断点下载了。这时服务器还不知道客户端要下载的文件名;
2、向服务器发送"RETR + 文件名",通知服务器要下载的文件名,这时服务器开始定位文件指针读文件并发送数据。
3、客户端定位本地文件指针偏移到文件末尾;
4、两端的准备工作都做完了以后,客户端创建socket,以被动或非被动方式建立数据链接,循环调用recv接收文件数据并追加到本地文件末尾;
B、上传:
1、获取服务器上和本地要上传文件的同名文件大小;
2、向服务器发送“APPE + 文件名”,通知服务器,从数据通道发送给你的数据要附加到这个文件末尾。
3、定位本地文件指针,文件指针偏移到指定位置,这个位置与FTP服务器上文件大小相同的位置。
4、从文件指针处读数据并发送。
C、Ftp服务器命令
我们平时使用的命令,大多是客户端的。服务器端的命令可以参考下面:
命令 描述
ABOR 中断数据连接程序 ACCT <account> 系统特权帐号
ALLO <bytes> 为服务器上的文件存储器分配字节 APPE <filename> 添加文件到服务器同名文件
CDUP <dir path> 改变服务器上的父目录 CWD <dir path> 改变服务器上的工作目录
DELE <filename> 删除服务器上的指定文件 HELP <command> 返回指定命令信息 LIST <name> 如果是文件名列出文件信息,如果是目录则列出文件列表 MODE <mode> 传输模式(S=流模式,B=块模式,C=压缩模式)
MKD <directory> 在服务器上建立指定目录 NLST <directory> 列出指定目录内容
NOOP 无动作,除了来自服务器上的承认 PASS <password> 系统登录密码
PASV 请求服务器等待数据连接 PORT <address> IP 地址和两字节的端口 ID PWD 显示当前工作目录 QUIT 从 FTP 服务器上退出登录
REIN 重新初始化登录状态连接 REST <offset> 由特定偏移量重启文件传递
RETR <filename> 从服务器上找回(复制)文件 RMD <directory> 在服务器上删除指定目录
RNFR <old path> 对旧路径重命名 RNTO <new path> 对新路径重命名
SITE <params> 由服务器提供的站点特殊参数 SMNT <pathname> 挂载指定文件结构
STAT <directory> 在当前程序或目录上返回信息 STOR <filename> 储存(复制)文件到服务器上
STOU <filename> 储存文件到服务器名称上 STRU <type> 数据结构(F=文件,R=记录,P=页面)
SYST 返回服务器使用的操作系统 TYPE <data type> 数据类型(A=ASCII,E=EBCDIC,I=binary)
USER <username>> 系统登录的用户名
D、服务器返回的部分数字代码含义
125 Data connection already open; Transfer starting.
226 Transfer complete.
227 Entering Passive Mode (127,0,0,1,4,18).
230 User xxxxx logged in.
331 Password required for xxxxx.
425 Can’t open data connection.
226 Closing data connection.
200 return a state of TYPE or MODE commond
220 connection state
五、关于Socket
关于Socket编程有很多参考资料,这里不作详细说明
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口
Socket 是一个基本的通信机制Socket把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议.
Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。
常用的Socket类型有两种:
A、流式Socket(SOCK_STREAM):流式是一种面向连接的Socket,针对于面向连接的TCP服务应用。
B、数据报式Socket(SOCK_DGRAM):数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。
Socket的程序是一种C/S结构,分客户端和服务器端。
A、客户端
– 初始化Socket
– 连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了
– 客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端
– 客户端读取数据,最后关闭连接,一次交互结束。
B、服务器端
- 初始化Socket
- 端口绑定(bind)
- 监听(listen)端口
- 调用accept阻塞,等待客户端连接
在这里我们使用的就是面向连接的流式Socket,只编写客户端的程序。
六、代码:
下面仅提供一个编译过并在使用中的函数简单的说明其实现原理,
需要有一点C语言和Linux/UNIX的socket编程基础即可理解。
只是建立连接和传输部分的一个函数。当文件传出结束或断开时,
可以调用检查函数看是否成功,字节是否正常等,如果不正常结束,
可以再次循环调用它并定为服务器文件的字节,继续传输。
其他的控制和功能都在其他函数中实现。为移植方便使用标准C语法符合C89标准。
code:
/*****************************************************************
* FileName: uftt_ver5.c *
* Company: algorithmics china lib Co.,Ltd. *
* Author: G.L.Zhang --- zglcl008 *
* Time: [2006-12-20] *
* Description: uninterrupted file transfers tools *
*****************************************************************/
int f_file_trans(const char *ft_addr, int ft_port, const char *ft_usr,const char *ft_pwd, const char *ft_opt, const char *ft_src, char *ft_obj, int ft_flg)
{
int cmd_sock = -1;
int dat_sock = -1;
int stream_sock= -1;
int dat_port = 0;
char dat_buffer[1024*5];
struct sockaddr_in f_server;
struct sockaddr_in f_datasvr;
unsigned char *pasv_ip = NULL;
unsigned char *pasv_port = NULL;
unsigned int len_addr = 0;
long rc_size = 0;
/* long svr_file_size = 0; */
long file_size = 0;
int rc = 0;
if (ft_addr == NULL || ft_usr == NULLft_pwd == NULL ||
ft_opt == NULL || ft_src == NULL || ft_obj == NULL ||
ft_port == 0 || ft_flg < 0) {
err_quit("--- file transfers parameter error");
}
/* get ftp commomd socket */
if ((cmd_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("cmmond socket");
err_quit("--- command sock error");
}
bzero(&f_server, sizeof(f_server));
f_server.sin_family = AF_INET;
f_server.sin_port = htons(ft_port);
f_server.sin_addr.s_addr = inet_addr(ft_addr);
if (connect(cmd_sock, (struct sockaddr *)&f_server, sizeof(f_server)) < 0) {
perror("connect");
err_quit("--- command sock error");
}
rc = uftt_cmd(dat_buffer, cmd_sock, NULL);
if (rc == 220)
printf("-1- %d OK\n", rc);
else
printf("-1- %d ERR\n", rc);
rc = uftt_cmd(dat_buffer, cmd_sock,"USER %s",ft_usr);
if (rc == 331)
printf("-2- %d OK\n", rc);
else
printf("-3- %d ERR\n", rc);
rc = uftt_cmd(dat_buffer, cmd_sock,"PASS %s",ft_pwd);
if (rc == 230)
printf("-3- %d OK\n", rc);
else
printf("-3- %d ERR\n", rc);
rc = uftt_cmd(dat_buffer, cmd_sock, "TYPE I");
if (rc == 200)
printf("-41- %d OK\n", rc);
else
printf("-41- %d ERR\n", rc);
rc = uftt_cmd(dat_buffer, cmd_sock, "MODE S");
if (rc == 200)
printf("-42- %d OK\n", rc);
else
printf("-42- %d ERR\n", rc);
memset(dat_buffer, ''\0'', sizeof(dat_buffer));
rc = uftt_cmd(dat_buffer, cmd_sock, "PASV");
if (rc == 227)
printf("-5- %d OK\n", rc);
else
printf("-5- %d ERR\n", rc);
#ifdef ZGL_DEBUG
printf("-5- %d %s\n", rc, dat_buffer);
#endif
/* get passive port */
dat_port = 0;
if ((rc = get_svr_port(dat_buffer, (int *)&dat_port)) < 0)
err_quit("data stream port error");
#ifdef ZGL_DEBUG
printf("--- pasive port=[%d]\n", dat_port);
#endif
if ((dat_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("data socket");
err_quit("--- data sock error");
}
len_addr = sizeof(f_datasvr);
bzero(&f_datasvr, sizeof(f_datasvr));
rc = getsockname(cmd_sock, (struct sockaddr *)&f_datasvr, (unsigned int *)&len_addr);
f_datasvr.sin_port = htons(dat_port);
/* 0=all port or appoint port TEST OK ***
f_datasvr.sin_port = htons(dat_port);
f_datasvr.sin_port = 0;
*/
if (bind(dat_sock,(struct sockaddr *)&f_datasvr,len_addr) == -1)
err_sys("--- data sock bind error");
if (listen(dat_sock,1) == -1)
err_sys("--- data sock bind error");
rc = getsockname(dat_sock, (struct sockaddr *)&f_datasvr, (unsigned int *)&len_addr);
pasv_ip = (unsigned char *)&f_datasvr.sin_addr;
pasv_port = (unsigned char *)&f_datasvr.sin_port;
rc = uftt_cmd(dat_buffer, cmd_sock,"PORT %d,%d,%d,%d,%d,%d",pasv_ip[0],
pasv_ip[1], pasv_ip[2], pasv_ip[3], pasv_port[0], pasv_port[1]);
if (rc == 200)
printf("-6- %d OK\n", rc);
else
printf("-6- %d ERR\n", rc);
/* get RETR put STOR append APPE */
if (ft_flg == 0) {
rc = uftt_cmd(dat_buffer, cmd_sock, "STOR %s", ft_obj);
}
else if (ft_flg > 0){
rc = uftt_cmd(dat_buffer, cmd_sock, "APPE %s", ft_obj);
}
if (rc == 150)
printf("-7- %d OK\n", rc);
else
printf("-7- %d ERR\n", rc);
stream_sock = accept(dat_sock, (struct sockaddr *)&f_datasvr, (unsigned int *)&len_addr);
if (stream_sock < 0)
err_sys("--- stream socket error");
rc_size = f_put_file(stream_sock, ft_src, ft_obj, ft_flg, file_size);
/* do without ***
rc = uftt_cmd(dat_buffer, dat_sock,"QUIT");
printf("-8- %d \n", rc);
*/
close(stream_sock);
close(dat_sock);
rc = uftt_cmd(dat_buffer, cmd_sock,"QUIT");
if (rc == 226)
printf("-9- %d OK\n", rc);
else
printf("-9- %d ERR\n", rc);
close(cmd_sock);
return rc_size ;
}
⑤ 网络编程案例ftp客户端怎么连接服务器
示例:创建一个http get请求,序列化后的请求应该通过写入流(write stream)发送。
CFStringRef requestHeader = CFSTR("Connection");
CFStringRef requestHeaderValue = CFSTR("close");
CFStringRef requestBody = CFSTR("");
CFStringRef url = CFSTR("http://www..com/");
CFStringRef requestMethod = CFSTR("GET");
CFURLRef requestURL = CFURLCreateWithString(kCFAllocatorDefault, url, NULL);
CFHTTPMessageRef request = CFHTTPMessageCreateRequest(kCFAllocatorDefault, requestMethod, requestURL, kCFHTTPVersion1_1);
CFHTTPMessageSetBody(request, requestBody);
(request, requestHeader, requestHeaderValue);
CFDataRef serializedRequest = (request);
创建HTTP相应的步骤与创建请求的方法差不多,不同之处是用CFHTTPMessageCreateResponse函数代替CFHTTPMessageCreateRequest。
可以使用一个CFReadStream对象来序列化并发送CFHTTP请求。当使用CFReadStream对象时,打开读取流的同时消息会被序列化并发送,这样可以方便地获取响应。如下:
CFHTTPMessageRef request = CFHTTPMessageCreateRequest(kCFAllocatorDefault, requestMethod, requestURL, kCFHTTPVersion1_1);
CFHTTPMessageSetBody(request, requestBody);
(request, requestHeader, requestHeaderValue);
CFReadStreamRef readStream = (kCFAllocatorDefault, request);
CFReadStreamOpen(readStream);
调用CFReadStreamCopyProperty 可以从读取流获取响应消息,代码如下:
CFHTTPMessageRef response = CFReadStreamCopyProperty(readStream, );
使用函数获得完整的状态行,如下:
CFStringRef statusLine = (response);
或者,使用函数获取状态码,如下:
UInt32 errCode = (response);
为了获取返回的数据,可以使用CFReadStreamSetClient方法设置回调函数,将readStream加到run loop中。在回调函数将每次读取的数据存起来(比如,有一个NSMutableData类型的变量data),读完后处理数据,代码如下:
if( == eventType)
{
UInt8 buff[255];
int length = CFReadStreamRead(stream, buff, 254);
[data appendBytes:buff length:length];
if(kCFStreamEventEndEncountered == eventType)
{
//读取已完成,处理读取的数据
}
}
如果接收数据是中文字符串,注意在创建NSString时选择编码,比如UTF8或GB2312编码,如下所示:
NSString *string = [[NSString alloc] initWithData:data encoding:0x80000632];//GB2312编码
当使用创建读取流时,流的重定向默认是被禁止的。如果请求连接被重定向,会导致一个错误,它的状态码为300~307。如果收到一个重定向错误,需要关闭这个流,然后重新创建一个流,启用重定向并打开流。如下:
CFReadStreamRef readStream = (kCFAllocatorDefault, request);
if(CFReadStreamSetProperty(readStream, , kCFBooleanTrue) == false)
{
//出错处理
}
CFReadStreamOpen(myReadStream);
2.CFFTP
CFFTP也使用CFReadStream来传送FTP数据。使用CFReadStreamCreateWithFTPURL方法来创建FTP请求,这样会同时创建一个CFReadStreamRef对象来读取FTP服务器发送的数据,代码如下:
CFStringRef url = CFSTR("ftp://ftp.example.com/file.txt");
CFURLRef requestURL = CFURLCreateWithString(kCFAllocatorDefault, url, NULL);
CFReadStreamRef readStream = CFReadStreamCreateWithFTPURL(kCFAllocatorDefault, requestURL);
下一步,使用CFReadStreamSetClient方法设置回调函数来读取数据,然后把readStream加到程序的run loop中。
如果FTP需要使用用户名和密码认证,通过CFReadStreamSetProperty方法设置kCFStreamPropertyFTPUserName和kCFStreamPropertyFTPPassword属性。
要将文件下载到本地,可以使用CFWriteStreamCreateWithFile方法创建一个指向本地文件的写入流,将接收到的数据写入。
上传文件和下载文件差不多,只不过把读取流和写入流反过来用,使用CFWriteStreamCreateWithFTPURL方法创建写入流,使用CFReadStreamCreateWithFile创建读取流。
创建远程目录的方法与上传文件类似,只不过将CFURL对象设置一个路径而不是文件。
获取目录列表的方法与下载文件类似,数据读取到缓存后使用,方法对读取进行解析。
3.NSURLConnection
CFNetwork是比较底层的接口,虽然用起来比较灵活,但并不好用。多数程序仅仅需要创建简单的请求来获取互联网上的一个文件,那么使用NSURLConnection要更加方便,因为不用跟套接字、流还有回调函数打交道,取而代之的是更熟悉的委托机制。
创建一个NSURL对象:
NSNRL *url = [NSURL URLWithString:@"http://www..com/"];
NSURL对象是用来创建NSURLRequest对象的,如下:
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url cachePolicy::60.0];
可选的缓存策略有以下几种。
(1):使用相关协议默认缓存策略。
(2): 无论本地缓存是什么,请求都要重新加载数据。
(3):不仅要忽略本地缓存,在协议允许的情况下也要忽略远程代理或中间件的缓存。
(4):优先使用缓存数据,缓存不存在时再去加载请求。
(5):只加载缓存数据,缓存中不存在时也不请求,可理解为离线模式。
(6): 缓存中的数据没有过期时才加载缓存中的数据,否则请求数据并刷新缓存。
创建完NSURLRequest对象后就可以创建NSURLConnection对象了,如下:
NSURLConnection *connection = [[NSRULConnection alloc] initWithRequest:request delegate:self];
这个是异步调用,NSURLConnection会在后台发送请求,通过设置委托参数,有数据时会收到通知。由一些委托方法来处理连接是过程中的不同事件。
当服务主机有响应将要开始发送数据时,didReceiveResponse:方法会被调用。这里可以做一些初始化的工作,比如有一个NSMutableData类型的data对象来存储数据,在这里可以把对象长度设为0,如下所示
-(void) connection:(NSURLConnection *)connection didReceiveRespose:(NSURLResonse *)response
{
[data setLength:0];
}
当接收到数据时,didReceiveData:方法会被调用。这里可以把数据加到NSMutableData对象的后面,如下:
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)incomingData
{
[data appendData:incomingData];
}
当数据加载完成时会调用connecitionDidFinshLoading:方法,处理传入的数据。这里以字符串处理为例,示例应用中传入的可能是图片或其他任何类型的对象。
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(string);
[data release];
}
连接或传送数据失败时,didFailWithError方法会被调用,如下:
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSLog(@"query failed with error:%@", [error localizedDescription]);
[data release];
}
⑥ ftpclient 用的是nio还是io
nio是new io的简称,从jdk1.4就被引入了。现在的jdk已经到了1.6了,可以说不是什么新东西了。但其中的一些思想值得我来研究。这两天,我研究了下其中的套接字部分,有一些心得,在此分享。
首先先分析下:为什么要nio套接字?
nio的主要作用就是用来解决速度差异的。举个例子:计算机处理的速度,和用户按键盘的速度。这两者的速度相差悬殊。如果按照经典的方法:一个用户设定一个线程,专门等待用户的输入,无形中就造成了严重的资源浪费:每一个线程都需要珍贵的cpu时间片,由于速度差异造成了在这个交互线程中的cpu都用来等待。
nio套接字是怎么做到的?
其实,其中的思想很简单:轮询。一个线程轮询多个input;传统的方式是:有n个客户端就要有n个服务线程+一个监听线程,现在采取这种凡是,可以仅仅使用1个线程来代替n个服务线程以此来解决。
具体应用例子:
在ftp的控制连接中,因为只有少量的字符命令进行传输,所以可以考虑利用这种轮询的方式实现,以节省资源。
-----------------------------------------------------
Java中的阻塞和非阻塞IO包各自的优劣思考
NIO 设计背后的基石:反应器模式,用于事件多路分离和分派的体系结构模式。
反应器(Reactor):用于事件多路分离和分派的体系结构模式
通常的,对一个文件描述符指定的文件或设备, 有两种工作方式: 阻塞 与非阻塞 。所谓阻塞方式的意思是指, 当试图对该文件描述符进行读写时, 如果当时没有东西可读,或者暂时不可写, 程序就进入等待 状态, 直到有东西可读或者可写为止。而对于非阻塞状态, 如果没有东西可读, 或者不可写, 读写函数马上返回, 而不会等待 。
一种常用做法是:每建立一个Socket连接时,同时创建一个新线程对该Socket进行单独通信(采用阻塞的方式通信)。这种方式具有很高的响应速度,并且控制起来也很简单,在连接数较少的时候非常有效,但是如果对每一个连接都产生一个线程的无疑是对系统资源的一种浪费,如果连接数较多将会出现资源不足的情况。
另一种较高效的做法是:服务器端保存一个Socket连接列表,然后对这个列表进行轮询,如果发现某个Socket端口上有数据可读时(读就绪),则调用该socket连接的相应读操作;如果发现某个 Socket端口上有数据可写时(写就绪),则调用该socket连接的相应写操作;如果某个端口的Socket连接已经中断,则调用相应的析构方法关闭该端口。这样能充分利用服务器资源,效率得到了很大提高。
传统的阻塞式IO,每个连接必须要开一个线程来处理,并且没处理完线程不能退出。
非阻塞式IO,由于基于反应器模式,用于事件多路分离和分派的体系结构模式,所以可以利用线程池来处理。事件来了就处理,处理完了就把线程归还。而传统阻塞方式不能使用线程池来处理,假设当前有10000个连接,非阻塞方式可能用1000个线程的线程池就搞定了,而传统阻塞方式就需要开10000个来处理。如果连接数较多将会出现资源不足的情况。非阻塞的核心优势就在这里。
为什么会这样,下面就对他们做进一步细致具体的分析:
首先,我们来分析传统阻塞式IO的瓶颈在哪里。在连接数不多的情况下,传统IO编写容易方便使用。但是随着连接数的增多,问题传统IO就不行了。因为前面说过,传统IO处理每个连接都要消耗 一个线程,而程序的效率当线程数不多时是随着线程数的增加而增加,但是到一定的数量之后,是随着线程数的增加而减少。这里我们得出结论,传统阻塞式IO的瓶颈在于不能处理过多的连接。
然后,非阻塞式IO的出现的目的就是为了解决这个瓶颈。而非阻塞式IO是怎么实现的呢?非阻塞IO处理连接的线程数和连接数没有联系,也就是说处理10000个连接非阻塞IO不需要10000个线程,你可以用1000个也可以用2000个线程来处理。因为非阻塞IO处理连接是异步的。当某个连接发送请求到服务器,服务器把这个连接请求当作一个请求"事件",并把这个"事件"分配给相应的函数处理。我们可以把这个处理函数放到线程中去执行,执行完就把线程归还。这样一个线程就可以异步的处理多个事件。而阻塞式IO的线程的大部分时间都浪费在等待请求上了。
⑦ FTP是什么
FTP(File Transfer Protocol,文件传输协议) 是 TCP/IP 协议组中的协议之一。FTP协议包括两个组成部分,其一为FTP服务器,其二为FTP客户端。
其中FTP服务器用来存储文件,用户可以使用FTP客户端通过FTP协议访问位于FTP服务器上的资源。在开发网站的时候,通常利用FTP协议把网页或程序传到Web服务器上。此外,由于FTP传输效率非常高,在网络上传输大的文件时,一般也采用该协议。
(7)ftp是异步吗扩展阅读:
同大多数Internet服务一样,FTP也是一个客户/服务器系统。用户通过一个客户机程序连接至在远程计算机上运行的服务器程序。依照 FTP 协议提供服务,进行文件传送的计算机就是 FTP服务器,而连接FTP服务器,遵循FTP协议与服务器传送文件的电脑就是FTP客户端。
用户要连上FTP 服务器,就要用到 FTP 的客户端软件,通常 Windows自带“ftp”命令,这是一个命令行的 FTP客户程序,另外常用的 FTP 客户程序还有FileZilla、 CuteFTP、Ws_FTP、Flashfxp、LeapFTP、流星雨-猫眼等。
⑧ FTP采用的是什么工作模式,可以实现的文件传输方式有哪两种
FTP可以采用2种工作模式,分别是Port模式、Passive模式;
FTP的传输有两种方式:ASCII、二进制:
1、ASCII传输方式:
假定用户正在拷贝的文件包含的简单ASCII码文本,如果在远程机器上运行的不是UNIX,当文件传输时ftp通常会自动地调整文件的内容以便于把文件解释成另外那台计算机存储文本文件的格式
2、二进制传输模式:
在二进制传输中,保存文件的位序,以便原始和拷贝的是逐位一一对应的。即使目的地机器上包含位序列的文件是没意义的。例如,macintosh以二进制方式传送可执行文件到Windows系统,在对方系统上,此文件不能执行。
(8)ftp是异步吗扩展阅读:
FTP文件传输协议的特点介绍:
FTP工作在TCP/IP模型的应用层,基于的传输协议是TCP,FTP客户端和服务器之间的连接是可靠的,面向连接的,为数据的传输提供了可靠的保证。
FTP的主要特征:
1、控制连接是建立在客户协议解释器和服务器协议解释器之间用于交换命令与应答的通信链路
2、数据连接是传输数据的全双工连接。传输数据可以发生在服务器数据传输过程DTP和客户DTP之间,也可以发生在两个服务器的DTP之间。
⑨ FTP,ALM是什么意思呀
ATM,或者说异步传输模式,最初被设计用来为数字通讯传输宽带综合业务数字网,但也提供了一种将所有数据传输集成到相同构架的途径。ATM支持:
广域网并不固定于特定的物理实现,它有灵活的速度,独立于它所传输的数据类型。
就像可改善的物理资源一样,可升级的数据传送构架的规定已成为可能。
决定于应用和使用的物理连接的不同为速率的链接。
使用同一普遍技术的广域和局域网的集成。
在商业领域,解释每一被发送的认证和票据的数据单元的能力。
对于终极用户担保的服务质量的规定。
ATM协议是基于标准的,与由ATM论坛实现的ATM标准同等。ATM论坛是‘一非盈利性的国际组织,目的是通过协同性规定的快速汇聚来加速ATM产品和服务的使用。由许多涉及ATM论坛的公司,包括摩托罗拉、微软、诺基亚、AT&T、Mitsubishi、Ericsson、Sun微系统等等。在网页Http://www.atmforum.com/atmforum有成员的完整的列表。
ATM是一面向连接的技术,使用53字节的小的、固定的长度单元,允许网上的非常快速的交换。一ATM网络,在数据能够在两节点之间传输之前,它们之间建立了一条虚拟路径。虚拟路径,如下图所示,很像网上转换之间的管道。每一管道包含了一个或多个虚拟信道,每一信道仅单向的传输一独立的数据流。例如,为建立一电话通话,一条虚拟路径需两条各是64bps且反向的虚拟信道。每一虚拟信道有其自身的带宽和服务需求。
使用虚拟路径是因为ATM非常快,因此需要非常快的交换,而传统的路由器并不足够快速。没有时间来把包读入缓冲区,检查它的目的地址,查查询表以找到发送包的下一个地址,然后把包发送出去。ATM在数据传输开始之前将包按虚拟路径(VPI)和虚拟信道(VCI)编成独立的号码。数据单元仅包含简短的VPI和VCI(总共28位),不是整个目的地址,并且当数据单元还正在进入交换时VPI和VCI已被非常快的读和处理了,因此数据单元在交换本身花费很少的时间。 使用虚拟路径和虚拟信道的另一优点是一旦建立,路径是固定的,除非设备问题;因此没有数据单元混乱无序的风险。这是同步(时间依赖)通讯更易于处理。在路径建立期间,服务质量也同时认定。这包括有带宽、传输时间、被传输的通信量的需要的抖动、允许ATM网络处理通讯的不同类型和保证对于终极用户所期望的连接质量。
⑩ 什么是“FTP”什么是“流媒体”
FTP(File Transfer Protocal),是文件传输协议的简称。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。用户可以通过它把自己的PC机与世界各地所有运行FTP协议的服务器相连,访问服务器上的大量程序和信息。
上面抄的。。
其实就是一个端口。提供别人进入浏览下载文件的
所谓流媒体是指采用流式传输的方式在Internet播放的媒体格式。 流媒体又叫流式媒体,它是指商家用一个视频传送服务器把节目当成数据包发出,传送到网络上。用户通过解压设备对这些数据进行解压后,节目就会像发送前那样显示出来。
这个我专业性的。我也答不好