网络编程——TCP通信练习

目录

一、多发多收

二、接收和反馈

三、上传文件

四、解决上传文件名重复问题

五、上传文件多线程版

六、上传文件线程池版

七、B/S(接收浏览器的消息并打印)


一、多发多收

客户端:多次发送数据

服务器:接收多次数据,并打印

public class Client {public static void main(String[] args) throws IOException {Socket socket = new Socket("127.0.0.1", 10010);Scanner scanner = new Scanner(System.in);OutputStream os = socket.getOutputStream();while (true) {System.out.println("请输入内容:");String str = scanner.nextLine();os.write(str.getBytes());if ("拜拜".equals(str)) {break;}}socket.close();}
}public class Server {public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(10010);Socket socket = serverSocket.accept();BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));int len;while ((len = br.read()) != -1) {System.out.print((char) len);}socket.close();serverSocket.close();}
}

运行结果:

二、接收和反馈

客户端:发送一条数据,接收服务端反馈的消息并打印

服务器:接收数据并打印,再给客户端反馈消息

public class Client {public static void main(String[] args) throws IOException {Socket socket = new Socket("127.0.0.1", 10010);// 写出数据OutputStream os = socket.getOutputStream();String str = "客户端发送消息:见到你很开心!";os.write(str.getBytes());// 写出结束标记socket.shutdownOutput();// 读取数据BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));int len = 0;while ((len = br.read()) != -1) {System.out.print((char) len);}// 释放资源socket.close();}
}public class Server {public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(10010);Socket socket = serverSocket.accept();// 读取数据// 细节:read方法会从连接通道中读取数据//       但是,需要有一个结束标记,此处的循环才会停止,//       否则,程序就会一直停在read方法这里,等待读取下面的数据BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));int len;while ((len = br.read()) != -1) {System.out.print((char) len);}// 写出数据OutputStream os = socket.getOutputStream();String str = "服务器发送消息:有多开心?";os.write(str.getBytes());// 释放资源socket.close();serverSocket.close();}
}

运行结果:

三、上传文件

客户端:将本地文件上传到服务器,接收服务器的反馈。

服务器:接收客户端上传的文件,上传完毕之后给出反馈。

使用FileInputStream读取本地文件,使用FileOutputStream保存本地文件

public class Client {public static void main(String[] args) throws IOException {// 1.创建Socket对象,并连接服务器Socket socket = new Socket("127.0.0.1", 10020);// 2.读取本地文件中的数据,并写到服务器中BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());BufferedInputStream bis = new BufferedInputStream(new FileInputStream("mysocketnet/clientdir/a.jpg"));int len;byte[] bytes = new byte[1024];while ((len = bis.read(bytes)) != -1) {bos.write(bytes, 0, len);}// 向服务器写出结束标记socket.shutdownOutput();// 3.接收服务器的回写数据BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));String str = br.readLine();System.out.println(str);// 4.释放资源socket.close();}
}public class Server {public static void main(String[] args) throws IOException {// 1.创建对象并绑定端口ServerSocket serverSocket = new ServerSocket(10020);// 2.等待客户端来连接Socket socket = serverSocket.accept();// 3.读取客户端发送的数据,并将数据存入指定路径中BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("mysocketnet/serverdir/a.jpg"));int len;byte[] bytes = new byte[1024];while ((len = bis.read(bytes)) != -1) {bos.write(bytes, 0, len);}// 4. 服务器向客户端回写数据BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));bw.write("服务器向客户端发送消息:文件已接收!");bw.newLine();bw.flush();// 5.释放资源socket.close();serverSocket.close();}
}

运行结果:

四、解决上传文件名重复问题

Client代码无需修改

public class Server {public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(10020);Socket socket = serverSocket.accept();BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());// 方式一:使用毫秒值拼接
//        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("mysocketnet\\serverdir" + File.separator + System.currentTimeMillis() + ".jpg"));// 方式二:使用UUID拼接String name = UUID.randomUUID().toString().replace("-", "");BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("mysocketnet\\serverdir" + File.separator + name + ".jpg"));int len;byte[] bytes = new byte[1024];while ((len = bis.read(bytes)) != -1) {bos.write(bytes, 0, len);}BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));bw.write("文件上传成功!");bw.newLine();bw.flush();socket.close();serverSocket.close();}
}

运行结果:

五、上传文件多线程版

让服务器不停止,能接收很多用户上传的图片,可以使用(循环+多线程)

Client代码无需修改 

public class MyRunnable implements Runnable {public Socket socket;public MyRunnable(Socket socket) {this.socket = socket;}@Overridepublic void run() {try {BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());String name = UUID.randomUUID().toString().replace("-", "");BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("mysocketnet\\serverdir" + File.separator + name + ".jpg"));int len;byte[] bytes = new byte[1024];while ((len = bis.read(bytes)) != -1) {bos.write(bytes, 0, len);}BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));bw.write("文件上传成功!");bw.newLine();bw.flush();} catch (IOException e) {throw new RuntimeException(e);} finally {if (socket != null) {try {socket.close();} catch (IOException e) {throw new RuntimeException(e);}}}}
}public class Server {public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(10020);while (true) {// 等待客户端来连接Socket socket = serverSocket.accept();// 一个用户对应服务端的一条线程new Thread(new MyRunnable(socket)).start();}}
}

先开启Server,每开启一次Client,就会创建一个线程,文件也会上传

运行结果:

六、上传文件线程池版

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

只需要修改Server即可: 

public class Server {public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(10020);// 创建线程池对象ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(3, // 核心线程数量16, // 线程池总大小60, // 空闲时间TimeUnit.SECONDS, // 空闲时间(单位)new ArrayBlockingQueue<>(2), // 队列Executors.defaultThreadFactory(), // 线程工厂,让线程池如何创建线程对象new ThreadPoolExecutor.AbortPolicy() // 阻塞队列);while (true) {Socket socket = serverSocket.accept();
//            new Thread(new MyRunnable(socket)).start();poolExecutor.submit(new MyRunnable(socket));}}
}

运行结果:

七、B/S(接收浏览器的消息并打印)

客户端:不需要写

服务器:接收数据并打印

public class Server {public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(10010);Socket socket = serverSocket.accept();BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));int len;char[] chars = new char[1024];while ((len = br.read(chars)) != -1) {System.out.println(new String(chars, 0, len));br.readLine();}socket.close();serverSocket.close();}
}

