首页 文章 精选 留言 我的

精选列表

搜索[网络编程],共10007篇文章
优秀的个人博客,低调大师

Android 网络编程--URL互联网资源

1.加入权限 <uses-permission android:name="android.permission.INTERNET"/> 2.Layout设计 1 2 3 4 5 6 7 8 9 10 11 <RelativeLayout xmlns:android= "http://schemas.android.com/apk/res/android" xmlns:tools= "http://schemas.android.com/tools" android:layout_width= "match_parent" android:layout_height= "match_parent" > <ImageView android:id= "@+id/imageView" android:layout_width= "wrap_content" android:layout_height= "wrap_content" /> </RelativeLayout> 3.Code设计 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 public class MainActivity extends Activity { private Bitmap bitmap; private ImageView show; private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { if (msg.what == 1 ) { show.setImageBitmap(bitmap); } } }; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); show = (ImageView) this .findViewById(R.id.imageView); new Thread() { @Override public void run() { super .run(); try { URL url = new URL( "http://a.hiphotos.baidu.com/image/h%3D220/sign=bd9eb2ea07087bf462ec50ebc2d2575e/d439b6003af33a87495b8dbbc35c10385343b559.jpg" ); InputStream inputStream = url.openStream(); bitmap = BitmapFactory.decodeStream(inputStream); handler.sendEmptyMessage( 1 ); inputStream.close(); } catch (Exception e) { e.printStackTrace(); } }; }.start(); } } 本文转自Work Hard Work Smart博客园博客,原文链接:http://www.cnblogs.com/linlf03/p/5124975.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Python网络编程(进程池、进程间的通信)

