Socket网络编程练习题四:客户端上传文件(多线程版)

news/2024/5/17 16:16:46 标签: 网络, TCP, io, 网络编程, socket, 多线程, 客户端

题目

想要服务器不停止,能接收很多客户上传的图片?

解决方案

可以使用循环或者多线程
但是循环不合理,最优解法是(循环+多线程)改写

代码实战

客户端代码
package comion">.heimaion">;

import javaion">.ioion">.*ion">;
import javaion">.netion">.Socketion">;

public class Client ion">{
    public static void ion">mainion">(Stringion">[ion">] argsion">) throws IOException ion">{
        Socket socket = new Socketion">("127.0.0.1"ion">,10000ion">)ion">;

        //读取本地文件中的数据,并写到服务器中
        BufferedInputStream bis = new BufferedInputStreamion">(new FileInputStreamion">("G:\\wjkwk\\clientdir\\123.jpg"ion">)ion">)ion">;
        BufferedOutputStream bos = new BufferedOutputStreamion">(socketion">.ion">getOutputStreamion">(ion">)ion">)ion">;
        byteion">[ion">] bytes = new byteion">[1024ion">]ion">;
        int lenion">;
        while ion">(ion">(len = bision">.ion">readion">(bytesion">)ion">) != -1ion">)ion">{
            bosion">.ion">writeion">(bytesion">,0ion">,lenion">)ion">;
        ion">}

        //往服务器写结束标记
        socketion">.ion">shutdownOutpution">(ion">)ion">;

        //接收服务器返回的数据
        BufferedReader br = new BufferedReaderion">(new InputStreamReaderion">(socketion">.ion">getInputStreamion">(ion">)ion">)ion">)ion">;
        String line = brion">.ion">readLineion">(ion">)ion">;
        Systemion">.oution">.ion">printlnion">(lineion">)ion">;
        socketion">.ion">closeion">(ion">)ion">;
    ion">}
ion">}

服务端代码
package comion">.heimaion">;

import javaion">.ioion">.*ion">;
import javaion">.netion">.ServerSocketion">;
import javaion">.netion">.Socketion">;

public class Server ion">{

    public static void ion">mainion">(Stringion">[ion">] argsion">) throws IOException ion">{

        ServerSocket serverSocket = new ServerSocketion">(10000ion">)ion">;

        while ion">(trueion">)ion">{
            //等待客户端来连接
            Socket socket = serverSocketion">.ion">acception">(ion">)ion">;
            //开启一个线程
            //一个用户就对应服务端的一条线程
            new Threadion">(new MyRunnableion">(socketion">)ion">)ion">.ion">startion">(ion">)ion">;
        ion">}
    ion">}
ion">}

package comion">.heimaion">;

import javaion">.ioion">.*ion">;
import javaion">.netion">.Socketion">;
import javaion">.utilion">.UUIDion">;

public class MyRunnable implements Runnable ion">{

    Socket socketion">;
    public MyRunnableion">(Socket socketion">)ion">{
        thision">.socket = socketion">;
    ion">}
    ion punctuation">@Override
    public void ion">runion">(ion">) ion">{

        try ion">{
            //读取客户端上传的文件并保存到本地
            BufferedInputStream bis = new BufferedInputStreamion">(socketion">.ion">getInputStreamion">(ion">)ion">)ion">;
            String name = UUIDion">.ion">randomUUIDion">(ion">)ion">.ion">toStringion">(ion">)ion">.ion">replaceion">("-"ion">, ""ion">)ion">;
            BufferedOutputStream bos = new BufferedOutputStreamion">(new FileOutputStreamion">("G:\\wjkwk\\serverdir\\"+name+".jpg"ion">)ion">)ion">;
            int lenion">;
            byteion">[ion">] bytes = new byteion">[1024ion">]ion">;
            while ion">(ion">(len = bision">.ion">readion">(bytesion">)ion">) != -1ion">)ion">{
                bosion">.ion">writeion">(bytesion">,0ion">,lenion">)ion">;
            ion">}
            //回写数据
            BufferedWriter bw = new BufferedWriterion">(new OutputStreamWriterion">(socketion">.ion">getOutputStreamion">(ion">)ion">)ion">)ion">;
            bwion">.ion">writeion">("上传成功"ion">)ion">;
            bwion">.ion">newLineion">(ion">)ion">;
            bwion">.ion">flushion">(ion">)ion">;

        ion">} catch ion">(IOException eion">) ion">{
            eion">.ion">printStackTraceion">(ion">)ion">;
        ion">} finally ion">{
            //释放资源
            try ion">{
                socketion">.ion">closeion">(ion">)ion">;
            ion">} catch ion">(IOException eion">) ion">{
                eion">.ion">printStackTraceion">(ion">)ion">;
            ion">}
        ion">}
    ion">}
ion">}

运行结果

在这里插入图片描述

ionBox" style="width:400px;margin:auto;margin-top:12px" class="blog-extension-box">

http://www.niftyadmin.cn/n/5058821.html

相关文章

最新AI创作系统源码ChatGPT源码+附详细搭建部署教程+AI绘画系统+支持国内AI提问模型

一、AI系统介绍 SparkAi创作系统是基于国外很火的ChatGPT进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT?小编这里写一个详细图文教程吧&am…

腾讯汤道生:大模型只是起点,产业落地是AI更大的应用场景

6月21日,北大光华管理学院联合腾讯,宣布升级“数字中国筑塔计划”,共同推出“企业管理者人工智能通识课”系列课程,助力企业创始人和管理者拥抱AI。在第一课上,腾讯集团高级执行副总裁、云与智慧产业事业群CEO汤道生&a…

凹凸贴图如何提高物体的真实感

什么是凹凸贴图 凹凸贴图(Bump Mapping)是一种计算机图形学中的技术,用于在表面上模拟微小的凹凸形状,从而增加了物体的细节和真实感。它可以在不改变物体几何形状的情况下,通过修改光照的反应,使表面看起来…

Spring Security 简单token配置

Spring Security 简单token配置 说明&#xff1a;非表单配置 先上码&#xff1a; https://gitee.com/qkzztx_admin/security-demo/tree/master/demo-two 环境&#xff1a;win10 idea2023 springboot2.7.6 maven3.8.6 代码清单说明 依赖&#xff1a; <dependency><…

HTML之如何下载网页中的音频(二)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

系统集成|第二十章(笔记)

目录 第二十章 收尾管理20.1 项目验收20.2 项目总结20.3 系统维护20.4 项目后评价20.5 扩展 上篇&#xff1a;第十九章、风险管理 下篇&#xff1a;第二十一章、知识产权与法律法规 第二十章 收尾管理 项目收尾管理是系统集成项目管理中一个特殊的阶段&#xff0c;容易收到多方…

【Linux学习】05-1Linux上安装部署各类软件

Linux&#xff08;B站黑马&#xff09;学习笔记 01Linux初识与安装 02Linux基础命令 03Linux用户和权限 04Linux实用操作 05-1Linux上安装部署各类软件 文章目录 Linux&#xff08;B站黑马&#xff09;学习笔记前言05-1Linux上安装部署各类软件JDK安装部署Tomcat安装部署maven…

jupyter notebook可以打开,但无法打开.ipynb文件,报错500 : Internal Server Error

1、错误信息 2、解决办法 打开Anaconda Promt界面&#xff0c;进入自己的虚拟环境。在命令行输入以下指令&#xff1a; pip install --upgrade nbconvert