浏览器输入:http://localhost:10010/

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/466170.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【stm32】RTC时钟的介绍与使用

RTC时钟的介绍与使用 一、时间戳1、Unix时间戳2、UTC/GMT3、时间戳转换 二、BKP简介及代码编写1、BKP简介2、BKP基本结构3、BKP库函数介绍&#xff1a;4、程序编写&#xff1a; 三、RTC简介及代码编写1、RTC简介2、RTC框图2、RTC基本结构3、RTC相关库函数介绍&#xff1a;4、程…

在docker中搭建redis哨兵环境

文章目录 一、引言二、环境准备前提条件目录结构 三、配置文件1. 主节点配置文件 sentinel-master.conf2. 从节点配置文件3. 哨兵配置文件 sentinel.conf4. Docker Compose 文件 四、启动 Docker Compose五、验证哨兵机制1. 检查主节点状态2. 检查从节点状态3. 检查哨兵状态4. …

职场高手揭秘,细节如何左右你的成败与升迁之路

身在职场&#xff0c;每一个人都想得到老板的器重&#xff0c;能不断地加薪、升职&#xff0c;从而获得职场的成功。但你知道&#xff0c;影响一个人职场成功&#xff0c;或者说影响升职加薪的最重要因素是什么吗&#xff1f; 许多人会说那要靠运气&#xff0c;也有人认为工作…

微信小程序 高校教材征订系统

文章目录 项目介绍具体实现截图技术介绍mvc设计模式小程序框架以及目录结构介绍错误处理和异常处理java类核心代码部分展示详细视频演示源码获取 项目介绍 系统分为三个角色&#xff0c;分别是教材科、系教学秘书、教研室主任。系统主要完成功能是教材科要发布教材征订信息&am…

RNN中的梯度消失与梯度爆炸问题

梯度消失与梯度爆炸问题 循环神经网络&#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;是一类具有短期记忆能力的神经网络&#xff0e;在循环神经网络中&#xff0c;神经元不但可以接受其他神经元的信息&#xff0c;也可以接受自身的信息&#xff0c;形成具有…

Unity网络开发基础(part5.网络协议)

目录 前言 网络协议概述 OSI模型 OSI模型的规则 第一部分 物理层 数据链路层 网络层 传输层 第二部分 ​编辑 应用层 表示层 会话层 每层的职能 TCP/IP协议 TCP/IP协议的规则 TCP/IP协议每层的职能 TCP/IP协议中的重要协议 TCP协议 三次握手 四次挥手 U…

ENSP GVRP动态学习VLAN

手工配置的VLAN称为静态VLAN&#xff0c;通过GVRP协议创建的VLAN称为动态VLAN。 GVRP有三种注册模式&#xff0c;不同的模式对静态VLAN和动态VLAN的处理方式也不同。 GVRP的三种注册模式分别定义如下&#xff1a; Normal模式&#xff1a;允许动态VLAN在端口上进行注册…

【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题

