TCP网络通信编程之字符流

news2024/11/16 23:44:45

【案例1】

【题目描述】

【 注意事项】

(3条消息) 节点流和处理流 字符处理流BufferedReader、BufferedWriter,字节处理流-BufferedInputStream和BufferedOutputStream (代码均正确且可运行_Studying~的博客-CSDN博客

1。这里需要使用字符处理流,来将字节流转为字符流。使用的字符流,所以一定要使用writer.flush来进行手动刷新,否则无法将数据写入到数据通道。然后使用时只需要关闭外层流即可。

2. 这里因为使用的是字符流,结束标志就可以改为 writer.newLine();,但是这样的话,要求接收数据端一定要使用reder.readLine();

【服务端代码】

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

/**
 * @ProjectName: Study
 * @FileName: SocketTCP02Server
 * @author:HWJ
 * @Data: 2023/7/29 11:50
 */
public class SocketTCP03Server {
    public static void main(String[] args) throws IOException {

        // 监听本机端口9999,等待连接
        // 细节:要求在本机没有其他服务在监听9999端口
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println("服务端,在9999端口监听,等待连接");
        // 当没有客户端连接9999端口时,程序会阻塞,等待连接
        // 如果有客户端连接,则会返回Socket对象,程序继续
        Socket socket = serverSocket.accept();

        // 通过socket.getInputStream() 读取客户端写入到数据通道的数据,显示
        InputStream inputStream = socket.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));

        // 读取数据
        String str = reader.readLine();
        System.out.println(str);

        // 发送给客户端
        OutputStream outputStream = socket.getOutputStream();
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream));
        writer.write("hello, client");
        writer.newLine(); // 插入一个换行符,表示写入的内容结束,注意,要求对方使用readLine()!!!
        writer.flush(); // 如果使用的字符流,需要手动刷新,否则数据不会写入数据通道

        // 这里一定要关闭流对象和socket,serverSocket对象,否则会造成资源浪费。
        serverSocket.close();
        socket.close();
        reader.close();
        writer.close();
        System.out.println("服务端退出...");
    }
}

【客户端代码】

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

/**
 * @ProjectName: Study
 * @FileName: SocketTCP02Client
 * @author:HWJ
 * @Data: 2023/7/29 11:50
 */
public class SocketTCP03Client {
    public static void main(String[] args) throws IOException {

        // 连接本机的 9999端口,如果连接成功,返回Socket对象
        Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
        System.out.println("连接成功...");

        // 连接上后,生成Socket对象,通过socket.getOutputStream 来写入数据
        OutputStream outputStream = socket.getOutputStream();
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream));
        writer.write("hello, server");
        writer.newLine(); // 插入一个换行符,表示写入的内容结束,注意,要求对方使用readLine()!!!
        writer.flush(); // 如果使用的字符流,需要手动刷新,否则数据不会写入数据通道

        // 通过socket.getInputStream() 读取客户端写入到数据通道的数据,显示
        InputStream inputStream = socket.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));

        // 读取数据
        String str = reader.readLine();
        System.out.println(str);

        // 这里一定要关闭流对象和socket对象,否则会造成资源浪费。
        socket.close();
        reader.close(); // 只需要关闭外层流即可
        writer.close();
        reader.close();
        System.out.println("客户端退出...");

    }
}

【结果展示】

 

 

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

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

相关文章

FPGA设计时序分析三、恢复/去除时间

目录 一、背景说明 二、工程设计 2.1 工程代码 2.2 综合结果 一、背景说明 ​恢复时间recovery和去除时间removal和setup、holdup类型,不同点是数据信号为控制信号,如复位,清零,使能信号,更多的是异步的复位信号&a…

Merge the squares! 2023牛客暑期多校训练营4-H

登录—专业IT笔试面试备考平台_牛客网 题目大意:有n*n个边长为1的小正方形摆放在边长为n的大正方形中,每次可以选择不超过50个正方形,将其合并为一个更大的正方形,求一种可行的操作使所有小正方形都被合并成一个n*n的大正方形 1…

硬件-8-操作系统的历史

操作系统的最强入门科普(Unix/Linux篇) 操作系统的发展史(DOS/Windows篇) Mac操作系统进化史 手机操作系统的沉浮往事(上) 手机操作系统的沉浮往事(下) 1 操作系统种类 我们天天都…

flex 弹性布局学习

一.Flex布局: Flex是Flexible Box 缩写“弹性布局”,用来为盒状模型提供最大得灵活性。 任何一个容器都可以指定为 Flex 布局。 .box{display: flex; } 行内元素也可以使用 Flex 布局。 .box{display: inline-flex; } Webkit 内核的浏览器,必须加上-webkit前缀。…

CAS中ABA问题

在线程1最后需要写入比较时,发现预估值与内存值都为1是相同的,就会误以为之前没有其他线程操作,其时之前线程2将1->2,又将2->1,称为ABA。 4.4.1解决方法 添加类的版本号,来避免ABA问题,如原来内存值…

