此文章记录了TCP通信程序的案例——将图片上传服务器,然后从服务器下载到本地

使用Air724UG模块拍摄照片并上传至云服务器 文章目录前言基础知识编写 TCP 客户端代码编写 TCP 服务端代码 前言 最近在做物联网的项目,有一个需求是要每隔一段时间要拍摄一张现场的图片并上传至云服务器保存。在查阅了很多资料后,发现这方面的资料是真的匮乏。同时,tb 上的摄像头产品也太高度集成了,很难进行二次开发。一次机缘巧合下,在逛 tb 的时候偶然发现一款产品,就是如下图所示 Air724UG 模块,自带 4G 通信模块和摄像头接口,而且成本也比较便宜,带通信卡和摄像头总价格不超过 80,简直就是完美符合我需求的天选产品。同时该系列产品的官方网 阅读详情

需求:

1.客户端:将本地文件上传到服务器。接收服务器的反馈。   服务器:接收客户端上传的文件,上传完毕之后给出反馈,解决文件重复同名问题。

2.想要服务器不停止,自能接收很多用户上传的图片。提示:可以用循环或者多线程。但是循环不合理,最优解法是(循环+多线程)改写。

3.频繁创建线程并销毁非常浪费系统资源,所以需要用线程池优化

注意点:

最关键的是循环读入数据后,写出数据时,需要重复刷新,将数据刷新到通道/文件中,否则容易丢失数据,图片无法查看,或者缺失一部分

 

代码:

客户端——Client
package com.itheima.a11test6;

import java.io.*;
import java.net.Socket;

public class Client {
    public static void main(String[] args) throws IOException {
        //需求:
        /*客户端:将本地文件上传到服务器。接收服务器的反馈。
        服务器:接收客户端上传的文件,上传完毕之后给出反馈,
        解决文件重复同名问题*/
        //新加需求:
        /*想要服务器不停止,自能接收很多用户上传的图片。
        该怎么做呢?
        提示:可以用循环或者多线程。但是循环不合理,最优解法是(循环+多线程)改写*/
        //再次新加需求
        /*频繁创建线程并销毁非常浪费系统资源,所以需要用线程池优化*/

        //发送数据
        //1.创建Socket对象
        Socket socket = new Socket("127.0.0.1",10000);

        //2.从本地读取文件
        //2.1创建缓冲流读取文件
        FileInputStream fis = new FileInputStream("mysocketnet\\clientdir\\girl.png");
        BufferedInputStream bis = new BufferedInputStream(fis);
        //2.2创建缓冲流将得到的字节流写出到服务器
        BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
        byte[] bytes = new byte[1024];
        int len;
        while((len = bis.read(bytes)) != -1){
            //此时,每个bytes代表每组1024的数据
            //将数组中的写出
            bos.write(bytes,0,len);
            //重点,写出数据,需要文件刷新,将缓存区中的数据都到通道内。否则会丢失一部分
            //不能关闭 bos,关闭会连带socket通道一起关闭,后面都无法运行
            bos.flush();
        }

        //3.继续写出一个结束标记
        socket.shutdownOutput();

        //4.接收回返的数据
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String line = br.readLine();
        System.out.println(line);
        //结束资源
        socket.close();
    }

}
服务端——Server
package com.itheima.a11test6;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.*;

public class Server {
    public static void main(String[] args) throws IOException {
        //创建自定义线程池(没有上线)
        ThreadPoolExecutor pool = new ThreadPoolExecutor(
                3,//核心线程数量
                6,//最大线程数
                60,//空闲线程(临时员工)最大存活时间
                TimeUnit.SECONDS,//时间单位(秒)
                new ArrayBlockingQueue<>(3),//任务队列
                Executors.defaultThreadFactory(),//创建线程工厂
                new ThreadPoolExecutor.AbortPolicy()//任务的拒绝策略

        );
        //多线程缺点:一条线程执行完就被销毁,下次再执行有创建一个,太浪费资源
        //解决方法:创建线程池


        //接收数据
        //1.创建对象ServerSocker
        ServerSocket ss = new ServerSocket(10000);
        while (true) {
            //2.监听客户端的连接Socket
            Socket socket = ss.accept();
            //开启一条线程,一个用户就对应服务端的一条线程
            //new Thread(new MyRunnable(socket)).start();

            //使用线程池,节约资源
            pool.submit(new MyRunnable(socket));
        }



    }
}
线程类——MyRunnable
package com.itheima.a11test6;