线程池的原理: 线程池是预先创建线程的一种技术。线程池在还没有任务到来之前, 创建一定数量的线程,放入空闲队列中。这些线程都是处于睡眠状态, 即均为启动,不消耗CPU,而只是占用较小的内存空间。当请求到来之后, 缓冲池给这次请求分配一个空闲线程,把请求传入此线程中运行,进行处理。 当预先创建的线程都处于运行状态,即预制线程不够,线程池可以自由创建一定数量的新线程, 用于处理更多的请求。当系统比较闲的时候,也可以通过移除一部分一直处于停用状态的线程。 进程间的通信原理: OS提供了沟通的媒介供进程之间“对话”用。既然要沟通,如同人类社会的沟通一样, 沟通要付出时间和金钱,计算机中也一样,必然有沟通需要付出的成本。 出于所解决问题的特性,OS提供了多种沟通的方式,每种方式的沟通成本也不尽相同, 使用成本和沟通效率也有所不同。我们经常听到的 管道、消息队列、共享内存都是OS提供的供进程之间对话的方式。 Process(target, name, args, kwargs) name: 给 进程取 名字 默认为 Process-1,Process-2..... p.name 查看进程名 args: 以 元组的形式 给target函数传参 kwargs: 以 字典的形式 给对应键的值传参 进程对象的其他 常用属性方法: p.name p.start() p.join() p.pid: 获取创建进程的 pid号 p.is_alive(): 判断进程是处于alive状态 p.daemon: 默认为Flase 如果 设置为True 主进程结束时 杀死所有子进程 daemon属性 一定要在start()前设置 设置daemon 为True 一般 不需要加join() daemon不是真正意义上的守护进程 守护进程: 不受终端控制 后台自动运行 生命周期长 多进程copy一个文件拆分为两个进行保存 import os from multiprocessing import Process from time import sleep #获取文件的大小 size = os.path.getsize("./timg.jpeg") # 获取文件的字节数 # f = open("timg.jpeg",'rb') #复制前半部分 def copy1(img): f = open(img,'rb') # 二进制读取要复制的文件 n = size // 2 fw = open('1.jpeg','wb') # 二进制创建文件 while True: if n < 1024: # 判断文件大小是否大于1024字节 如果小于则直接读取写入 data = f.read(n) fw.write(data) break data = f.read(1024) # 否则每次循环读取1024字节并写入 fw.write(data) n -= 1024 f.close() fw.close() #复制后半部分 def copy2(img): f = open(img,'rb') # 读取文件必须要每次读取 如果在父进程中打开文件流对像 # 子进程会通同时调用一个文件流对像 由于文件流对象特性会记录游标 # 如若先执行后半部复制这前半部会导致读取不到数据 fw = open('2.jpeg','wb') f.seek(size // 2,0) while True: data = f.read(1024) if not data: break fw.write(data) fw.close() f.close() p1 = Process(target = copy1,args = ('timg.jpeg',)) # 创建子进程并让子进程分别同时复制 p2 = Process(target = copy2,args = ('timg.jpeg',)) p1.start() p2.start() p1.join() p2.join() os.path.getsize('./1.txt'): 读取文件大小 注: 1.如果 多个子进程拷贝同一个 父进程的对象则多个 子进程 使用的是同一个对象(如文件队形,套接字,队列,管道。。。) 2.如果在 创建子进程后单独创建的对象,则多个 子进程各不相同 创建子自定义进程类 1.编写类 继承Process 2.在自定义类中 加载父类__init__以获取父类属性, 同时可以 自定义新的属性 3 .重写run方法 在调用start时自动执行该方法 示例: from multiprocessing import Process import time class ClockProcess(Process): def __init__(self,value): #调用父类init super().__init__() self.value = value #重写run方法 def run(self): for i in range(5): time.sleep(self.value) print("The time is {}".format(time.ctime())) p = ClockProcess(2) #自动执行run p.start() p.join() 进程的缺点: 进程在 创建和销毁的过程中 消耗的 资源相对 较多 进程池技术: 产生原因: 如果有大量的任务需要多进程完成,而调用周期比较短且需要频繁创建 此时可能产生大量进程频繁创建销毁的情况 消耗计算机资源较大 使用方法: 1. 创建进程池, 在池内放入适当数量的进程 2. 将事件封装成函数。 放入到 进程池 3.事件不断运行, 直到所有放入进程池事件运行完成 4. 关闭进程池, 回收进程 from multiprocessing import pool pool(Process) 功能: 创建进程池对象 参数:进程数量 返回值:进程池对象 pool = pool() pool.apply_async(fun, args, kwds)(异步执行) 功能: 将事件放入进程池内 参数: fun:要执行的 函数 args:以 元组形式为fun 传参 kwds:以 字典形式为fun 传参 返回值: 返回一个事件对象,通过p. get()函数可以获取fun的返回值 pool.close(): 功能: 关闭进程池,无法再加入新的事件,并等待已有事件结束执行 pool.join() 功能: 回收进程池 pool.apply(fun, args, kwds)(同步执行) 功能:将事件放入进程池内 参数: fun:要执行的函数 args:以元组形式为fun传参 kwds:以字典形式为fun传参 没有返回值 示例: from multiprocessing import Pool from time import sleep,ctime def worker(msg): sleep(2) print(msg) return ctime() #创建进程池对象 pool = Pool(processes = 4) result = [] for i in range(10): msg = "hello %d"%i #将事件放入进程池 r = pool.apply_async(func = worker,args = (msg,)) result.append(r) #同步执行 # pool.apply(func = worker,args = (msg,)) #关闭进程池 pool.close() #回收 pool.join() #获取事件函数返回值 for i in result: print(i.get()) pool.map(func, iter) 功能: 将要执行的 事件放入进程池 参数: func 要执行的 函数 iter 可迭代对象 示例: from multiprocessing import Pool import time def fun(n): time.sleep(1) print("执行 pool map事件",n) return n ** 2 pool = Pool(4) #在进程池放入6个事件 r = pool.map(fun,range(6)) # map高阶函数 fun和iter执行6次 print("返回值列表:",r) pool.close() pool.join() 进程间的通信(IPC) 由于进程 空间独立, 资源无法共享, 此时在 进程间通讯就 需要专门的通讯方法 通信方法: 管道、消息队列、共享内存 信号、信号量、套接字 管道通信: 在内存中 开辟一块内存空间, 形成管道结构 多个进程使用同一个管道,即可通过 对管道的 读写操作进行通讯 multiprocessing --> Pipe fd1,fd2 = Pipe(duplex=True) 功能: 创建管道 参数: 默认表示 双向管道 如果设置为 False则为 单向管道 返回值: 俩个管道对象的,分别表示管道的两端 如果是 双向管道则均可读写 如果是 单向管道则 fd1只读, fd2只写 fd.recv() 功能:从管道 读取信息 返回值:读取到的内容 当 管道为空则阻塞 fd.send(data) 功能: 向管道写入内容 参数:要写入的内容 当 管道满时会阻塞 可以 写入几乎所有 Python所有数据类型 队列通信: 在 内存中 开辟队列结构空间,多个进程可见, 多个进程操作同一个队列对象可以 实现消息存取工作 在取出时 必须按照存入 顺序取出( 先进先出) q = Queue(maxsize=0) 功能: 创建队列对象 参数: maxsize 默认表示根据系统分配空间 储存消息 如果 传入一个正整数则 表示最多 存放多少条消息 返回值:队列对象 q.put(data,[block,timeout]) 功能:向队列 存入消息 参数: data:存入消息( 支持Python数据类型) block:默认 True表示当队 满时阻塞 设置为 False 则为 非阻塞 timeout:当 block为True是表示 超时检测 data = q.get([block,timeout]) 功能:取出消息 参数: block:设置为 True 当队列为 空时阻塞 设置为 False表示 非阻塞 timeout: 当 block为True是表示 超时检测 q.full() 判断队列是否为满 q.empty() 判断队列 是否为空 q.qsize() 获取队列中 消息的数量 q.close() 关闭队列 共享内存通信: 在 内存中开辟一段空间存储数据对多个进程可见, 每次写入共享内存中的内容 都会覆盖之前内容 对内存的 读操作不会改变内存中的内容 form multiprocessing import Value,Array shm = Value(ctype,obj) 功能: 共享内存共享 空间 参数: ctype:字符串 要转换的c语言的数据类型 obj:共享内存的 初始数据 返回值:返回共享内存对象 shm.value: 表示共享内存 的值 示例: from multiprocessing import Process,Value import time import random #创建共享内存 money = Value('i',6000) #存钱 def deposite(): for i in range(100): time.sleep(0.05) #对value的修改就是对共享内存的修改 money.value += random.randint(1,200) #花销 def withdraw(): for i in range(100): time.sleep(0.04) #对value的修改就是对共享内存的修改 money.value -= random.randint(1,200) d = Process(target = deposite) w = Process(target = withdraw) d.start() w.start() d.join() w.join() print(money.value) shm = Array(ctype,obj) 功能: 开辟共享内存 空间 参数: ctype:要转换的数据类型 obj: 要存入共享内容的的数据( 结构化数据) 列表、字符串 表示要存入得内容 要求 数据结构内的 类型相同 整数 表示要 开辟几个单元的空间 返回值: 返回共享内存对象 可迭代对象 示例: from multiprocessing import Process,Array import time #创建共享内存 shm = Array('c',b"hello") #字符类型要求是bytes #开辟5个整形单元的共享内存空间 # shm = Array('i',5) def fun(): for i in shm: print(i) shm[0] = b"H" p = Process(target = fun) p.start() p.join() print(shm.value) #从首地址打印字符串 # for i in shm: # print(i) 三种进程间通信区别: 管道通信: 消息队列: 共享内存: 开辟空间: 内存 内存 内存 读写方式: 两端读写 先进先出 每次覆盖上次内容 单向/双向 效率: 一般 一般 较快 应用: 多用于父子进程 应用灵活广泛 复杂,需要同步互斥

