上传文件多个客户端访问服务器

// 服务端
package com.zhiyou100.demo022;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

// 上传
// 多次访问服务器
public class Demo02Serversocket {
    public static void main(String[] args) throws IOException {
        // 1. 创建服务器端
        ServerSocket server = new ServerSocket(6666);
        while (true) {
            // 2. 使用serverSocket对象中的方法accept  获取客户端 Socket对象
            Socket socket = server.accept();
            // 使用多线程技术,提高程序的效率
            // 有一个客户端上传文件,就开启一个线程,完成文件的上传
            new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName());
                    // 4. 判断文件夹是否存在
                    File file = new File("C:\\Users\\Administrator\\Desktop");
                    if (!file.exists()) {
                        file.mkdirs();
                    }
                    // 5. 创建一个字节输出流对象,构造方法中绑定输出的目的地
                    String filename = "\\" + Thread.currentThread().getName() + System.currentTimeMillis() + (int) (Math.random() * 100000000) + ".jpg";
                    try (
                            // 3. 通过socket对象获取网络字节输入流
                            InputStream is = socket.getInputStream();
                            FileOutputStream fos = new FileOutputStream(file + filename);
                    ) {
                        // 6. 通过网络字节输入流读取客户端发送的数据,再次通过本地的字节输出流写入文件中
                        int len = 0;
                        byte[] bytes = new byte[1024];
                        while ((len = is.read(bytes)) != -1) {
                            // 通过write方法写入磁盘中
                            fos.write(bytes, 0, len);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }finally {
                        try {
                            socket.close();
                            System.out.println("erewrewtew到调度");
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }

            }).start();

            // 服务端不关闭
            // serverSocket.close();
        }
    }
}
// 客户端
package com.zhiyou100.demo022;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;

public class Demo01TCPClient {
    public static void main(String[] args) throws IOException {
        // 1. 先创创建一个本地的字节输入流,绑定读取的数据源
        FileInputStream fis = new FileInputStream("day31_Net\\2.jpg");
        // 2. 创建一个网络字节输出流,让服务器可以发送数据
        // 2.1 构建一个Socket客户端对象
        Socket socket = new Socket("127.0.0.1", 6666);
        // 2.2 从socket对象中获取网络字节输出流
        OutputStream os = socket.getOutputStream();
        // 2.3 通过本地字节输入流读取数据,再通过网络字节输出流发送给服务器
        byte[] bytes = new byte[1024];
        int len = 0;
        while ((len = fis.read(bytes)) != -1) {
            // 调用write方法发送数据
            os.write(bytes, 0, len);
        }
        // 释放资源
        socket.close();

    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在文件传输系统中,对服务器同时应对多个客户端连接的情况下,可以使用多线程来实现。具体来说,可以为每个客户端连接创建一个独立的线程,这样可以避免一个客户端的操作影响到其它客户端的连接。在多线程设计中,需要考虑线程安全和资源竞争的问题,可以使用锁机制来保证线程安全,避免多个线程同时访问同一个资源导致的竞争问题。同时,还需要考虑线程的优先级和调度问题,以确保每个线程都能得到合理的执行时间和资源。 ### 回答2: 在文件传输系统中,服务器需要同时应对多个客户端的连接请求,为了更高效地处理这些连接,可以使用多线程来设计。 首先,服务器需要创建一个主线程,负责接收客户端的连接请求。当一个客户端连接成功后,主线程将其分配给一个工作线程进行处理。在主线程中,可以使用循环不断地接收连接请求,以便能够处理更多的客户端连接。 其次,在主线程中创建多个工作线程,每个线程负责处理一个客户端连接。当有新的客户端连接时,主线程将其分配给一个空闲的工作线程处理。如果所有的工作线程都处于忙碌状态,可以采用线程池的方式,即每个工作线程处理完一个连接后再接着处理下一个连接。 接下来,在工作线程中,可以使用多线程编程的技术来实现并发处理。可以为每个客户端连接创建一个独立的线程,由该线程负责与客户端进行通信和文件传输。通过多线程,可以同时进行多个文件的上传或下载操作,提高系统的处理能力和响应速度。 此外,为了确保线程安全,需要使用适当的同步机制,如互斥锁或信号量,来保护共享资源的访问。例如,在多个线程同时向服务器发送文件请求时,需要使用互斥锁来保护文件的读写操作,避免数据的混乱和不一致。 总结而言,对于文件传输系统中服务器同时应对多个客户端连接的情况,可以通过使用多线程的方式来设计。通过主线程接收连接请求并分配给工作线程处理,工作线程通过多线程技术实现并发处理,同时保证线程安全,可以提高系统的处理能力和响应速度。 ### 回答3: 在文件传输系统中,服务器需要同时应对多个客户端的连接请求,为了提高并发性能,可以使用多线程来设计。 首先,服务器可以创建一个主线程,用于监听客户端的连接请求。一旦有客户端发起连接,主线程接受连接,并为该客户端创建一个新的线程。这样,每个客户端连接对应一个独立的线程,可以并行进行文件传输操作,而不会相互影响。 为保证线程安全,可以使用线程同步和互斥机制。比如,可以使用互斥锁来控制对共享资源(如文件)的访问,确保每个线程互斥地进行文件读写操作,避免数据混乱。同时,可以使用线程间的通信机制,如条件变量或信号量,来实现线程间的协调与同步。 另外,应注意线程的管理和资源分配。根据系统负载和硬件资源情况,可以设置一个线程池来管理线程,避免线程频繁的创建和销毁,提高系统性能。此外,需要额外考虑系统资源的合理分配,如限制每个客户端的最大连接数,避免某个客户端占用过多的服务器资源影响其他客户端的连接效率。 最后,对于文件上传和下载的请求,可以使用线程池来处理,提高系统的吞吐量和并发性能。线程池可以预先创建一定数量的线程,并维护一个任务队列,在主线程中接收来自多个客户端的上传和下载请求,然后将请求任务按顺序放入任务队列中,线程池中的线程自动从任务队列中取出任务进行处理,避免线程频繁的创建和销毁,提高系统的响应速度。 综上所述,通过使用多线程技术,可以有效地实现文件传输系统中服务器同时应对多个客户端连接的需求,提高系统的并发性能和响应速度。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值