import java.io.*;
import java.net.Socket;
import java.util.UUID;

public class MyRunnable implements Runnable{
    Socket socket;

    public MyRunnable(){

    }
    //创建构造方法,将此时的连接的用户传递过来
    public MyRunnable(Socket socket){
        this.socket =socket;
    }

    @Override
    public void run() {
        try {
            //3.从 连接通道 中获取输入流读取数据
            BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());

            //保存本地
            //产生随机文件名称
            //替换——replace
            String str = UUID.randomUUID().toString().replace("-","");
            System.out.println(str);
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("mysocketnet\\serverdir\\"+str+".png"));

            byte[] bytes = new byte[1024];
            int len;
            while((len = bis.read(bytes)) != -1){
                bos.write(bytes,0,len);
                //写出到本地文件的时候和输出端写到通道数据时一样,需要刷新,将最后缓存区一组数据写出去,
                //如果不刷新,会导致最后一组数据留在缓存区,同时没有关闭这个流,会导致丢失一部分数据
                bos.flush();
            }

            //bos.close();
            //4.回返一个数据
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            bw.write("传输完成");
            bw.newLine();
            bw.flush();//刷新


        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //释放资源
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}

 
 

 

 

WebShell木马“银狐”的威胁狩猎与防御实战指南 WebShell作为一种常见的Web应用后门,通过植入恶意脚本实现对服务器的远程控制,其核心原理是利用Web应用漏洞上传并执行恶意代码。在网络安全领域,WebShell检测与防御是保障服务器安全的关键技术,对于企业安全运维和应急响应具有重要价值。随着攻击技术的演进,WebShell呈现出代码混淆、协议伪装、持久化隐蔽等新特征,广泛应用于数据窃取、内网渗透、加密勒索等攻击场景。本文聚焦近期活跃的“银狐”木马家族,结合【代码混淆】和【持久化】等热词,深入剖析其技术机理,并提供从发现、分析到清除的完整实战方案,帮 阅读详情

相关推荐

SSRF漏洞实战:从原理到绕过技巧与防御策略

服务端请求伪造(SSRF)是一种服务器安全漏洞,其核心原理在于应用程序过度信任并直接处理用户可控的URL参数,导致攻击者可诱使服务器向非预期的内部或外部资源发起网络请求。该漏洞的技术价值在于,它能够利用服务器自身的网络权限和身份,绕过常规的防火墙边界,成为探测和攻击内部系统的关键跳板。在应用场景上,SSRF常出现在需要与外部资源交互的功能中,例如图片预览、数据导入、Webhook回调等。通过结合**内网资产探测**与**云元数据服务**访问等手法,攻击者可进一步读取敏感文件、扫描内网端口,甚至与内网服务漏洞

weixin_30887919的博客 281

TCP实时图像传输

之前尝试过使用UDP进行图像传输,而UDP协议要求包小于64K,对于较大的图像,需要使用分片压缩的方式进行传输,操作较复杂,同时不能保证图片的每一部分都能够正确传输。详见:UDP实时图像传输,UDP实时图像传输进阶篇——1080P视频传输 TCP对于传输的数据大小没有限制,同时TCP在发送失败时还有重传机制,可以保证传输的可靠性,所以本文将使用TCP协议来进行图像的实时传输。 基本流程 TCP连接过程见后面的程序,一般服务端创建一个套接字,绑定本地IP,开启监听,然后客户端也创建一个套接字,连接服务端就可以

白鸟无言的博客 2万+

SSRF漏洞深度解析:原理、实战利用与防御策略

