从网页连接socket服务器和I/O

1.i/o

InputStreamInputStreamReader是Java I/O类库中的两个关键类,用于处理字节流。它们的主要区别在于它们处理数据的方式。

InputStream:

  • InputStream是用于读取字节流的抽象类。它是所有字节输入流类的父类。
  • InputStream的子类可以从不同的数据源读取字节,例如文件、网络连接、内存等。
  • 它提供了基本的字节读取方法,如read(),用于读取单个字节,以及read(byte[] b),用于读取一组字节。
InputStream inputStream = new FileInputStream("example.txt");
int data = inputStream.read(); // 读取单个字节
byte[] buffer = new byte[1024];
int bytesRead = inputStream.read(buffer); // 读取一组字节

 InputStreamReader:

  • InputStreamReaderReader类的子类,它是用于读取字符流的桥梁,将字节流转换为字符流。
  • 它接受一个InputStream作为参数,将字节流转换为字符流,并提供了字符读取方法,如read()read(char[] cbuf)
  • InputStreamReader处理字符的方式是根据指定的字符编码将字节转换为字符。
InputStream inputStream = new FileInputStream("example.txt");
Reader reader = new InputStreamReader(inputStream, "UTF-8");
int charData = reader.read(); // 读取单个字符
char[] charBuffer = new char[1024];
int charsRead = reader.read(charBuffer); // 读取一组字符

BufferedReader:

  • BufferedReaderReader类的装饰器,用于缓冲字符输入。它提供了缓冲功能,可以一次读取多个字符,以提高读取性能。
  • BufferedReader通常用于包装其他Reader,例如FileReaderInputStreamReader,以提供缓冲的字符读取。
InputStream inputStream = new FileInputStream("example.txt");
Reader reader = new InputStreamReader(inputStream, "UTF-8");
BufferedReader bufferedReader = new BufferedReader(reader);

OutputStreamWriter :

OutputStreamWriter是Java I/O类库中的一个类,用于将字符流转换为字节流。它是Writer类的子类,允许你按字符而不是字节写入数据到输出流中,并且可以指定字符编码。

主要特点:

  1. 字符到字节的转换: OutputStreamWriter将字符数据转换为字节数据,然后将字节写入底层的输出流。

  2. 字符编码: 你可以在创建OutputStreamWriter时指定字符编码。这是非常重要的,特别是在处理文本数据时,因为它影响了字符到字节的映射。

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;public class OutputStreamWriterExample {public static void main(String[] args) {try {// 创建一个字节输出流FileOutputStream fileOutputStream = new FileOutputStream("output.txt");// 创建OutputStreamWriter并指定字符编码Writer writer = new OutputStreamWriter(fileOutputStream, "UTF-8");// 写入字符数据writer.write("Hello, OutputStreamWriter!");// 关闭流writer.close();} catch (IOException e) {e.printStackTrace();}}
}

 2.从网页连接socket服务器和I/O

之前我们都是通过自己写的client类连接server的,现在我们通过浏览器来连接server。

连接时,在浏览器里输入http://localhost:8080。

当我们从浏览器访问自己写的服务器时,浏览器(也就是客户端)会向服务器发送请求,我们可以通过socket的输入流来接受并打印这些请求的内容:

BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream));String line;//如果读到的字符串不为空,就打印。为空,则跳出循环while(!((line=bufferedReader.readLine()).isEmpty())){System.out.println(line);}

line里的内容就是请求的内容:

GET / HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Cache-Control: max-age=0
sec-ch-ua: "Not_A Brand";v="8", "Chromium";v="120", "Microsoft Edge";v="120"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6,zh-TW;q=0.5

 

 然后我们还可以向客户端返回数据:

OutputStreamWriter writer=new OutputStreamWriter(socket1.getOutputStream()); 
writer.write("HTTP/1.1 200 Accepted\r\n");//在响应头写完后一定要再换行才能写我们的响应体(在浏览器上展示的部分)writer.write("\r\n");//响应的内容writer.write("lyjnb");writer.flush();socket1.close();

其中,

"HTTP/1.1 200 Accepted\r\n" 是 HTTP 协议中的响应头。
"HTTP/1.1" 表示使用的是 HTTP 1.1 版本。
"200" 是响应状态码,表示请求被成功处理。
"Accepted" 是状态码的描述,表示请求已被接受。
最后的 "\r\n" 是回车和换行符,表示行结束符,HTTP 协议要求在头部信息的每一行末尾使用这个组合。