优秀的个人博客,低调大师

Android Day05-网络编程之文件上传

Android文件上传实现 分析:利用抓包工具查看文件上传发现,文件上传的请求体十分的复杂,根本难以用 HttpURLConnection、HttpClient来实现。但是用AsyncHttpClient就能很轻易的实现了,只要 在RequestParams对象里面添加一对键值对,值存储文件的路径即可上传了。 AsyncHttpClient文件上传源代码: 记得先要导一下包 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 //创建AsyncHttpClient对象 AsyncHttpClientasyncHttpClient= new AsyncHttpClient(); //创建RequestParams对象,封装要上传的数据或文件。 RequestParamsparams= new RequestParams(); params.put( "music" ,uploadFile); //UploadaFile //执行post方法。 //注意最后一个类new的是参数子类的的实现类AsyncHttpResponseHandler asyncHttpClient.post(getApplicationContext(),servletPath, params, new AsyncHttpResponseHandler(){ @Override public void onSuccess( int statusCode,Header[]headers, byte []responseBody) { if (statusCode== 200 ) { Toast.makeText(getApplicationContext(), "文件上传成功" , 0 ).show(); } else { Toast.makeText(getApplicationContext(), "服务器忙" , 0 ).show(); } } @Override public void onFailure( int statusCode,Header[]headers, byte []responseBody,Throwableerror) { } }); 本文转自屠夫章哥 51CTO博客,原文链接:http://blog.51cto.com/4259297/1676570,如需转载请自行联系原作者

优秀的个人博客,低调大师

iOS:网络编程解析协议一:HTTP超文本传输协议

