【JavaSE】Java基础语法(四十一):TCP通信程序

news2024/11/26 0:43:01

文章目录

  • 1. TCP发送数据
  • 2. TCP接收数据【应用】
  • 3. TCP程序练习
  • 4. TCP程序文件上传练习【应用】


在这里插入图片描述

1. TCP发送数据

  • Java中的TCP通信

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

  • 相关方法
    在这里插入图片描述

  • 示例代码

public class ClientDemo {
	public static void main(String[] args) throws IOException {
		//创建客户端的Socket对象(Socket)
		//Socket(String host, int port) 创建流套接字并将其连接到指定主机上的指定端口号
		Socket s = new Socket("127.0.0.1",10000);
		//获取输出流,写数据
		//OutputStream getOutputStream() 返回此套接字的输出流
		OutputStream os = s.getOutputStream();
		os.write("hello,tcp,我来了".getBytes());
		//释放资源
		s.close();
	}
}

2. TCP接收数据【应用】

  • 构造方法: 创建绑定到指定端口的服务器套接字
ServletSocket(int port)
  • 相关方法:监听要连接到此的套接字并接受它
Socket accept() 
  • 注意事项

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

  • 三次握手和四次挥手

    • 三次握手
    • 四次挥手

3. TCP程序练习

案例需求
客户端:发送数据,接受服务器反馈
服务器:收到消息后给出反馈

案例分析
客户端创建对象,使用输出流输出数据
服务端创建对象,使用输入流接受数据
服务端使用输出流给出反馈数据
客户端使用输入流接受反馈数据

代码实现

// 客户端
public class ClientDemo {
	public static void main(String[] args) throws IOException {
		Socket socket = new Socket("127.0.0.1",10000);
		OutputStream os = socket.getOutputStream();
		os.write("hello".getBytes());
		// os.close();如果在这里关流,会导致整个socket都无法使用
		socket.shutdownOutput();//仅仅关闭输出流.并写一个结束标记,对socket没有任何
		影响
		BufferedReader br = new BufferedReader(new
		InputStreamReader(socket.getInputStream()));
		String line;
		while((line = br.readLine())!=null){
			System.out.println(line);
		}
		br.close();
		os.close();
		socket.close();
	}
}

// 服务器
public class ServerDemo {
	public static void main(String[] args) throws IOException {
		ServerSocket ss = new ServerSocket(10000);
		Socket accept = ss.accept();
		InputStream is = accept.getInputStream();
		int b;
		while((b = is.read())!=-1){
			System.out.println((char) b);
		}
		System.out.println("看看我执行了吗?");
		BufferedWriter bw = new BufferedWriter(new
		OutputStreamWriter(accept.getOutputStream()));
		bw.write("你谁啊?");
		bw.newLine();
		bw.flush();
		bw.close();
		is.close();
		accept.close();
		ss.close();
	}
}

4. TCP程序文件上传练习【应用】

案例需求
客户端:数据来自于本地文件,接收服务器反馈
服务器:接收到的数据写入本地文件,给出反馈

案例分析
- 创建客户端对象,创建输入流对象指向文件,每读一次数据就给服务器输出一次数据,输出
结束后使用shutdownOutput()方法告知服务端传输结束
- 创建服务器对象,创建输出流对象指向文件,每接受一次数据就使用输出流输出到文件中,
传输结束后。使用输出流给客户端反馈信息
- 客户端接受服务端的回馈信息

相关方法
在这里插入图片描述

代码实现