代码随想录训练营day4

问题一: 面试题 02.07. 链表相交 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。 图示两个链表在节点 c1 开始相交: 输入 输出 intersectVal 8, list…

无涯教程-jQuery - Fold方法函数

Fold 效果可以与show/hide/toggle一起使用。这样可以像折叠纸一样折叠元素。 Fold - 语法 selector.hide|show|toggle( "fold", {arguments}, speed ); 这是所有参数的描述- horizFirst - 是否先水平折叠。可以是true或false。默认值为false。model - 效果…

数字光源控制器报警说明

Revision Sheet: Rev Data Author Description 1.0 20230729 Shuangyi 数字光源控制器报警说明 V1.0 一.报警说明 当我们所连接的光源负载超出光源控制器本身驱动能力的时候,我们会对控制器进行保护,从以下方式可知道过流的情况,如…

ScheduledThreadPoolExecutor 及 ThreadPoolExecutor的基本使用及说明

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。 目录 一、导读二、概览2.1 为什么不推荐使用Executors去创建线程池 三、…

C# 快速写入日志 不卡线程 生产者 消费者模式

有这样一种场景需求,就是某个方法,对耗时要求很高,但是又要记录日志到数据库便于分析,由于访问数据库基本都要几十毫秒,可在方法里写入BlockingCollection,由另外的线程写入数据库。 可以看到,在…

abp vnext4.3版本托管到iis同时支持http和https协议

在项目上本来一直使用的是http协议,后来因为安全和一些其他原因需要上https协议,如果发布项目之后想同时兼容http和https协议需要更改一下配置信息,下面一起看一下: 1.安装服务器证书 首先你需要先申请一张服务器证书,申请后将证书安装到服务器上(也可以在iis中选择服务器…

第27天-熔断,降级,限流,网关流控,服务链路追踪

1.熔断/降级/限流 1.1.简介 1.1.1.熔断 A服务调用B服务某个功能,由于网络不稳定问题,或者B服务卡机,导致功能时间超长。如果这样的次数太多,我们就可以直接将B服务断路(A不再请求B接口),凡是…

OJ练习第145题——并行课程 III

力扣链接:2050. 并行课程 III 题目描述 给你一个整数 n ,表示有 n 节课,课程编号从 1 到 n 。同时给你一个二维整数数组 relations ,其中 relations[j] [prevCoursej, nextCoursej] ,表示课程 prevCoursej 必须在课…

如何高效书写文章访问

一、了解CSDN CSDN(CSDN博客)是中国最大的IT技术社区和程序员学习平台之一。CSDN成立于1999年,是中国软件开发者网络的缩写,旨在为中国的软件开发者和IT技术爱好者提供学习、交流和分享的平台。以下是关于CSDN的一些介绍&#xff…

1.写uni-app推荐的工具 HBuilderX

ni-app是一个框架,最大的优点是适用性强。你用这个框架写一套代码,他就能转换为各种小程序(微信,支付宝),App,PC的web的样子 对于目前(20230723)来讲,在跨端的时候极容易报错。比如…

Ubuntu Server版 之 共享文件 samba和NFS 两种方法

NFS 和 Samba NFS : linux之间资源共享 Samba: 是windows系统与Linux系统之间资源共享的 samba 安装samba 工具 sudo apt install samba 创建共享目录 sudo mkdir /home/shared sudo chmod 777 /home/shared 配置sambd sudo vim /etc/samba/smb.con…

MySQL 实现分库和分表的备份 2023.7.29

1、分库备份 [rootlocalhost mysql-backup]# cat db_bak.sh #!/bin/bash k_userroot bak_password123456 bak_path/root/mysql-backup/ bak_cmd"-u$bak_user -p$bak_password" exc_db"Database|information_schema|mysql|performance_schema|sys" dbname…

SQL-每日一题【1068. 产品销售分析 I】

题目 销售表 Sales: 产品表 Product: 写一条SQL 查询语句获取 Sales 表中所有产品对应的 产品名称 product_name 以及该产品的所有 售卖年份 year 和 价格 price 。 查询结果中的顺序无特定要求。 查询结果格式示例如下: 解题思路 1.题目要…

Go-高质量编程与性能调优

高质量编程: 什么是高质量: ​ ——编写代码能达到正确可靠,简洁清晰的目标 各种边界条件是否考虑完备 异常情况处理,稳定性保证 易读易维护 编程原则 简单性 消除“多余的复杂性”,以简单清晰的逻辑编写代码 不理解…

《Vue3+Typescript》一个简单的日历组件实现

这是一个没有套路的前端博主,热衷各种前端向的骚操作,经常想到哪就写到哪,如果有感兴趣的技术和前端效果可以留言~博主看到后会去代替大家踩坑的~ 主页: oliver尹的主页 格言: 跌倒了爬起来就好~ 目录 一、…