Windows 和 Linux下使用socket下载网页页面内容(可设置接收/发送超时)的代码

主要难点在于设置recv()与send()的超时时间,具体要注意的事项,请看代码注释部分,下面是代码:

[cpp] view plaincopyprint?

  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <errno.h>
  6. #include <string.h>
  7. #ifdef _WIN32   ///包含win socket相关头文件
  8. #include <winsock.h>
  9. #pragma comment(lib,"ws2_32.lib")
  10. #else       ///包含linux socket相关头文件
  11. #include <unistd.h>
  12. #include <strings.h>
  13. #include <netinet/in.h>
  14. #include <sys/socket.h>
  15. #include <arpa/inet.h>
  16. #include <netdb.h>
  17. #include <fcntl.h>
  18. #include <stdint.h>
  19. #endif
  20. #ifdef _WIN32
  21. #ifdef __cplusplus
  22. extern "C"{
  23. #endif
  24. int strcasecmp(const char *s1, const char *s2)
  25. {
  26. while ((*s1 != ‘\0‘)
  27. && (tolower(*(unsigned char *) s1) ==
  28. tolower(*(unsigned char *) s2)))
  29. {
  30. s1++;
  31. s2++;
  32. }
  33. return tolower(*(unsigned char *) s1) - tolower(*(unsigned char *) s2);
  34. }
  35. int strncasecmp(const char *s1, const char *s2, unsigned int n)
  36. {
  37. if (n == 0)
  38. return 0;
  39. while ((n-- != 0)
  40. && (tolower(*(unsigned char *) s1) ==
  41. tolower(*(unsigned char *) s2))) {
  42. if (n == 0 || *s1 == ‘\0‘ || *s2 == ‘\0‘)
  43. return 0;
  44. s1++;
  45. s2++;
  46. }
  47. return tolower(*(unsigned char *) s1) - tolower(*(unsigned char *) s2);
  48. }
  49. #ifdef __cplusplus
  50. }
  51. #endif
  52. #endif
  53. /**********************************
  54. *功能:Base64编码
  55. *参数:
  56. src_data:待编码的字符串
  57. coded_data:编码后的字符串
  58. *返回值:-1,失败;0,成功
  59. ***********************************/
  60. int base64encode(const char * src_data/*in,待编码的字符串*/,char * coded_data/*out,编码后的字符串*/)
  61. {
  62. const char EncodeTable[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  63. int src_data_len = strlen(src_data);
  64. int i;
  65. int lineLength=0;
  66. int mod=src_data_len % 3;
  67. unsigned char tmp[4]={0};
  68. char buff[5]={0};
  69. for(i=0;i<(int)(src_data_len / 3);i++)
  70. {
  71. tmp[1] = *src_data++;
  72. tmp[2] = *src_data++;
  73. tmp[3] = *src_data++;
  74. sprintf(buff,"%c%c%c%c", EncodeTable[tmp[1] >> 2],EncodeTable[((tmp[1] << 4) | (tmp[2] >> 4)) & 0x3F],EncodeTable[((tmp[2] << 2) | (tmp[3] >> 6)) & 0x3F],EncodeTable[tmp[3] & 0x3F]);
  75. strcat(coded_data,buff);
  76. if(lineLength+=4,lineLength==76)
  77. {
  78. strcat(coded_data,"\r\n");
  79. lineLength=0;
  80. }
  81. }
  82. if(mod==1)
  83. {
  84. tmp[1] = *src_data++;
  85. sprintf(buff,"%c%c==",EncodeTable[(tmp[1] & 0xFC) >> 2],EncodeTable[((tmp[1] & 0x03) << 4)]);
  86. strcat(coded_data,buff);
  87. }
  88. else if(mod==2)
  89. {
  90. tmp[1] = *src_data++;
  91. tmp[2] = *src_data++;
  92. sprintf(buff,"%c%c%c=",EncodeTable[(tmp[1] & 0xFC) >> 2],EncodeTable[((tmp[1] & 0x03) << 4) | ((tmp[2] & 0xF0) >> 4)],EncodeTable[((tmp[2] & 0x0F) << 2)]);
  93. strcat(coded_data,buff);
  94. }
  95. return 0;
  96. }
  97. //格式化http头,返回值:-1失败,-2用户名或密码无效;>=0 成功
  98. int format_http_header(const char * webserverip,
  99. unsigned short httpport/*web server 端口*/,
  100. const char * url/*页面相对url,下载的页面为:http://ip/url"*/,
  101. const char * username/*网站认证用户*/,
  102. const char * password/*认证密码*/,
  103. const char * ext_param/*访问网页附加参数*/,
  104. int net_timeout/*超时时间,秒*/,
  105. char header[512]/*out*/)
  106. {
  107. int len =0;
  108. char buf_auth[100]={0},auth[100]={0};
  109. sprintf(buf_auth,"%s:%s",username,password);
  110. base64encode(buf_auth,auth);
  111. if(ext_param)
  112. {
  113. len = strlen(ext_param);
  114. }
  115. if(len)
  116. {
  117. //GET
  118. return sprintf(header,
  119. "GET /%s?%s HTTP/1.1\r\n"
  120. "Host:%s:%u\r\n"
  121. "Content-Type: application/x-www-form-urlencoded\r\n"
  122. "Keep-Alive: Keep-Alive: timeout=%d\r\n"
  123. "Connection: keep-alive\r\n"
  124. "Accept:text/html\r\n"
  125. "Authorization: Basic %s\r\n"
  126. "\r\n"
  127. ,url,ext_param,webserverip,httpport,net_timeout,auth
  128. );
  129. }
  130. //GET
  131. return sprintf(header,
  132. "GET /%s HTTP/1.1\r\n"
  133. "Host:%s:%u\r\n"
  134. "Content-Type: application/x-www-form-urlencoded\r\n"
  135. "Keep-Alive: timeout=%d\r\n"
  136. "Connection: keep-alive\r\n"
  137. "Accept:text/html\r\n"
  138. "Authorization: Basic %s\r\n"
  139. "\r\n"
  140. ,url,webserverip,httpport,net_timeout,auth
  141. );
  142. /*POST /login.php HTTP/1.1 必有字段
  143. Host: www.webserver.com:80 必有字段
  144. User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/2008052906 Firefox/3.0
  145. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,**; q=.2\r\n");  必有字段
  146. Accept-Language: zh-cn,zh;q=0.5
  147. Accept-Encoding: gzip,deflate
  148. Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7
  149. Keep-Alive: 300
  150. Connection: keep-alive
  151. Referer: http://www.vckbase.com/
  152. Cookie: ASPSESSIONIDCSAATTCD=DOMMILABJOPANJPNNAKAMCPK
  153. Content-Type: application/x-www-form-urlencoded 必有字段
  154. Content-Length: 79 post方式时必有字段*/
  155. /*GET方式HTTP头写法*/
  156. /*sprintf(header,
  157. "GET /ipnc/php/ipnc.php?%s HTTP/1.1\r\n"
  158. "Host:%s\r\n"
  159. "Content-Type:application/x-www-form-urlencoded\r\n"
  160. "Accept:text/html\r\n"
  161. "\r\n"
  162. ,parm,serverip
  163. );*/
  164. }
  165. int parse_response_http_header(const char * all_contents/*接收到的所有内容,包含http头*/,char ** contents/*返回自己需要的内容*/)
  166. {
  167. /**
  168. *根据需求分析网页的内容
  169. **/
  170. return 0;
  171. }
  172. //分析返回的内容的长度
  173. int parse_respose_contents_length(const char * header/*in,http头*/)
  174. {
  175. char * p = (char *)header;
  176. int tmp = 0;
  177. #if 1
  178. if(p)
  179. {
  180. //获取内容长度
  181. while(*p)
  182. {
  183. if(*p == ‘\r‘)
  184. {
  185. if(strncasecmp(p,"\r\n\r\n",4) != 0)//http头没有结束
  186. {
  187. p+=2;//过滤\n
  188. if(strncasecmp(p,"Content-Length",14) == 0)
  189. {
  190. while(*p)
  191. {
  192. if(*p == ‘:‘)
  193. {
  194. p++;
  195. tmp = atoi(p);
  196. break;
  197. }
  198. p++;
  199. }
  200. break;
  201. }
  202. }
  203. else
  204. {
  205. break;
  206. }
  207. }
  208. p++;
  209. }
  210. if(!tmp)//没有Content-Length字段
  211. {
  212. for(p = (char*)header;*p;p++)
  213. {
  214. if(*p == ‘\r‘)
  215. {
  216. if(strncmp(p,"\r\n\r\n",4) == 0)
  217. {
  218. p+=4;
  219. tmp = strlen(p);
  220. break;
  221. }
  222. }
  223. }
  224. }
  225. }
  226. #endif
  227. return tmp;
  228. }
  229. #define HTTP_RECV_BUFFER_SIZE 1024*1024*3 //3MB的接收缓存
  230. #define RECV_BUFF_SIZE  1024
  231. int download_web_page(const char * ipv4/*web server ip地址*/,
  232. unsigned short httpport/*web server 端口*/,
  233. const char * url/*页面相对url,下载的页面为:http://ip/url"*/,
  234. const char * username/*网站认证用户*/,
  235. const char * password/*认证密码*/,
  236. const char * ext_param/*访问网页附加参数*/,
  237. int net_timeout/*网络超时时间,秒*/,
  238. char ** contents/*out:返回的实际内容,无http头,需要使用free函数手动释放空间*/
  239. )
  240. {
  241. #ifdef _WIN32
  242. WSADATA wsaData;          //指向WinSocket信息结构的指针
  243. #endif
  244. struct sockaddr_in server_addr;
  245. int sockfd = -1;
  246. char szHttpHeader[1024]={0};
  247. char * pszBuffer    =   NULL;///堆栈溢出,所以使用堆空间
  248. char szRecvBuffer[RECV_BUFF_SIZE+1]={0};
  249. int len = 0,total_recv_len=0,total_contents_len = 0,re=-1;
  250. unsigned long flags;
  251. fd_set fs;
  252. char * pHttpHeaderEnd = NULL;
  253. #ifdef _WIN32
  254. /*
  255. *这里请注意
  256. *windows下设置接收/发送超时时间时,setsockopt函数对应的超时时间为int型(且超时时间的值的单位为毫秒,当时我直接填写为秒,老是接收超时)
  257. *linux下为struct timeval结构
  258. */
  259. int timeout = net_timeout*1000;
  260. struct timeval select_timeout={0};
  261. select_timeout.tv_sec=net_timeout;
  262. #else
  263. struct timeval timeout={.tv_sec=net_timeout,.tv_usec=0};
  264. #endif
  265. #ifdef _WIN32
  266. if(WSAStartup(MAKEWORD( 1, 1 ), &wsaData )!=0)//进行WinSocket的初始化
  267. {
  268. WSACleanup();
  269. return -1;//Can‘t initiates windows socket!初始化失败
  270. }
  271. #endif
  272. if((sockfd = socket(AF_INET,SOCK_STREAM,0)) <= 0)
  273. {
  274. #if defined CONSOLE || defined LINUX
  275. printf("创建socket失败.错误代码:%d,错误原因:%s\n",errno,strerror(errno));
  276. #endif
  277. return -1;//create socket fd failed
  278. }
  279. ///设置接收超时时间
  280. if(setsockopt(sockfd,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(timeout)) != 0)
  281. {
  282. #if defined CONSOLE || defined LINUX
  283. printf("设置socket发送超时时间失败.错误代码:%d,错误原因:%s\n",errno,strerror(errno));
  284. #endif
  285. #ifdef _WIN32
  286. closesocket(sockfd);
  287. #else
  288. close(sockfd);
  289. #endif
  290. return -1;
  291. }
  292. ///设置发送超时时间
  293. if(setsockopt(sockfd,SOL_SOCKET,SO_SNDTIMEO,(char *)&timeout,sizeof(timeout)) != 0)
  294. {
  295. #if defined CONSOLE || defined LINUX
  296. printf("设置socket接收超时时间失败.错误代码:%d,错误原因:%s\n",errno,strerror(errno));
  297. #endif
  298. #ifdef _WIN32
  299. closesocket(sockfd);
  300. #else
  301. close(sockfd);
  302. #endif
  303. return -1;
  304. }
  305. ///设置非阻塞方式,使用select来判断connect是否超时
  306. #ifdef _WIN32
  307. flags=1;
  308. if( ioctlsocket(sockfd,FIONBIO,&flags) != 0)
  309. #else
  310. flags=fcntl(sockfd,F_GETFL,0);
  311. flags |= O_NONBLOCK;
  312. if( fcntl(sockfd,F_SETFL,flags) != 0)
  313. #endif
  314. {
  315. #if defined CONSOLE || defined LINUX
  316. printf("设置socket为非阻塞失败.错误代码:%d,错误原因:%s\n",errno,strerror(errno));
  317. #endif
  318. #ifdef _WIN32
  319. closesocket(sockfd);
  320. #else
  321. close(sockfd);
  322. #endif
  323. return -1;
  324. }
  325. ///设置连接参数
  326. #ifdef _WIN32
  327. memset(&server_addr,0,sizeof(struct sockaddr_in));
  328. #else
  329. bzero(&server_addr,sizeof(struct sockaddr_in));
  330. #endif
  331. server_addr.sin_family      = AF_INET;
  332. server_addr.sin_port        = htons(httpport);
  333. server_addr.sin_addr.s_addr = inet_addr(ipv4);
  334. ///连接服务器
  335. if( connect(sockfd,(struct sockaddr *)&server_addr,sizeof(struct sockaddr_in)) < 0)
  336. {
  337. int ret = 0;
  338. ///判断是否超时
  339. FD_ZERO(&fs);
  340. FD_SET(sockfd,&fs);
  341. #ifdef _WIN32
  342. ret = select(sockfd+1,NULL,&fs,NULL,&select_timeout);
  343. #else
  344. ret = select(sockfd+1,NULL,&fs,NULL,&timeout);
  345. #endif
  346. if(ret == 0)//超时
  347. {
  348. #if defined CONSOLE || defined LINUX
  349. printf("链接服务器超时.错误代码:%d,错误原因:%s\n",errno,strerror(errno));
  350. #endif
  351. #ifdef _WIN32
  352. closesocket(sockfd);
  353. #else
  354. close(sockfd);
  355. #endif
  356. return -1;//连接超时
  357. }
  358. else if(ret < 0)///错误
  359. {
  360. #if defined CONSOLE || defined LINUX
  361. printf("链接服务器时发生错误.错误代码:%d,错误原因:%s\n",errno,strerror(errno));
  362. #endif
  363. #ifdef _WIN32
  364. closesocket(sockfd);
  365. #else
  366. close(sockfd);
  367. #endif
  368. return -1;
  369. }
  370. }
  371. ///设置为阻塞方式发送和接收数据
  372. #ifdef _WIN32
  373. flags=0;
  374. if( ioctlsocket(sockfd,FIONBIO,&flags) != 0)
  375. #else
  376. flags=fcntl(sockfd,F_GETFL,0);
  377. flags &= ~O_NONBLOCK;
  378. if( fcntl(sockfd,F_SETFL,flags) != 0)
  379. #endif
  380. {
  381. #if defined CONSOLE || defined LINUX
  382. printf("设置socket为阻塞失败.错误代码:%d,错误原因:%s\n",errno,strerror(errno));
  383. #endif
  384. #ifdef _WIN32
  385. closesocket(sockfd);
  386. #else
  387. close(sockfd);
  388. #endif
  389. return -1;//ioctlsocket() error
  390. }
  391. format_http_header(ipv4,httpport,url,username,password,ext_param,net_timeout,szHttpHeader);
  392. len = strlen(szHttpHeader);
  393. ///发送http头
  394. if(send(sockfd,szHttpHeader,len,0) != len)
  395. {
  396. #if defined CONSOLE || defined LINUX
  397. printf("发送http头失败.错误代码:%d,错误原因:%s\nhttp头:\n%s\n",errno,strerror(errno),szHttpHeader);
  398. #endif
  399. #ifdef _WIN32
  400. closesocket(sockfd);
  401. #else
  402. close(sockfd);
  403. #endif
  404. return -1;//发送数据失败
  405. }
  406. ///准备接收数据
  407. pszBuffer = (char *)malloc(HTTP_RECV_BUFFER_SIZE);
  408. if(!pszBuffer)
  409. {
  410. #if defined CONSOLE || defined LINUX
  411. printf("内存分配失败\n");
  412. #endif
  413. #ifdef _WIN32
  414. closesocket(sockfd);
  415. #else
  416. close(sockfd);
  417. #endif
  418. return -1;//outof memory
  419. }
  420. #ifdef _WIN32
  421. memset(pszBuffer,0,HTTP_RECV_BUFFER_SIZE);
  422. #else
  423. bzero(pszBuffer,HTTP_RECV_BUFFER_SIZE);
  424. #endif
  425. while(1)
  426. {
  427. #ifdef _WIN32
  428. len = recv(sockfd,szRecvBuffer,RECV_BUFF_SIZE,0);
  429. #else
  430. len = recv(sockfd,szRecvBuffer,RECV_BUFF_SIZE,MSG_WAITALL);
  431. #endif
  432. if(len == 0)
  433. {
  434. #if defined CONSOLE || defined LINUX
  435. printf("接收数据超时,超时时间:%d s\n",net_timeout);
  436. #endif
  437. #ifdef _WIN32
  438. closesocket(sockfd);
  439. #else
  440. close(sockfd);
  441. #endif
  442. free(pszBuffer);
  443. return -1;//接收数据超时
  444. }
  445. if(len < 0 )
  446. {
  447. #if defined CONSOLE || defined LINUX
  448. printf("接收数据错误,recv返回值:%d \n",len);
  449. #endif
  450. #ifdef _WIN32
  451. closesocket(sockfd);
  452. #else
  453. close(sockfd);
  454. #endif
  455. free(pszBuffer);
  456. return -1;//timeout
  457. }
  458. //printf("%s",szBuffer);
  459. total_recv_len += len;
  460. if(total_recv_len > (HTTP_RECV_BUFFER_SIZE-1) )
  461. {
  462. #if defined CONSOLE || defined LINUX
  463. printf("接收数据buffer空间不足,当前buffer大小:%d B\n",HTTP_RECV_BUFFER_SIZE-1);
  464. #endif
  465. #ifdef _WIN32
  466. closesocket(sockfd);
  467. #else
  468. close(sockfd);
  469. #endif
  470. free(pszBuffer);
  471. return -1;//not enough buffer size
  472. }
  473. strcat(pszBuffer,szRecvBuffer);
  474. if(len < RECV_BUFF_SIZE)
  475. {
  476. pHttpHeaderEnd = strstr(pszBuffer,"\r\n\r\n");
  477. if(pHttpHeaderEnd )
  478. {
  479. if(!total_contents_len)///http返回头中标示的内容大小
  480. {
  481. total_contents_len = parse_respose_contents_length(pszBuffer);
  482. }
  483. pHttpHeaderEnd += 4;
  484. //如果接收到的内容长度已经达到http返回头中标示的内容大小,停止接收
  485. if( total_contents_len && strlen( pHttpHeaderEnd) >= total_contents_len )
  486. break;
  487. pHttpHeaderEnd = NULL;
  488. }
  489. }
  490. #ifdef _WIN32
  491. memset(szRecvBuffer,0,sizeof(szRecvBuffer));
  492. #else
  493. bzero(szRecvBuffer,sizeof(szRecvBuffer));
  494. #endif
  495. len = 0;
  496. }
  497. if(strcmp(pszBuffer,"") == 0)
  498. {
  499. #ifdef _WIN32
  500. closesocket(sockfd);
  501. #else
  502. close(sockfd);
  503. #endif
  504. free(pszBuffer);
  505. return -1;//recv data error
  506. }
  507. //printf("%s\n",szBuffer);
  508. * contents = NULL;
  509. re = parse_response_http_header(pszBuffer,contents);
  510. if( re != 0 || !(*contents))
  511. {
  512. if(*contents)
  513. {
  514. free(*contents);
  515. }
  516. #if defined CONSOLE || defined LINUX
  517. printf("分析服务器返回内容失败.返回内容为:\n%s\n",pszBuffer);
  518. #endif
  519. #ifdef _WIN32
  520. closesocket(sockfd);
  521. #else
  522. close(sockfd);
  523. #endif
  524. free(pszBuffer);
  525. if( -401 == re)
  526. return -1;//用户名/密码无效
  527. return -1;//unknown error
  528. }
  529. #ifdef _WIN32
  530. closesocket(sockfd);
  531. #else
  532. close(sockfd);
  533. #endif
  534. free(pszBuffer);
  535. #ifdef _WIN32
  536. WSACleanup();
  537. #endif
  538. return 0;
  539. }

Windows 和 Linux下使用socket下载网页页面内容(可设置接收/发送超时)的代码,布布扣,bubuko.com

时间: 2024-08-02 06:54:05

Windows 和 Linux下使用socket下载网页页面内容(可设置接收/发送超时)的代码的相关文章

socket在windows下和linux下的区别

windows到Linux代码移植遇到的问题 1.一些常用函数的移植 http://www.vckbase.com/document/viewdoc/?id=1586 2.网络 ------ 转载 & 修改(待整理) socket相关程序从windows移植到linux下需要注意的 1)头文件 windows下winsock.h/winsock2.h linux下sys/socket.h 错误处理:errno.h 2)初始化 windows下需要用WSAStartup linux下不需要 3)关

【大话QT之五】Windows与Linux下文件操作监控的实现

一.需求分析: 随着渲染业务的不断进行,数据传输渐渐成为影响业务时间最大的因素.究其原因就是因为数据传输耗费较长的时间.于是,依托于渲染业务的网盘开发逐渐成为迫切需要解决的需求.该网盘的实现和当前市场上网盘实现有一些的不同,主要在客户端与服务器端的操作需要双向进行,即:用户在客户端的操作需要及时同步到服务器端:在服务器端作业渲染生成的文件要及时同步到客户端.即:用户不在需要单独的下载数据,而是在作业运行的同时,渲染就过就会自动同步到客户端,大大缩短了等待时间.当然,无论是在客户端还是在服务端都面

learn python the hard way—Python在Windows与Linux下的安装

1.Windows下安装https://www.python.org/downloads/下载相应版本,进行安装注意:将python的安装路径添加到系统环境变量的PATH路径下,这样才能在命令行窗口下输入python进入python环境 2.Linux下安装a.下载源码包 https://www.python.org/downloads/release/python-2710/b.解压 .tgz形式     tar -zxvf 压缩包 .tar.bz形式 tar -zjvf 压缩包c.进入解压后

如何在windows下和linux下获取文件(如exe文件)的详细信息和属性

程序员都很懒,你懂的! 最近在项目开发中,由cs开发的exe的程序,需要自动升级,该exe程序放在linux下,自动升级时检测不到该exe程序的版本号信息,但是我们客户端的exe程序需要获取服务器上新程序的版本号信息.最后由我用java实现linux上exe文件的版本号读取功能.下面是详细代码: package com.herman.utils; import java.io.File; import java.io.FileNotFoundException; import java.io.I

怎样在Windows和Linux下写相同的代码

目前,Linux在国内受到了越来越多的业内人士和用户的青睐.相信在不久的将来,在国内为Linux开发 的应用软件将会有很大的增加(这不,金山正在招兵买马移植WPS呢).由于未来将会是Windows和Linux两强鼎立的格局,怎样能够使得开发的软件保持最大的可移植性就成了一个很重要的问题.小弟经过一段时间的摸索,找到了这个问题的圆满解答. 在Linux下,所有的开发工具和库都属于自由软件,可以免费获得并且功能强大.如果这些工具和库都有相应的Windows版,那么我们就能够在Windows和Linu

windows及linux下安装django simple captcha 遇到的各种问题及解决办法

转载自http://www.cnblogs.com/descusr/p/3225874.html 所有程序写完之后,验证码图片不显示,点击图片地址会提示如下错误,并且在linux下的纠正办法 用pil产生验证码出现:ImportError: The _imagingft C module is not installed 这个是由于PIL没有编译freetype导致的 查看 lib/python2.7/site-packages/PIL/ 看看 _imagingft.so 是否存在(至关重要,因

在windows和linux下分别部署Solr服务

一.在windows下部署Solr服务 1.windows部署solr前的准备: jdk1.7+tomcat-7+solr-4.10.4 1.1.安装JDK就不说了 1.2.安装tomcat 下载下来直接解压到指定目录,我直接解压到D盘下了. 1.3.安装solr(重点) 1.3.1.首先下载solr 下载地址:http://apache.fayea.com/lucene/solr/4.10.4/solr-4.10.4.zip 1.3.2.解压到指定的目录,这个目录自己指定. 1.3.3.进入目

Windows与Linux下文件操作监控的实现

一.需求分析: 随着渲染业务的不断进行,数据传输渐渐成为影响业务时间最大的因素.究其原因就是因为数据传输耗费较长的时间.于是,依托于渲染业务的网盘开发逐渐成为迫切需要解决的需求.该网盘的实现和当前市场上网盘实现有一些的不同,主要在客户端与服务器端的操作需要双向进行,即:用户在客户端的操作需要及时同步到服务器端:在服务器端作业渲染生成的文件要及时同步到客户端.即:用户不在需要单独的下载数据,而是在作业运行的同时,渲染就过就会自动同步到客户端,大大缩短了等待时间.当然,无论是在客户端还是在服务端都面

windows和linux下 Python2,Python3 的环境及安装

目录 windows和linux下 Python2,Python3 的环境及安装 window下安装 一. 手动安装 二. pip安装 linux下 安装 更新Python 笔者有话 windows和linux下 Python2,Python3 的环境及安装 window下安装 1.下载安装包 https://www.python.org/downloads/ 2.安装 默认安装路径:C:\python27 3.配置环境变量 [右键计算机]-->[属性]-->[高级系统设置]-->[高级