// 客户端
public class ClientDemo {
	public static void main(String[] args) throws IOException {
		Socket socket = new Socket("127.0.0.1",10000);
		//是本地的流,用来读取本地文件的.
		BufferedInputStream bis = new BufferedInputStream(new
		FileInputStream("socketmodule\\ClientDir\\1.jpg"));
		//写到服务器 --- 网络中的流
		OutputStream os = socket.getOutputStream();
		BufferedOutputStream bos = new BufferedOutputStream(os);
		int b;
		while((b = bis.read())!=-1){
			bos.write(b);//通过网络写到服务器中
		}
		bos.flush();
		//给服务器一个结束标记,告诉服务器文件已经传输完毕
		socket.shutdownOutput();
		BufferedReader br = new BufferedReader(new
		InputStreamReader(socket.getInputStream()));
		String line;
		while((line = br.readLine()) !=null){
			System.out.println(line);
		}
		bis.close();
		socket.close();
	}
}
// 服务器
public class ServerDemo {
	public static void main(String[] args) throws IOException {
		ServerSocket ss = new ServerSocket(10000);
		Socket accept = ss.accept();
		//网络中的流,从客户端读取数据的
		BufferedInputStream bis = new
		BufferedInputStream(accept.getInputStream());
		//本地的IO流,把数据写到本地中,实现永久化存储
		BufferedOutputStream bos = new BufferedOutputStream(new
		FileOutputStream("socketmodule\\ServerDir\\copy.jpg"));
		int b;
		while((b = bis.read()) !=-1){
			bos.write(b);
		}
		BufferedWriter bw = new BufferedWriter(new
		OutputStreamWriter(accept.getOutputStream()));
		bw.write("上传成功");
		bw.newLine();
		bw.flush();
		bos.close();
		accept.close();
		ss.close();
	}
}


在这里插入图片描述

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

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

相关文章

Android 易忽略小知识

1.设置hint的字体大小 在Android xml文件中并没有直接设置hint字体大小的属性。如果hint文字的大小不希望跟正常字体的大小一样,就只能通过代码的方式来进行处理。 提供两种方式: //设置"用户名"提示文字的大小 EditText etUserName (Ed…

教育硬件“老玩家”进入智能手机新赛道,小度胜算几何?

从5月8日有传言称“百度旗下小度将进军智能手机市场”,到5月17日小度官宣将推出旗下新物种产品——小度青禾学习手机,小度在短短10天时间成为市场关注的焦点。 而5月22日,其也拿出了真正的成果,这部专门为青少年打造的学习手机正…

MySQL——在Linux环境下安装(在线安装)

MySQL的安装(在线安装) mysql的安装并不是比赛的内容,所以我们用比较方便的在线安装的方法,比起安装,我们更要知道如何去使用: 首先看一下自己有没有安装MySQL的服务,或者自己的服务器上有没有…

application.yml中的配置怎么写

1.问题 application.yml中可以做很多组件的配置,比如redis,mongo, 但是这些的key是什么,value怎么写呢? 2.分析问题 为了搞清楚这个问题,我们需要先了解application.yml中的配置是怎么加载的,以MongoProperties配置加载为例, 在Spring Boot中,可以使用application.y…

【OJ比赛日历】快周末了,不来一场比赛吗? #06.03-06.09 #18场

CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…)比赛。本账号会推送最新的比赛消息,欢迎关注! 以下信息仅供参考,以比赛官网为准 目录 2023-06-03(周六) #7场比赛2023-06-04…

【数据结构】---二叉树类型部分练习解析让你更深程度了解二叉树

文章目录 前言🌟一、第一种:二叉树性质类型:🌏1.1 第一题:💫1.1.1 理论:💫1.1.2 图解:💫1.1.3 解析: 🌏1.2 第二题:&#…

小明给大家分享几个CSDN涨粉小技巧,期待大家多多涨粉

今天和大家一起来聊聊CSDN涨粉相关几个的技巧,希望对热爱技术分享,并且想快速涨粉提升自身曝光度的朋友们提供一些经验,本文都是自己的一些想法,有说的不对的地方希望大家指正! 一、个人介绍 我叫小明,我的…

京东国际销售数据查询(京东国际行业/品牌数据分析)

根据京东平台官方数据显示,今年京东国际的贡献力度也高于以往。 京东618开门红5分钟,京东国际成交额已突破去年开门红前两小时的成交额,跨境酒水、跨境手机通讯、跨境箱包皮具等3个品类成交额同比增长超100%。,开门5分钟&#xff…

