Java的TCP通信

Java的TCP通信

TCP发送数据

  • Java中的TCP通信

    • Java对基于TCP协议的的网络提供了良好的封装,使用Socket对象来代表两端的通信端口,并通过Socket产生IO流来进行网络通信。
    • Java为客户端提供了Socket类,为服务器端提供了ServerSocket类
  • 构造方法

    方法名说明
    Socket(InetAddress address,int port)创建流套接字并将其连接到指定IP指定端口号
    Socket(String host, int port)创建流套接字并将其连接到指定主机上的指定端口号
  • 相关方法

    方法名说明
    InputStream getInputStream()返回此套接字的输入流
    OutputStream getOutputStream()返回此套接字的输出流
  • 示例代码

    字节流往外写出的时候只能写字节信息

    
    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.Socket;public class Client {public static void main(String[] args) throws IOException {//TCP协议,发送数据//1.创建Socket对象//细节:在创建对象的同时会连接服务端,如果服务端没有启动,就会抛出异常Socket socket = new Socket("127.0.0.1", 10086);//2.可以从socket对象中获取一个输出流对象OutputStream os = socket.getOutputStream();//3.使用输出流对象发送数据os.write("你好帅".getBytes());//4.释放资源socket.close();os.close();}
    }

TCP接收数据

  • 构造方法

    方法名说明
    ServletSocket(int port)创建绑定到指定端口的服务器套接字
  • 相关方法

    方法名说明
    Socket accept()监听要连接到此的套接字并接受它
  • 注意事项

    1. accept方法是阻塞的,作用就是等待客户端连接
    2. 客户端创建对象并连接服务器,此时是通过三次握手协议,保证跟服务器之间的连接
    3. 针对客户端来讲,是往外写的,所以是输出流
      针对服务器来讲,是往里读的,所以是输入流
    4. read方法也是阻塞的
    5. 客户端在关流的时候,还多了一个往服务器写结束标记的动作
    6. 最后一步断开连接,通过四次挥手协议保证连接终止
  • 三次握手和四次挥手

    • 三次握手,确保正常连接

      这里第三次握手是客户端再次发送确认消息,这是因为当服务器发送给客户端运行请求后,服务器无法确认客户端是否接收到了,这时客户端再次发个确认消息,那么他们就可以正常发数据了。

      在这里插入图片描述

    • 四次挥手,确保连接断开,且数据处理完毕

      A:我要断开链接了

      B:别急还有数据 等我接受完

      B:我接收完数据了 你还断开链接吗

      A:断开连接

      在这里插入图片描述

  • 示例代码

    
    import java.io.InputStream;
    import java.net.ServerSocket;
    import java.net.Socket;public class Server {public static void main(String[] args) throws Exception {//TCP协议,接收数据//1.创建ServerSocket对象ServerSocket ss = new ServerSocket(10086);System.out.println("等待连接。。。");//2.调用accept方法,接收连接Socket accept = ss.accept();System.out.println("连接成功。。。");InputStream is = accept.getInputStream();//3.读取数据int b;while ((b = is.read()) != -1) {System.out.println((char) b);}//4.释放资源ss.close();is.close();}
    }
    

    但是以上代码通过运行后会发现,不能够发送中文,会出现乱码。

    原因:没有去指定编码表,会使用IDEA默认的UTF-8编码,此时会把一个中文变成三个字节。会将所有中文先转换成字节,比如四个汉字就是12个字节全部发送,后面再一个字节一个字节的转成字符,那么每次就是转三分之一的字符,因此回乱码。所有不能用字节流读取。我们可以使用字符流,因此可以创建一个转换流,把is转换为字符流。

    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.ServerSocket;
    import java.net.Socket;public class Server {public static void main(String[] args) throws Exception {//TCP协议,接收数据//1.创建ServerSocket对象ServerSocket ss = new ServerSocket(10086);System.out.println("等待连接。。。");//2.调用accept方法,接收连接Socket accept = ss.accept();System.out.println("连接成功。。。");InputStream is = accept.getInputStream();InputStreamReader isr = new InputStreamReader(is);//3.读取数据int b;while ((b = isr.read()) != -1) {System.out.print((char) b);}//4.释放资源ss.close();accept.close();}
    }

    为提高读取效率,还可以再包一个缓冲流

    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.Socket;public class Client {public static void main(String[] args) throws IOException {//TCP协议,发送数据//1.创建Socket对象//细节:在创建对象的同时会连接服务端,如果服务端没有启动,就会抛出异常Socket socket = new Socket("127.0.0.1", 10086);//2.可以从socket对象中获取一个输出流对象OutputStream os = socket.getOutputStream();//3.使用输出流对象发送数据os.write("你好帅".getBytes());//4.释放资源socket.close();os.close();}
    }

​ IO流是连接通道里的流,所以把连接通道关了之后,数据流就会自动关闭,所可以直接关闭通过socket连接。

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

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

相关文章

使用 Go 语言与 Elasticsearch 实现高效搜索服务

使用 Go 语言与 Elasticsearch 实现高效搜索服务 什么是 Elasticsearch Elasticsearch 是一个基于 Apache Lucene 构建的分布式搜索引擎,能够存储、搜索和分析大量数据。它具有高可扩展性、快速的搜索速度,支持全文检索、多字段查询和近实时数据分析。…

mysql/doris 计算两个时间相差n天n时n分示范

mysql/doris 计算两个时间相差n天n时n分示范 两个时间:so.create_time,so.update_time CONCAT(FLOOR(DATEDIFF(HOUR ,so.create_time,so.update_time)/24),天,DATEDIFF(HOUR ,so.create_time,so.update_time)%24,时,DATEDIFF(MINUTE ,so.create_time,so…

自动猫砂盆“智商税”还是“真香”?2024自动猫砂盆保姆级干货

平时忙着上班,或者一遇到出差就要离家四五天,没办法给毛孩子的猫砂盆铲屎,导致粪便堆积太久。很多铲屎官也了解到有自动猫砂盆这种东西,但是生怕是智商税,总觉得忍忍手铲也可以,要知道,猫咪的便…

如何在阿里云一键部署FlowiseAI

什么是FlowiseAI FlowiseAI 是一个开源的低代码开发工具,专为开发者构建定制的语言学习模型(LLM)应用而设计。 通过其拖放式界面,用户可以轻松创建和管理AI驱动的交互式应用,如聊天机器人和数据分析工具。 它基于Lang…

网络安全-Morpheus

NVIDIA Morpheus 文章目录 前言一、简介1. NVIDIA Morpheus 是什么?二、优势1. 深入了解 NVIDIA Morpheus 的优势高管借助全面的数据可见性,实时检测威胁利用生成式 AI 提高效率提升性能,降低成本开发者轻松开发和部署功能丰富,灵活性强实时遥测三、用例Morpheus 用例四、A…

通过观测云 DataKit Extension 接入 AWS Lambda 最佳实践

前言 AWS Lambda 是一项计算服务,使用时无需预配置或管理服务器即可运行代码。AWS Lambda 只在需要时执行代码并自动缩放。借助 AWS Lambda,几乎可以为任何类型的应用程序或后端服务运行代码,而且无需执行任何管理。 Lambda Layer 是一个包…

AI绘画,AI生成图片

分享一个可以免费使用的AI生成图片的网站: https://openart.aihttps://openart.ai/create 1、登陆后点击右上角create 2、在创建页面左侧输入描述文案,下面调整生成图片张数,点击create,右边即可生成 我这里输入了在吃麦当劳的超…

笔记||VUE3

侦听器 | Vue.js (vuejs.org) 模板引用 | Vue.js (vuejs.org)

Java初阶~~四种内部类总结

文章目录 1.内部类的分类2.局部内部类2.1.基本语法2.2就近原则的理解 3.匿名内部类3.1基于接口的匿名内部类3.2基于普通类的匿名内部类3.3基于抽象类的匿名内部类3.4匿名内部类的细节3.5匿名内部类实践3.5.1作为实参进行传递3.5.2实践案例 4.成员内部类4.1基本介绍4.2外部类&am…

api测试和接口测试的区别

API测试和接口测试是软件测试中一个非常重要的领域,尤其是在当前Web应用程序和移动应用程序的发展中。虽然它们都测试了Web服务的功能,但是二者在测试方法和测试实施方面存在很大的差异。本文将介绍API测试和接口测试之间的主要区别 API测试的主要关注点…

【LLM论文日更】| BGE经典论文-CPACK

论文:https://arxiv.org/pdf/2309.07597代码:GitHub - FlagOpen/FlagEmbedding: Retrieval and Retrieval-augmented LLMs机构:BAAI领域:embedding model发表:SIGIR 2024 ​ 研究背景 研究问题:这篇文章…

MySQL插入优化-性能对比

插入优化主要包括: 批量插入条数据,而不是单个记录逐条插入。手动提交事务,避免自动提交事务带来的额外开销。使用load命令从本地文件导入。 性能对比 创建数据库表 CREATE TABLE if not exists tb_sku ( id int(20) …

防汛可视化系统:提升应急响应能力

通过图扑可视化系统实时监测水情、雨情和地理数据,辅助防汛决策与调度,提供直观的风险预警信息,从而优化资源分配,提高防汛应急响应效率。

​​​​​​​如何使用LTX Studio生成故事插画

在这个科技飞速发展的时代,人工智能已经成为创意领域的重要工具。LTX Studio 是一个强大的平台,可以帮助你将文字故事生成精美的插画。以下是详细的步骤,教你如何使用LTX Studio 生成故事插画。 生成prompt、: 使用copilot实现&…

SD2.0 Specification之SD卡寄存器(Card Register)

文章目录 CID(Card IDentification)RCA(Relative Card Address)DSR(Driver Stage Register)CSD(Card-Specific Data)SCR(SD CARD Configuration Register)OCR(Operation Conditions Register)SSR(SD Status Register)CSR(Card Status Register) 本文章主要讲解SD2.0的各个卡寄存…

望繁信科技成功签约国显科技 流程挖掘助力制造业智造未来

近日,上海望繁信科技有限公司(简称“望繁信科技”)成功与深圳市国显科技有限公司(简称“国显科技”)达成合作。国显科技作为全球领先的TFT-LCD液晶显示及Mini/Micro LED显示产品供应商,致力于为笔记本、手机…

Linux云计算 |【第四阶段】RDBMS2-DAY4

主要内容: MHA概述、部署MHA集群 一、MHA概述 1、MHA简介 MHA(Master High Availability)是一款开源的MySQL的高可用程序,由日本DeNA公司youshimaton开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的…

Jenkins pipeline语法笔记

Jenkins pipeline 简介Jenkins Pipeline 优势DSL 是什么 pipeline支持两种语法:声明式pipeline语法:Pipelineagent Pipeline 声明式语法DeclarativeenvironmentoptionsparameterstriggerstoolsinputwhenParallel Pipeline Scripted语法流程控制Declarati…

罗永浩力荐格行随身WiFi,背后原因竟是...你绝对想不到!

一、罗永浩的“严选”哲学 虽然罗永浩做的是直播带货,但是他的形象与其他头部主播之间有着明显的不同。那些头部主播,都可以统称为“电商主播”,他们与那些淘宝店、京东店里直播的商家本质是一样的,只有流量和名气大小不同罢了。…

SpringBoot开发部署(热部署+常规部署+Docker部署)

开发热部署 SpringBoot模板引擎的页面默认是开启缓存的,如果修改了页面,则刷新页面是得不到修改后的页面的 在application.properties中关闭模板引擎缓存 Thymeleaf spring.thymeleaf.cachefalseFreeMarker spring.freemarker.cachefalseGroovy spring…