最后我们得到的效果:

package socket3_browser_to_socket;import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;public class Server {public static void main(String args[]){try(ServerSocket socket=new ServerSocket(8080)){System.out.println("waiting for client...");Socket socket1=socket.accept();System.out.println("already connected, ip address:"+socket1.getInetAddress().getHostAddress());InputStream inputStream=socket1.getInputStream();System.out.println("data received:");//BufferedReader是Reader类的装饰器,用于缓冲字符输入。它提供了缓冲功能,可以一次读取多个字符,以提高读取性能。//InputStreamReader是Reader类的子类,它是用于读取字符流的桥梁,将字节流转换为字符流。//InputStream是用于读取字节流的抽象类。它是所有字节输入流类的父类。BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream));String line;//如果读到的字符串不为空,就打印。为空,则跳出循环while(!((line=bufferedReader.readLine()).isEmpty())){System.out.println(line);}OutputStreamWriter writer=new OutputStreamWriter(socket1.getOutputStream());//"HTTP/1.1 200 Accepted\r\n" 是 HTTP 协议中的响应头。//"HTTP/1.1" 表示使用的是 HTTP 1.1 版本。//"200" 是响应状态码,表示请求被成功处理。//"Accepted" 是状态码的描述,表示请求已被接受。//最后的 "\r\n" 是回车和换行符,表示行结束符,HTTP 协议要求在头部信息的每一行末尾使用这个组合。writer.write("HTTP/1.1 200 Accepted\r\n");//在响应头写完后一定要再换行才能写我们的响应体(在浏览器上展示的部分)writer.write("\r\n");//响应的内容writer.write("lyjnb");writer.flush();socket1.close();}catch (Exception e){e.printStackTrace();}}
}

 

 

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

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

相关文章

rime中州韵小狼毫 随机数 随机码 电脑信息 滤镜

在输入法中支持生成GUID,或者随机数,随机字符,获取自身电脑信息,这将是一个非常酷的功能。 先睹为快 本文所分享滤镜,主要用于生成一些动态的信息词条,效果如下👇: GUID.lua GU…

如何正确地理解应用架构并开发

许多同学或多或少都经历过这样的流程: 新同学刚来公司,学习了解团队的一些工程代码,并了解其中的代码风格团队新接手了一些其他团队的项目,需要了解工程结构以及概念如何定义工程项目的工程结构,包目录结构并达成团队共…

抖音矩阵云混剪系统源码 短视频矩阵营销系统V2.2.1(免授权版)

抖音矩阵云混剪系统源码 短视频矩阵营销系统V2.2.1(免授权版) 中网智达矩阵营销系统多平台多账号一站式管理,一键发布作品。智能标题,关键词优化,排名查询,混剪生成原创视频,账号分组&#xff…

Redis主从复制、哨兵及集群

目录 简介 主从复制 哨兵 集群 1.Redis 主从复制 主从复制的作用 主从工作原理 主从复制搭建 安装redis 修改redis配置文件Master节点操作 修改 Redis 配置文件slave节点操作 验证主从效果 2.Redis 哨兵模式 哨兵模式的作用 哨兵结构组成部分 故障转移机制 主…

API(Math类,System类,Runtime类,Object类,Objects类,BigInteger类,BigDecimal类)

文章目录 课程目标1 Math类1.1 概述1.2 常见方法1.3 算法小题(质数)1.4 算法小题(自幂数)1.5 课后练习 2 System类2.1 概述2.2 常见方法 3 Runtime3.1 概述3.2 常见方法3.3 恶搞好基友 4 Object类4.1 概述4.2 常见方法 5 Objects类5.1 概述5.2 常见方法 6 BigInteger类6.1 引入…

vue-vben-admin 与.net core 结合实例 【自学与教学 小白教程】---第4节---部门管理

ue-vben-admin 与.net core 结合实例 这里计划使用.net core 作为后端 。目标:打造好看 易用 开箱即用 的netcore一体化框架。Vue Vben Admin For NetCore 取命 hcrain-vvadmin 我不是前端人员 但有时开发还是要写一些界面。 之前使用layui是时候 狠心升级下了。 …

【教3妹学编程-算法题】移除后集合的最多元素数

3妹:好冷啊, 冻得瑟瑟发抖啦 2哥 : 这才哪跟哪,上海这几天温度算是高的啦。你看看哈尔滨,那才是冰城。 3妹:据说沈阳千名“搓澡大姨”支援哈尔滨?哈哈哈哈 2哥 : 就像今年的淄博烧烤,可能有炒作…

LabVIEW在微生物检测中的应用

随着对食品安全关注的增加,食品检测的准确性变得越来越重要。其中,微生物计数作为食品合格的关键指标,对其检测技术的准确性和实时性要求极高。传统的微生物检测面临着菌落识别困难、设备实时性差和自动化程度不高等问题,尤其在疫…

GB28181视频汇聚平台EasyCVR级联后,部分通道视频无法播放是什么原因?

GB28181协议智慧安防平台EasyCVR是基于各种IP流媒体协议传输的视频汇聚和融合管理平台。视频流媒体服务器EasyCVR采用了开放式的网络结构,支持高清视频的接入和传输、分发,平台提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制…

Hystrix

Hystrix简介 Hystrix是由Netflix开源的一个延迟和容错库,用于隔离访问远程系统、服务或者第三方库,防止级联失败,从而提升系统的可用性与容错性。 断路器本身是一种开关装置,当某个服务单元发生故障后,通过断路器的故障监控(类似熔断保险丝…

图解Kubernetes的服务(Service)

pod 准备: 不要直接使用和管理Pods: 当使用ReplicaSet水平扩展scale时,Pods可能被terminated当使用Deployment时,去更新Docker Image Version,旧Pods会被terminated,然后创建新Pods 0 啥是服务&#xf…

[工具探索]-PS处理图片文字

以下涉及到用PS进行图片中文字的删减、替换、修改等操作,比较琐碎,不过用替换方式可以做到无印记 1、将图片中中局部删除 (1)导入图片信息(2)首先双击图层解锁,然后按住alt键拖动图层&#xf…

Open CASCADE学习|创建拓朴

目录 1、创建点gp_Pnt 2、创建向量gp_Vec 3、创建边TopoDS_Edge 4、线网络TopoDS_Wire 5、面TopoDS_Face 6、体TopoDS_Shape OpenCascade中的拓朴实体如下图所示,其中Compound可以包含很多Solid;Solid由Shell包围而成;Shell由相连的Fac…

LeetCode 36 有效的数独

题目描述 有效的数独 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考…

MySQL连续案例续集

01)查询学过「张三」老师授课的同学的信息 SELECT s.*, c.cname, t.tname, sc.score FROM t_mysql_teacher t, t_mysql_course c, t_mysql_student s, t_mysql_score sc WHERE t.tid c.tid AND c.cid sc.cid AND sc.sid s.sid AND t.tname ‘张三’ 02&#x…

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -创建图文投票实现

锋哥原创的uniapp微信小程序投票系统实战: uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…

【SQL】对表中的记录通过时间维度分组,统计出每组的记录条数

场景:一般用作数据统计,比如统计一个淘宝用户在年、月、日的维度上的订单数。 业务:一个集合,以时间维度来进行分组求和。 准备一张订单表order,有一些常规属性,比如创建时间,订单号。 DDL语句如…

【2023】java常用HTTP客户端对比以及使用(HttpClient/OkHttp/WebClient)

💻目录 1、介绍2、使用2.1、添加配置2.1.1、依赖2.1.2、工具类2.1.3、实体2.1.4、Controller接口 2.2、Apache HttpClient使用2.3 、OkHttp使用2.4、WebClient使用 1、介绍 现在java使用的http客户端主要包括以下几种 而这些中使用得最频繁的主要是: A…

Deno 1.22 发布

目录 更新默认的类型检查模式 移除Deno.emit()Deno.formatDiagnostics()和Deno.applySourceMap() API 默认启用Deno命名空间 --no-config标识 Navigator.userAgent 更新 Deno.resolveDns() API 引入新的Response.json()静态方法 在 LSP 默认启用 Linting 对测试运行程…

资源调度(2)-----pod的亲和性和反亲和性

集群调度: schedule的调度算法。 预算策略:过滤出合适的节点 优先策略: 选择部署的节点 nodeName:硬匹配,不走调度策略。node01. nodeSelector:根据节点的标签选择,会走调度算法。 只要是走调度算法,在不满…