Unreal5 第三人称射击游戏 角色基础制作2

接上一篇 Unreal5 第三人称射击游戏 角色基础制作1 角色蹲伏效果 上面是需要的操作映射,蹲伏实现,首先要开启相应功能,你需要在角色移动组件上面开启可蹲伏 蹲伏还有一些其它设置,比如蹲下角色高度,蹲下以后行走的…

MySQL基础2

一.常见数据类型 数值类型: TINYINT:占用1字节,默认为有符号 BIT(M):位类型:M指定位数,默认值为1,范围为1-64,bit类型在显示时,按照ASCII码对应的值进行显示。 FLOAT[(M,…

华为OD机试(41-60)老题库解析Java源码系列连载ing

华为OD机试算法题新老题库练习及源码 41.寻找相同子串42.找出经过特定点的路径长度43.全量和已占用字符集44.密钥格式化45.数字字符串组合倒序 郑重声明: 1.博客中涉及题目为网上搜索而来,若侵权,请联系作者删除。 源码内容为个人原创&#…

git --- git merge用法

1 git merge介绍 在Git中,合并是一个连接分叉历史的过程。它将两个或多个开发历史连接在一起。git merge命令可以帮助你把git分支创建的数据整合到一个分支中。git merge会将一系列的提交关联到一个统一的历史。 在上图中,有两个分支 master 和 feature。我们可以看到,我们…

《priority_queue》

本文主要介绍优先级队列的使用,以及一个TOPK问题的OJ 文章目录 一、priority_queue的介绍二、priority_queue的使用三、[数组中第k个大的元素](https://leetcode.cn/problems/kth-largest-element-in-an-array/) 一、priority_queue的介绍 优先队列是一种容器适配器…

代码创造童话--Python为六一儿童节送专属礼物

前言: Hello大家好,我是Dream。 六一儿童节到啦,祝所有的朋友们六一儿童节快乐! 在这个节日里,孩子们可以接受父母、老师、社会各界人士的关爱和祝福,同时也可以享受到各种各样的礼物和活动。Python作为一门…

第十五篇、基于Arduino uno,获取mpu6050三轴加速度、角速度、温度的数据——结果导向

0、结果 说明:先来看看串口调试助手显示的结果,第一个值是温度值,第二个值是X轴的加速度,第三个值是Y轴的加速度,第四个值是Z轴的加速度,第五个值是X轴的角速度,第六个值是Y轴的角速度&#xff…

C++库函数——string类

1. 简介 ①什么是string类 源文档 译: 1. 字符串是表示字符序列的类 2. 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特性。 3. string 类是使用 char( 即作为它…

【六一】90后的你们还记得年少时的梦吗?还记得你们当初追的奥特曼吗?现在就让我们一起回味我们逝去的曾经吧!

迎面走来的是我们从未正式出过剧集,并附有“反派”盛名的大哥!佐~~菲~~! 还记得第一个登场,第一个进入我们的视野的那位吗?没错,那就是奥特曼 我的最爱~~~~~赛文! 一度以为,曾经的那…

Bellhop 绘制传播损失

文章目录 前言一、相干传播损失(TL)基本算例1、环境文件2、绘制相干传播损失 二、相干、半相干和非相干传播损失(TL) 前言 上文我们讲述了 Bellhop 的使用以及使用 bellhop 绘制了声速剖面、声线轨迹及本证声线,本文我…

【SpringMVC】入门案例

前言: SpringMVC是隶属于Spring框架的一部分,主要是用来进行Web开发,是对Servlet进行了封装。 对于SpringMVC我们主要学习如下内容: SpringMVC简介请求与响应REST风格SSM整合(注解版)拦截器 SpringMVC是处于Web层的框架,所以其主要的作用…

用户验证FTP实验

用户FTP实验 目录 匿名用户验证: 本地用户验证: 本地用户访问控制: 匿名用户验证: 例:(前提配置,防火墙关闭,yum安装,同模式vmware11) 现有一台计算机huy…