目录 1. 单例模式 (1) 饿汉模式 (2) 懒汉模式 1. 单线程版本 2. 多线程版本 2. 解决懒汉模式产生的线程安全问题 (1) 产生线程安全的原因 (2) 解决线程安全问题 1. 通过加锁让读写操作紧密执行 方法一 方法二 2. 处理加锁引入的新问题 问题描述 …

论文阅读:Computational Long Exposure Mobile Photography (二)

这篇文章是谷歌发表在 2023 ACM transaction on Graphic 上的一篇文章&#xff0c;介绍如何在手机摄影中实现长曝光的一些拍摄效果。 Abstract 长曝光摄影能拍出令人惊叹的影像&#xff0c;用运动模糊来呈现场景中的移动元素。它通常有两种模式&#xff0c;分别产生前景模糊或…

大语言模型鼻祖Transformer的模型架构和底层原理

Transformer 模型的出现标志着自然语言处理&#xff08;NLP&#xff09;技术的一次重大进步。这个概念最初是针对机器翻译等任务而提出的&#xff0c;Transformer 后来被拓展成各种形式——每种形式都针对特定的应用&#xff0c;包括原始的编码器-解码器&#xff08;encoder-de…

解决vue3导出.xlsx的blob文件受损问题

1、 首先要设置get或者post请求的类型。这里我用到post请求 eg&#xff1a;在http.ts中添加公共的方法。 export function post1(url: string, params: any): Promise<AxiosResponse> | Promise<AxiosResponse<any>> {return new Promise((resolve, reject…

Jest项目实战(6):搭建文档网站

搭建文档网站 创建 API 文档可以选择如下的 3 种方式&#xff1a; 功能较少&#xff0c;可以直接写在 README.md 文件里面内容较多&#xff0c;可以单独写一个文件API 数量众多&#xff08;Vue、React 这种级别&#xff09;&#xff0c;需要考虑单独拿一个网站来做详细的文档…

STM32项目---水质水位检测

1 项目简介 1.1 项目需求 本项目通过测量水体的TDS来反映水体的质量。并同时可以测量水位&#xff08;水深&#xff09;。 1.2 系统总体设计 2 硬件模块 2.1 硬件选型 水位测量模块 TDS采集模块 外置ADC模块&#xff08;ADS1115&#xff09; 2.2 水位测量模块使用方法 …

从神经元到神经网络:深度学习的进化之旅

神经元、神经网络 神经元 Neuron )&#xff0c;又名感知机( Perceptron )&#xff0c;在模型结构上与 逻辑回归 一致&#xff0c;这里以一个二维输入量的例子对其进行进一步 的解释&#xff1a; 假设模型的输 入向 量是一 维特征向 (x1,x2). 则单神 经元的模型结构 如下…

银行信贷风控专题:Python、R 语言机器学习数据挖掘应用实例合集:xgboost、决策树、随机森林、贝叶斯等

银行信贷风控专题&#xff1a;Python、R 语言机器学习数据挖掘应用实例合集&#xff1a;xgboost、决策树、随机森林、贝叶斯等 原创 拓端研究室 全文链接&#xff1a;https://tecdat.cn/?p38026 在当今金融领域&#xff0c;风险管控至关重要。无论是汽车贷款违约预测、银行挖掘…

某华迪加现场大屏互动系统mobile.do.php任意文件上传

免责声明 本文章仅供学习与交流&#xff0c;请勿用于非法用途&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任 漏洞描述 该系统是实现现场大屏互动&#xff0c;里面功能众多&#xff0c;但在mobile.do.php接口处存在任意文件上传漏洞 搜索语法 fof…

基于Python的学生宿舍管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

【AI视频换脸整合包及教程】AI换脸新星:Rope——让换脸变得如此简单

在数字技术迅猛发展的今天&#xff0c;人工智能&#xff08;AI&#xff09;的应用已经渗透到了我们生活的方方面面&#xff0c;从日常的语音助手到复杂的图像处理&#xff0c;无不体现着AI技术的魅力。特别是在娱乐和创意领域&#xff0c;AI技术更是展现出了惊人的潜力。其中&a…

A012-基于Spring Boot的私房菜定制上门服务系统的设计与实现

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统私房菜定制上门服务系统信息管理难度大&#xff0c;容错率…

EV录屏好用吗?盘点2024年10款专业好用的录屏软件。

EV录屏的方式有很多种&#xff0c;它设置了很多模式&#xff0c;并且录制高清&#xff0c;可以免费使用。但是现在很多的录屏工具都有着与这个软件相似的功能&#xff0c;在这里我可以给大家列举一些。 1、福昕电脑录屏 这个软件为用户提供了多种录制模式&#xff0c;让视频录…