java文件服务器相关知识
-
Linux云计算-07_Linux文件服务器之vsftpd服务器本章向读者介绍企业vsftpd服务器实战、匿名用户访问、系统用户访问及虚拟用户实战等。 1 vsftpd服务器企业实战 文件传输协议(File Transfer Protocol,FTP),基于该协议FTP客户端与服务端可以实现共享文件、上传文件、下载文件。 FTP基于TCP协议生成一个虚拟的连接,主要用于控制FTP连接信息,同时再生成一个单独的TCP连接用于FTP数据传输。用户可以通过客户端向FTP服务器端上传、下载、删除文件,FTP服务器端可以同时提供给多人共享使用。 FTP服务是Client/Server(简称C/S)模式,基
-
PHP文件跨服务器上传PHP文件上传(从一台服务器上传到另一个服务器的存储里面) php > 7.0.0 功能描述: 在客户端上传了一个文件C到服务器A,但是因为系统部署把存储系统抽离单独部署在了服务器B上面(B上面的接口不对外暴露,客户端不能直接调用B服务器上的接口),这个时候需要把客户端上传的文件调用B服务器上的存储接口进行存储。 实现如下: $file = $_FILES;//$this->post('files', ''); //#一系列文件效验... $allowTypes = array('mp3', 'wma', 'm4a', 'flac','ape','wav'); //先把文件上
-
Mac系统安装FTP文件服务器 FTP服务器(File Transfer Protocol Server)是在互联网上提供文件存储和访问服务的计算机,它们依照FTP协议提供服务。 FTP是File Transfer Protocol(文件传输协议)。顾名思义,就是专门用来传输文件的协议。简单地说,支持FTP协议的服务器就是FTP服务器。一、Mac的型号(供参考)二、app store下载QuickFTP Server(晚上搜寻了半天,找到了这个)三、配置服务器Root path为服务器上的根目录,prot默认为21。四、上传测试文件五、在浏览器端访问*** 输入ftp://localhost 或者ftp://192.168.5.11 如下图注:另外一种连接ftp服务器的方法,使用mac自带的软件,如下图所示:OK搞定!
-
如何通过FTP工具将文件上传到服务器可以通过几种方式将文件上传到托管服务器。每个托管服务提供商都提供了一些带有文件管理器的托管控制面板工具,因此您可以使用它来上传文件。另一种方法是使用FTP管理器,如WinSCP,Filezilla,CuteFTP等。这些程序应另外下载并安装。但是有时它们比托管 文件管理器工具更易于使用。本教程将向您展示如何使用免费的ftp管理器WinSCP将文件上传到服务器。下载并安装WinSCP 软件后,将其打开。在标有蓝色的区域中,您应该输入托管 ftp服务器的详细信息:ftp地址或主机名用户名密码端口(通常为21,但可能会有所不同)然后单击快速连接按钮以访问您的服务器。您应该看到带有系统文件夹的服务器根目录。您的所有网站文件都应放置在特定的文件夹中,该文件夹对于每个托管服务提供商可能会有所不同。通常,可以将网站文件的文件夹称为:public_ html,web,www等。WinSCP的 窗口分为2列。左列(标有蓝色)显示计算机上的文件夹和文件。右列(标有绿色)显示托管服务器上的文件夹和文件要将文件从您的计算机上载到托
java文件服务器相关课程
java文件服务器相关教程
- 2. 部署java后台服务 Nginx 部署 Java Web 服务时,主要用到是 Nginx 的代理转发功能,对于不同类型的接口而言,可能会有不同的转发逻辑。如果是使用 spring cloud 这样的微服务框架,每个服务可能会部署多个会这分开部署在不同机器,在 Nginx 同样只需要使用 proxy_pass 指令将 http 请求转发到对应的上游服务上即可,同时负载均衡模块也在 java web 后台服务中用到的比较多。最后是在java web 的开发中,也常常会涉及到 websocket 协议,因此 Nginx 在部署 java web 服务时也会用到 websocket 代理转发。所以 Nginx 在部署 Java Web 服务时的基本配置大概如下:...http{ server { # 监听8080端口 listen 8080; # 指定域名,不指定也可以 server_name www.xxx.com; # 参数调优 client_max_body_size 20m; client_body_buffer_size 128k ... # 如果使用多个后台服务,可以配置负载均衡 ... # 访前端的 vue 页面 location / { ... } # vue 页面中向后台 java 服务发送请求 location /xxxx { proxy_pass http://xxxx:xx/xxx; } # 配置多种方向代理,不同类型接口有不同的转发方式 ... # 如果有,则配置websocket代理 location /xxxy { proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_pass http://xxxxx:xx/yyy; } } }...如果涉及的服务较多, Nginx 的配置往往会拆成多个文件进行编写,这样就用到了前面提到的 include 指令。
- 使用 Nginx 部署 Java web 服务 比较早之前,部署 Java web 服务只是单纯使用 Tomcat 做 Web 服务器,前后端代码融合在一个工程之中。Tomcat 启动后对外提供一个端口接收和相应 http请求。随着 Nginx 的越来越流行,同时加上其优秀的反响代理和负载均衡功能,我们在线上的 Java web 通常会结合二者,即使用 Nginx + Tomcat 的方式来部署 Java web 服务。最近两年,随着微服务化和前后端工程分离思想的流行,使用 Spring Boot 和 Vue 框架进行 Java web 开发的人的人越来越多。由于前后端分离后需要解决请求跨域的问题,往往会使用 Nginx 做一层反向代理,这样可以减少一些代码风险。所以,目前主流的 Java web开发模式是:基于 Vue 等优秀的前端框架完成页面开发;使用 Spring Boot 等 java web 框完成后端服务开发;前端工程打包后是一堆静态文件,可以直接由 Nginx 进行代理访问;后端服务启动后会占用端口等待请求,Nginx 将使用反向代理功能将前端发起的 http 请求转到对应的后台服务去处理。如果在多台机器上部署了相同的服务,还可以使用 Nginx 中的负载均衡功能,将请求均匀分发到上游的服务,实现系统的高可用性。
- 4.1 Zookeeper 服务启动 在我们执行启动命令 ./zkServer.sh start 时,会启动 Java 类 org.apache.zookeeper.server.quorum.QuorumPeerMain ,并执行该类里面的方法 main.initializeAndRun(args),这个方法就是 Zookeeper 服务的启动入口;在 Zookeeper 服务启动的过程中,会去解析 zoo.cfg 配置文件,包括数据文件目录,端口号等信息;读取完配置文件,Zookeeper 服务会创建 DatadirCleanupManager 类作为数据清除管理器,用于清理历史数据,保证 Zookeeper 服务不会因为存储空间影响其正常运行。
- 3.3 上传脚本文件到远程服务器 在本地计算机上,在 project 工具窗口中,选择文件,右键单击选择并选择 Deployment -> upload to 远程连接名,然后查看 Fi 检查文件传输对话框窗口,确保本地计算机中的文件上载到远程服务器。
- Web 服务器:APACHE TOMCAT Tomcat 是一个开源免费的 Web 服务器,它跟 Httpd 一样有处理静态 Html 的能力,除此之外它还是 Servlet 和 Jsp 的容器,通俗地说可以搭载 Java 的 Web 应用。
- 4. Java NIO 服务器端实现步骤 因为服务端采用非阻塞模式,需要用到Java NIO 的 Selector 组件,这是 Java NIO 的 I/O 多路复用机制,可以同时监听多个 SocketChannel 是否有读写事件。创建 Java NIO 的 Selector 实例selector = Selector.open();打开服务器 ServerSocketChannelserverChannel = ServerSocketChannel.open();给 ServerSocketChannel 绑定监听的 socket 地址,监听 any_addr serverChannel.socket().bind(new InetSocketAddress(PORT));设置 SO_REUSEADDR 选项,作为服务器,这是基本的要求 serverChannel.socket().setReuseAddress(true);设置非阻塞模式,这是服务器的基本要求,也是本小节的重点 serverChannel.configureBlocking(false);向 Selector 注册 accept 事件 serverChannel.register(selector, SelectionKey.OP_ACCEPT, serverChannel);编写事件循环。所有需要读写数据的 SocketChannel,需要将读写事件注册到 Selector。调用 Selector 的 select 方法,调用线程会进入 I/O 事件监听状态。如果没有事件发生,调用线程会被阻塞,进入事件等待状态;如果有事件发生,Selector 的 select 方法会返回发生了 I/O 事件的 SocketChannel 个数。Selector 的 selectedKeys 方法返回一个 java.util.Set 类,集合中包含的是 SelectionKey 结构,SelectionKey 和 SocketChannel 是一一对应的,表示发生了 I/O 事件的 SocketChannel。所以需要 遍历 Set,分别处理每个 SelectionKey。 while (true) { int readyChannels = selector.select(); if (readyChannels == 0) { System.out.println("No socket has i/o events"); continue; } Set<SelectionKey> selectedKeys = selector.selectedKeys(); Iterator<SelectionKey> keyIterator = selectedKeys.iterator(); while (keyIterator.hasNext()) { SelectionKey key = keyIterator.next(); if (key != null) { } keyIterator.remove(); } }抽象一个内部类 Client,表示一个客户端连接,每当一个新连接建立的时候,创建一个此类的对象。private static class Client{ public void sendData(); public int recvData(); public void close();}通过 key.isAcceptable() 处理连接接收事件。if (key.isAcceptable()) { // a connection was accepted by a ServerSocketChannel. ServerSocketChannel ssc = (ServerSocketChannel) key.attachment(); SocketChannel newSock = ssc.accept(); newSock.configureBlocking(false); Client client = new Client(selector, newSock);} 通过 key.isReadable() 处理读事件if (key.isReadable()) { // a channel is ready for reading Client client = (Client) key.attachment(); int rc = client.recvData(); if (rc == 0) { client.sendData(); }}通过 key.isReadable() 处理“写”事件if (key.isWritable()) { // a channel is ready for writing Client client = (Client) key.attachment(); client.cancelEvent(SelectionKey.OP_WRITE); client.sendData();}服务器端完整代码如下:import java.io.*;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.*;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Iterator;import java.util.Set;public class NonblockTCPServer { // 服务器监听的端口 private final static int PORT = 9082; private Selector selector = null; private ServerSocketChannel serverChannel = null; private static class Client{ // 接收 buffer 长度 private final static int RECV_BUF_LEN = 1024; // 接收buffer 声明 private ByteBuffer recvBuff = null; // 发送 buffer 长度 private static final int SEND_BUFF_LEN = 1024; // 发送 buffer 声明 private ByteBuffer sendBuff = null; // the Selector private Selector selector = null; // SocketChannel 引用声明,表示一个连接 private SocketChannel socketChannel = null; private SelectionKey sk_ = null; private boolean canSend = true; public Client(Selector selector, SocketChannel newSock){ this.selector = selector; this.socketChannel = newSock; this.recvBuff = ByteBuffer.allocate(RECV_BUF_LEN); this.sendBuff = ByteBuffer.allocate(SEND_BUFF_LEN); this.register(SelectionKey.OP_READ); } private void register(int op){ try { if (sk_ == null){ sk_ = this.socketChannel.register(selector, op, this); } else { sk_.interestOps(op | sk_.interestOps()); } } catch (ClosedChannelException e) { e.printStackTrace(); } } public void cancelEvent(int ops){ if (sk_ == null) return; sk_.interestOps(sk_.interestOps() & (~ops)); } public void sendData() { try { int totalSendBytes = 0; String resp = null; if (canSend){ //设置日期格式 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); resp = "The server time : " + df.format(new Date()); sendBuff.putInt(resp.length()); sendBuff.put(resp.getBytes()); totalSendBytes = resp.length() + 4; sendBuff.flip(); }else { totalSendBytes = sendBuff.remaining(); } int sbytes = this.socketChannel.write(sendBuff); System.out.println("Send to client about message :" + resp); if (sbytes < totalSendBytes) { this.register(SelectionKey.OP_WRITE); canSend = false; } else { if (!canSend){ canSend = true; } sendBuff.rewind(); } } catch (IOException e) { e.printStackTrace(); } } public int recvData(){ try { int recvBytes = this.socketChannel.read(this.recvBuff); if (recvBytes < 0){ System.out.println("Meet error or the end of stream"); close(); return -1; }else if (recvBytes == 0){ return 0;// eagain } this.recvBuff.flip(); while (this.recvBuff.remaining() > 0) { // Incomplete message header if (this.recvBuff.remaining() < 4) { break; } int bodyLen = this.recvBuff.getInt(); if (bodyLen > this.recvBuff.remaining()) { // Incomplete message body break; } byte[] body = new byte[bodyLen]; this.recvBuff.get(body, 0, bodyLen); System.out.println("Recv message from client: " + new String(body, 0, bodyLen)); } // flip recv buffer this.recvBuff.compact(); return 0; } catch (IOException e) { e.printStackTrace(); close(); } return -1; } public void close(){ try { cancelEvent(SelectionKey.OP_WRITE | SelectionKey.OP_READ); if (this.socketChannel != null){ this.socketChannel.close(); } } catch (IOException e) { e.printStackTrace(); } } } public void start(){ try { selector = Selector.open(); serverChannel = ServerSocketChannel.open(); // 绑定监听的 socket 地址,监听 any_addr serverChannel.socket().bind(new InetSocketAddress(PORT)); // 设置 SO_REUSEADDR 选项,作为服务器,这是基本的要求 serverChannel.socket().setReuseAddress(true); // 设置非阻塞模式,作为服务器,也是基本要求 serverChannel.configureBlocking(false); // 注册 accept 事件 serverChannel.register(selector, SelectionKey.OP_ACCEPT, serverChannel); } catch (IOException e) { e.printStackTrace(); stop(); } } public void process() { try { while (true) { int readyChannels = selector.select(); if (readyChannels == 0) { System.out.println("No socket has i/o events"); continue; } Set<SelectionKey> selectedKeys = selector.selectedKeys(); Iterator<SelectionKey> keyIterator = selectedKeys.iterator(); while (keyIterator.hasNext()) { SelectionKey key = keyIterator.next(); if (key != null) { if (key.isAcceptable()) { // a connection was accepted by a ServerSocketChannel. ServerSocketChannel ssc = (ServerSocketChannel) key.attachment(); SocketChannel newSock = ssc.accept(); newSock.configureBlocking(false); Client client = new Client(selector, newSock); } else if (key.isConnectable()) { // a connection was established with a remote server. } else if (key.isReadable()) { // a channel is ready for reading Client client = (Client) key.attachment(); int rc = client.recvData(); if (rc == 0) { client.sendData(); } } else if (key.isWritable()) { // a channel is ready for writing Client client = (Client) key.attachment(); client.cancelEvent(SelectionKey.OP_WRITE); client.sendData(); } } keyIterator.remove(); } } } catch (IOException e) { e.printStackTrace(); } } public void stop(){ try { if (serverChannel != null){ serverChannel.close(); serverChannel = null; } if (selector != null) { selector.close(); selector = null; } } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { NonblockTCPServer tcp = new NonblockTCPServer(); tcp.start(); tcp.process(); }}对于非阻塞式 Socket,需要处理发送 Buffer 满和接收 Buffer 为空的情况。服务器样例代码的 320 ~ 390 行的主要逻辑就是在处理非阻塞模式下,发送 Buffer 满和接收 Buffer 为空的逻辑。
java文件服务器相关搜索
-
j2ee
j2ee是什么
jar格式
java
java api
java applet
java c
java jdk
java list
java map
java script
java se
java socket
java swing
java switch
java web
java xml
java 程序设计
java 多线程
java 环境变量