服务器端请求伪造(SSRF)是一种常见且危害极大的Web安全漏洞,其核心原理在于应用程序未对用户可控的URL参数进行充分校验,导致攻击者能够诱使服务器向任意地址发起请求。由于服务器通常位于受保护的内部网络并拥有较高权限,SSRF常被用作内网渗透的跳板,攻击者可借此探测内网资产、读取本地文件、访问云元数据服务,甚至攻击内部应用。在CTF比赛和实战渗透中,诸如ctfhub ssrf、pikachu ssrf等场景频繁出现,体现了该漏洞的多样性和破坏力。理解SSRF的利用手法,如DNSLog外带、协议绕过、Gop

weixin_33888907的博客 399

【java网络编程】用TCP socket实现多线程图片上传

单线程上传服务端:客户端:多线程上传修改服务端:修改客户端 单线程上传 服务端: public static void main(String[] args) { try ( // 创建一个ServerSocket监听8080端口的客户端请求 ServerSocket server = new ServerSocket(8000); // 使用accept()阻塞当前线程,等待客户端请求 Socket socket = serve.

qq_41358574的博客 558

SSRF漏洞攻防实战:从原理到内网漫游与云元数据攻击

服务器端请求伪造(SSRF)是一种常见且危害巨大的Web安全漏洞,其核心原理在于攻击者能够诱使服务器向内部网络或特定系统发起非预期的HTTP请求。由于服务器通常拥有更高的信任级别和更广泛的网络访问权限,SSRF漏洞常被用作突破网络边界、进行内网渗透的跳板。从技术价值看,它不仅是信息探测的利器,更能直接攻击内网脆弱服务、读取本地文件,尤其在云环境中,可被用于访问云元数据服务以窃取临时凭证,进而导致严重的权限沦陷。在应用场景上,SSRF常出现在在线翻译、网页快照、文件处理和Webhook回调等功能中。本文聚焦于

weixin_33693070的博客 1492

相机标定-张正友棋盘格标定法

(X,Y,Z)为在世界坐标系下一点的物理坐标 ( u , v ) 为该点对应的在像素坐标系下的像素坐标 引入齐次坐标的原因:引入齐次坐标的目的是为了升维,将坐标从二维坐标变为三维坐标。 2.相机成像过程 相机成像系统中,共包含四个坐标系:世界坐标系、相机坐标系、图像坐标系、像素坐标系。 (1)世界坐标系(,,) 描述目标在真实世界中的位置引入的参考坐标系。 (2)相机坐标系(,,) ...

qq_41275123的博客 1万+

windows基于TCP/IP的简单文件/图片传输

详细函数资料参考msdn // TransPic_Server.cpp : 定义控制台应用程序的入口点。 /* Server.cpp */ // #include "stdafx.h" #include #include #include #define BUF 256 #pragma comment(lib, "Ws2_32.lib") int _tmain(int argc,

依然那霖哥 3145

Label Studio保姆级教程:从零搭建医疗影像标注平台(DICOM格式支持)

本文提供基于Label Studio从零搭建医疗影像标注平台的保姆级教程。针对DICOM格式支持,详细阐述了环境部署、DICOM深度集成与预处理、团队协作权限管理以及质量审核闭环等核心环节,旨在构建一个高效、可落地的医疗AI数据标注解决方案,助力模型落地。

nft7creator的博客 303

java网络编程

IP import java.net.InetAddress; InetAddress UDP package cn.itcast.demo2; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; /* * 实现UDP接收端 * 永不停歇的接收...

36ICE的博客 451

DTS中video-interfaces接口详解

视频数据管道通常由外部设备组成,例如通过I2C、SPI或UART总线控制的摄像机传感器,以及SoC内部IP块(包括视频DMA引擎和视频数据处理器)。 SoC内部块由DT节点描述,与其他SoC块放置方式类似。外部设备表示为它们各自总线控制器节点的子节点,例如I2C。 所有视频设备上的数据接口都由它们的子“port”节点描述。端口的配置取决于参与数据传输的其他设备,并由“endpoint”子节...

龙图腾的博客 9008

双击文件夹弹窗“找不到应用程序”,但是右键点击打开可以

此电脑、回收站、c、d、f盘、控制面板、任意文件夹等都没有办法双击打开。 右键中包含“使用filemanager打开”,是由于FileManager卸载残留导致的。 懒人专用附件 下载解压上面附件,双击导入可以清理FileManager软件残留 参考: 双击此电脑出现找不到应用程序,但是右键点击可以-其他-优快云问答https://ask.youkuaiyun.com/questions/7631439 电脑上的文件夹双击都提示找不到应用程序,但是右击打开就能打开,该怎么解决? - 知乎 (z

webmasterqpwou的博客 1万+

TCP编程及实现图片上传

一个Socket就是由IP地址和端口号(范围是0~65535)组成,可以把Socket简单理解成IP地址加端口号.端口号总是由操作系统分配,它是一个0~65535之间的数字,其中,小于1024的端口属于特权端口,需要管理员权限,大于1024的端口可以由任意用户的应用程序打开.如果ServerSocket监听成功,我们就使用一个无限循环来处理客户端的连接,注意到代码ss.accept()表示每当有新的客户端连接进来后,就会返回一个Socket实例,这个Socket实例就是用来和刚连接的客户端进行通信的。...

m0_46502752的博客 716

Ubuntu20.04下Docker无缝升级实战指南

本文提供了一份在Ubuntu20.04系统上安全、无缝升级Docker的实战指南。文章详细阐述了升级前的版本检查、数据备份等准备工作,逐步演示了通过APT包管理器进行升级或指定版本安装的操作步骤,并强调了升级后的验证与常见问题回滚方案,确保业务容器平稳过渡。

postgres8guard的博客 478

Rufus启动U盘制作完整教程:4个场景、2张对照表,GPT/MBR与UEFI/BIOS一次选对

Rufus 是一款免费、免安装的启动U盘制作与USB格式化工具,双击即可运行,无需配置。无论你是给新电脑装 Windows 11、在老机器上绕过 TPM 限制、制作 Linux 启动盘,还是只想校验镜像的哈希值,它都能覆盖。本文按场景推进,把备份、选型、写入、校验串成一条线,照着走一遍就能做出可用的启动盘。 ## 先对号入座:你属于哪种场景 动手前先判断自己属于哪一类,后面按图索骥即可: -

gitblog_00570的博客 235

【AIGC】Qwen3-Embedding:Embedding与Rerank模型新标杆

Qwen3-Embedding:文本嵌入与重排序模型的技术解析与应用实践

一个内容严谨、方向前沿、极具实践价值的AI大模型技术分享站 3088

车载ECU底软测试:方法与技术的深度解析

底软是运行在 ECU 硬件平台上的基础软件,它为上层应用程序提供了硬件驱动、操作系统服务、通信协议栈等功能。底软的主要功能包括:硬件驱动:负责与 ECU 的各种硬件外设进行通信和控制,如 GPIO、UART、SPI、CAN 等。操作系统服务:提供任务调度、内存管理、中断处理等功能,确保系统的实时性和稳定性。通信协议栈:实现 ECU 与其他 ECU 或外部设备之间的通信,如 CAN、LIN、FlexRay 等。诊断服务:负责对 ECU 的故障进行诊断和处理,并将故障信息存储在故障码存储器中。

天赐好车的博客 1423

《大型网站技术架构:核心原理与案例分析》阅读闲记

用异步拉取代替同步推送 高可用的主要手段是冗余 任何可以晚做的事都要晚做 web访问优化: 减少http请求,多个静态文件合并 使用浏览器缓存css等 启用压缩 先加载css再加载js 减少cookie传输 CDN 内容分发网络,在客户一端,反向代理也可以缓存,在机房一端 网站性能优化第一定律:优先考虑使用缓存 缓存预热:刚启动就把常用数据加载好 缓存穿透:连null...

qq_37517281的博客 216

2021年03月 C/C++(五级)真题解析#中国电子学会#全国青少年软件编程等级考试

给定一个十进制正整数n(0 < n < 1000000000),每个数位上数字均不为0。n的位数为m。现在从m位中删除k位(0

人生就是一个不断学习的过程 1009

我有一个朋友,分享给我的字节跳动测试开发真题

朋友入职已经两周了,整体工作环境还是非常满意的!所以这次特意抽空给我写出了这份面试题,而我把它分享给小伙伴们,面试&入职的经验!大概是在6月中的时候他告诉我投递了简历,8月的时候经过了3轮面试收获了Offer,当时也参考了很多牛客网站上大佬的面经。

与君初相识,犹如故人归 130

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

# Linux实战笔记:WordPress文创项目部署全流程记录

WordPress是一款开源免费 PHP+MySQL架构的内容管理系统(CMS,Content Management System),2003 年正式发布,基于 GPLv2 开源协议,任何人都可免费使用、修改、二次开发、商用,无需授权费。核心定位:快速搭建各类网站,无需大量代码基础,是全球占有率最高的建站程序,全球超 43% 网站基于 WordPress 搭建。WordPress可演变成为:博客、企业官网、商城、资讯门户、课程网站、作品集、下载站等,需要程序员二次开发。

weixin_46136019的博客 453

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

AI时代程序员的生存法则:从写代码到构建数字因果链

编程正经历从语法执行到系统思维的本质跃迁。随着GitHub Copilot等AI编码工具普及,基础语法记忆与重复性开发需求持续萎缩,但对数据流建模、错误语义解析、资源博弈意识等底层能力的要求却显著提升。现代编码的核心已不再是‘写出能跑的代码’,而是构建可解释、可追溯、可协同的数字因果链——这要求开发者兼具终端直觉、日志即文档意识与部署即实验思维。在AI原生应用、边缘计算与合规敏感系统等新兴场景中,真正稀缺的是能校验AI输出偏差、调试跨发行版兼容性、设计可观测性日志体系的实践者。本文聚焦于这一能力进化路径,揭

weixin_33796177的博客 485

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

我有一个朋友,分享给我的字节跳动测试开发真题。

朋友入职已经两周了,整体工作环境还是非常满意的!所以这次特意抽空给我写出了这份面试题,而我把它分享给小伙伴们,面试&入职的经验! 大概是在6月中的时候他告诉我投递了简历,8月的时候经过了3轮面试收获了Offer,当时也参考了很多牛客网站上大佬的面经。 今天来把当初自己整理的所有可能会问到的题目都分享给大家。 此外这里的面试题,可以分享给大家哈 个人信息 自我介绍 项目(重要) 项目中最大的挑战,花费最长时间的项目,比较有成就感的事情 项目中印象最深的bug 有什么想问的吗 ..

与君初相识,犹如故人归 580

pylint 的 unused-import(W0611)检查机制:从 __init__.py 默认豁免到 init-import 配置

`unused-import`(消息代号 W0611)是 pylint 中用于提示“导入的模块或名称从未被使用”的警告,属于 variables 检查器([VariablesChecker](https://link.gitcode.com/i/34f23019af7a5e4911af83b09e5a49e7))的核心能力。本文以官方消息文档 [details.rst](https://link.

gitblog_01193的博客 539

九月刚入职字节跳动的测试开发面试题,附答案

朋友入职已经两周了,整体工作环境还是非常满意的!所以这次特意抽空给我写出了这份面试题,而我把它分享给小伙伴们,面试&入职的经验!大概是在7月中的时候他告诉我投递了简历,9月的时候经过了3轮面试收获了Offer,当时也参考了很多牛客网站上大佬的面经。

okcross0的博客 265

自建APM之网络优化

网络优化纬度 介绍 正确认识: 网络优化纬度:多维 仅仅重视流量不够 网络流量的消耗:精确 整体均值掩盖单点问题 网络相关监控:全面 粗粒度监控不能帮助我们发现、解决深层次的问题 纬度 流量消耗 一段时间流量消耗的精准度量,网络类型、前台后台 监控相关:用户流量消耗均值、异常率(消耗多、次数多) 完整链路全部监控(Request、Response),主动上报 网络请求质量 用户体验:请求速度、成功率 监控相关:请求时长、业务成功率、失败率、Top失败接口 其它 公司成本:带宽、服务器数、CDN 手机耗电

ZPCrobot的博客 368
上一篇: 网络编程在Java中的使用——UDP通信程序 + TCP通信程序
下一篇: 网络编程——利用TCP协议,做一个带有登录,注册的无界面,控制版的多人聊天室。
new2MySQL
博客等级 码龄5年 255粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值