HTTP传输数据有四种方式:Get方式、Post方式、同步请求方式、异步请求方式。具体的介绍,前面已经有过系统的讲解,这次主要进行具体的举。 说明:同步和异步请求方式在创建链接对象和创建请求对象时,用Get方式或Post方式中的任意一种即可;那么,同步/异步请求方式和Get/Post方式不同的地方是什么呢?区别在于进行连接处理这一步上,Get/Post方式它们均使用相同代理NSURLConnectionDataDelegate的方法传输数据,而同步/异步请求方式则不需要使用代理。 前提:需要先在本机上搭建一个本地服务器,然后配合一个数据库创建一个数据库表,存放用户登录名和登陆密码,并且可以成功登陆即可。这个配置搭建我就不做解释了,可以自己查资料,以下是我搭建的本机服务器截图,可以登陆成功。 然后布局故事板,添加登陆文本框和按钮(并将它们IBOutlet到控制器类中)截图如下: 具体的代码如下: 导入头文件并设置相关属性 1 @interface ViewController ()<NSURLConnectionDataDelegate> 2 @property (weak, nonatomic) IBOutlet UITextField *userNameTextField; 3 @property (weak, nonatomic) IBOutlet UITextField *passwordTextField; 4 @property (strong,nonatomic)NSMutableData *allDatas; 初始化: 1 //给allDatas设置一个懒加载的方法 2 -(NSMutableData*)allDatas 3 { 4 if(!_allDatas) 5 { 6 _allDatas = [NSMutableData data]; 7 } 8 return _allDatas; 9 } 按钮事件: 1 - (IBAction)loginButtonClicked:(UIButton *)sender 2 3 { 4 5 [self loginByGet]; //Get方式 6 7 [self loginByPost]; //Post方式 8 9 [self loginBySynchronous]; //同步请求方式 10 11 [self loginByAsynchronous];//异步请求方式 12 13 } 第1种方式:登陆服务器成功后,用Get方式解析服务器发送回来的数据,需要实现<NSURLConnectionDataDelegate>协议来解析 1 #pragma mark -用Get方法登陆 2 -(void)loginByGet 3 { 4 //1.创建NSURL对象,设置链接的地址 5 NSString *strURL = [NSString stringWithFormat:@"http://127.0.0.1/userManager/login.php?username=%@&password=%@",self.userNameTextField.text,self.passwordTextField.text]; 6 NSURL *url = [NSURL URLWithString:strURL]; 7 8 //2.创建NSURLRequest请求对象 9 NSURLRequest *request = [NSURLRequest requestWithURL:url]; 10 11 //3.创建NSURLConnection连接对象 12 NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self]; 13 14 //4.向服务器发送请求 15 [connection start]; 16 } 第2种方式:登陆服务器成功后,用Post方式解析服务器发送回来的数据,需要实现<NSURLConnectionDataDelegate>协议来解析 1 #pragma mark -用Post方式登陆 2 -(void)loginByPost 3 { 4 //1.创建NSURL对象,设置链接的地址 5 NSString *strURL = @"http://127.0.0.1/userManager/login.php"; 6 NSURL *url = [NSURL URLWithString:strURL]; 7 8 //2.创建NSURLRequest请求对象 9 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 10 [request setTimeoutInterval:5.0];//设置超时时间 11 [request setHTTPMethod:@"post"]; 12 13 //设置post带的数据 14 NSString *strBody = [NSString stringWithFormat:@"submit=1&username=%@&password=%@",self.userNameTextField.text,self.passwordTextField.text]; 15 NSData *datatBody = [strBody dataUsingEncoding:NSUTF8StringEncoding]; 16 [request setHTTPBody:datatBody]; 17 18 //3.创建NSURLConnection连接对象 19 NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self]; 20 21 //4.向服务器发送请求 22 [connection start]; 23 24 } 不论是Get方式,还是Post方式,都用到的一模一样的数据解析协议代理<NSURLConnectionDataDelegate>如下: 1 #pragma mark -<NSURLConnectionDataDelagate> 2 //收到服务器的数据,因为数据会分数据包,可能会调用多次 3 -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 4 { 5 //将分包组合在一起 6 [self.allDatas appendData:data]; 7 } 8 9 //链接出错时的处理 10 -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 11 { 12 NSLog(@"链接出错:%@",error); 13 } 14 15 //数据传输完成,做最后的处理 16 -(void)connectionDidFinishLoading:(NSURLConnection *)connection 17 { 18 unsigned long enconding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000); 19 20 NSString *strResponse = [[NSString alloc]initWithData:self.allDatas encoding:enconding]; 21 22 NSLog(@"%@",strResponse); 23 24 25 //清理数据 26 NSData *data = [@"" dataUsingEncoding:NSUTF8StringEncoding]; 27 [self.allDatas setData:data]; 28 } 29 30 //post传输数据时返回数据传输的进度 31 -(void)connection:(NSURLConnection *)connection didSendBodyData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite 32 { 33 NSLog(@"bytes:%ld,totalBytes:%ld,totalBytesExpected:%ld",bytesWritten,totalBytesWritten,totalBytesExpectedToWrite); 34 } 它们俩的运行结果都是: 2015-09-24 12:58:45.053 01-NSURLConnection[1608:80089] admin123456<br /> <b>Notice</b>: Undefined index: userid in <b>/Applications/XAMPP/xamppfiles/htdocs/userManager/login.php</b> on line <b>30</b><br /> admin 欢迎你!进入 <a href="my.php">用户中心</a><br />点击此处 <a href="login.php?action=logout">注销</a> 登录!<br /> 第3种方式:登陆服务器成功后,用同步请求方式解析服务器发送回来的数据 1 #pragma mark -同步请求(创建URL对象和请求对象时,Get和Post的方法都可以使用) 2 -(void)loginBySynchronous 3 { 4 //1.创建NSURL对象,设置链接的地址 5 NSString *strURL = [NSString stringWithFormat:@"http://127.0.0.1/userManager/login.php?username=%@&password=%@",self.userNameTextField.text,self.passwordTextField.text]; 6 NSURL *url = [NSURL URLWithString:strURL]; 7 8 //2.创建NSURLRequest请求对象 9 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 10 [request setTimeoutInterval:1.0]; 11 12 //3.使用同步请求 13 NSError *error = nil; 14 NSURLResponse *response = nil; 15 NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 16 if(error) 17 { 18 NSLog(@"数据传输错误:%@",error); 19 } 20 else 21 { 22 unsigned long encoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000); 23 24 NSString *str = [[NSString alloc]initWithData:data encoding:encoding]; 25 NSLog(@"%@",str); 26 } 27 } 运行结果: 2015-09-24 13:11:15.010 01-NSURLConnection[1630:83994] admin123456<br /> <b>Notice</b>: Undefined index: userid in <b>/Applications/XAMPP/xamppfiles/htdocs/userManager/login.php</b> on line <b>30</b><br /> admin 欢迎你!进入 <a href="my.php">用户中心</a><br />点击此处 <a href="login.php?action=logout">注销</a> 登录!<br /> 第4种方式:登陆服务器成功后,用异步请求方式解析服务器发送回来的数据 1 #pragma mark -异步请求(创建URL对象和请求对象时,Get和Post的方法都可以使用) 2 -(void)loginByAsynchronous 3 { 4 //1.创建NSURL对象,设置链接的地址 5 NSString *strURL = @"http://127.0.0.1/userManager/login.php"; 6 NSURL *url = [NSURL URLWithString:strURL]; 7 8 9 //2.创建NSURLRequest请求对象 10 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 11 [request setHTTPMethod:@"post"]; 12 NSString *strBody = [NSString stringWithFormat:@"submit=1&username=%@&password=%@",self.userNameTextField.text,self.passwordTextField.text]; 13 NSData *dataBody = [strBody dataUsingEncoding:NSUTF8StringEncoding]; 14 [request setHTTPBody:dataBody]; 15 16 17 //3.异步请求 18 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { 19 if(connectionError) 20 { 21 NSLog(@"数据获取失败:%@",connectionError); 22 } 23 else 24 { 25 unsigned long encoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000); 26 NSString *str = [[NSString alloc]initWithData:data encoding:encoding]; 27 NSLog(@"async:%@",str); 28 } 29 }]; 30 } 运行结果: 2015-09-24 13:13:32.407 01-NSURLConnection[1653:85054] async:admin123456<br /> <b>Notice</b>: Undefined index: userid in <b>/Applications/XAMPP/xamppfiles/htdocs/userManager/login.php</b> on line <b>30</b><br /> admin 欢迎你!进入 <a href="my.php">用户中心</a><br />点击此处 <a href="login.php?action=logout">注销</a> 登录!<br /> 程序猿神奇的手,每时每刻,这双手都在改变着世界的交互方式! 本文转自当天真遇到现实博客园博客,原文链接:http://www.cnblogs.com/XYQ-208910/p/4835014.html,如需转载请自行联系原作者

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册