java TCP服务器与客户端通信示例
目录
背景:
TCP服务代码解析:
TCP服务器的代码:
服务器程序的工作流程:
TCP客户端代码解析 :
TCP客户端代码:
客户端工作流程:
总结:
背景:
如何使用Java编程语言实现一个简单的TCP服务器和客户端。那么TCP是什么?TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。下面将编写两个简单的Java程序来展示TCP通信的基本原理。
TCP服务代码解析:
TCP服务器的代码:
import java.net.*;
import java.io.*; public class TCPServer { public static void main(String[] args) throws Exception { // 创建一个ServerSocket对象,监听6666端口 ServerSocket ss = new ServerSocket(6666); // 无限循环,等待客户端连接 while (true) { // 当有客户端连接时,accept()方法返回一个新的Socket对象 Socket s = ss.accept(); // 从Socket中获取输入流,并使用DataInputStream进行封装 DataInputStream dis = new DataInputStream(s.getInputStream()); // 从输入流中读取UTF字符串并打印 String message = dis.readUTF(); System.out.println("Received from client: " + message); // 关闭流和Socket连接 dis.close(); s.close(); } }
}
服务器程序的工作流程:
1.创建一个ServerSoket对象,监听指定的端口(这里6666)
2.进入无限循环,等待客户端的连接
3.当有客户端时,accept()方法会返回一个新的Socket独享
4.从这个Socket对象中获取输入流,并使用DataInputStream进行封装
5.读取输入流中的UTF字符串,并打印到控制台
6.关闭输入流和Socket连接
TCP客户端代码解析 :
TCP客户端代码:
import java.net.*;
import java.io.*; public class TCPClient { public static void main(String[] args) throws Exception { // 创建一个Socket对象,连接到服务器的指定IP和端口 Socket s = new Socket("127.0.0.1", 6666); // 从Socket中获取输出流,并使用DataOutputStream进行封装 OutputStream os = s.getOutputStream(); DataOutputStream dos = new DataOutputStream(os); // 向输出流中写入UTF字符串 dos.writeUTF("hello server!"); // 刷新输出流,确保数据被发送 dos.flush(); // 关闭输出流和Socket连接 dos.close(); s.close(); }
}
客户端工作流程:
1.创建一个Socket对象,连接到服务器的指定IP和端口(这里是127.0.0.1和666)
2.从这个Socket对象中获取输出流,并使用DataOuptStream进行封装
3.向输出流中写入UTF字符串
3.刷新输出流,确保数据被发送到服务器
5.关闭输出流和Socket连接
总结:
| 类别 | TCP服务器 | TCP客户端 |
|---|---|---|
| 功能 | 监听指定端口,等待客户端连接,处理客户端发送的数据 | 连接到服务器,发送数据到服务器 |
| 主要类 | ServerSocket | Socket |
| 创建方式 | ServerSocket ss = new ServerSocket(port); | Socket s = new Socket(host, port); |
| 监听端口 | 通过ServerSocket构造函数指定 | 无需监听,连接到服务器的指定端口 |
| 数据接收 | 使用ServerSocket的accept()方法等待客户端连接,然后获取Socket对象的InputStream进行读取 | 使用Socket对象的getOutputStream()获取输出流,然后写入数据 |
| 数据发送 | 无需直接发送数据,而是从客户端接收数据 | 使用Socket对象的getOutputStream()获取输出流,并使用DataOutputStream或其他包装类写入数据 |
| 数据读取 | 使用Socket对象的getInputStream()获取输入流,并使用DataInputStream或其他包装类读取数据 | 无需直接读取数据,而是将数据发送到服务器 |
| 关闭连接 | 关闭Socket对象的输入流和Socket本身 | 关闭Socket对象的输出流和Socket本身 |
| 注意事项 | 1.需要处理并发连接(例如使用多线程) 2.需要处理可能的异常和错误 3.可能需要设置超时和缓冲区大小 | 1.需要确保服务器正在运行并监听指定端口 2.需要处理可能的异常和错误 3.可能需要设置超时和缓冲区大小 |
通过上面的示例,Java中TCP服务器和客户端的基本实现。服务监听一个端口,等待客户端的连接,当客户端连接后,双方可以通过Socket 对象进行数据的读写,这里使用DataInputStream和DataOutputeam来封装输入流和输出流,以便更好的读取和写入UTF字符串,
相关文章:
java TCP服务器与客户端通信示例
目录 背景: TCP服务代码解析: TCP服务器的代码: 服务器程序的工作流程: TCP客户端代码解析 : TCP客户端代码: 客户端工作流程: 总结: 背景: 如何使用Java编程语言实现一个简单的TCP服务器和客户端。那么TCP是什么?TCP(Transmission Control Protocol&…...
【C++】构造函数和析构函数
目录 对象初始化-构造函数构造函数的分类构造函数的调用拷贝构造的应用构造函数调用规则深拷贝和浅拷贝初始化列表类对象作为类成员静态成员 对象释放-析构函数 对象初始化-构造函数 构造函数是类实例化的时候会自动调用的初始化函数,如果用户不写编译器会提供一个…...
Docker Compose:多容器应用的管理利器
在现代应用开发中,微服务架构已成为主流。管理和编排多个容器应用变得至关重要。Docker Compose 是一个强大的工具,通过一个简单的 YAML 文件定义和运行多容器应用。本文将详细介绍 Docker Compose 的基本概念、安装、用法以及一个实际的示例,…...
Leetcode - 133双周赛
目录 一,3190. 使所有元素都可以被 3 整除的最少操作数 二,3191. 使二进制数组全部等于 1 的最少操作次数 I 三,3192. 使二进制数组全部等于 1 的最少操作次数 II 四,3193. 统计逆序对的数目 一,3190. 使所有元素都…...
C++总结
...
汽车免拆诊断案例 | 2016 款吉利帝豪EV车无法加速
故障现象 一辆2016款吉利帝豪EV车,累计行驶里程约为28.4万km,车主反映车辆无法加速。 故障诊断 接车后路试,行驶约1 km,踩下加速踏板,无法加速,车速为20 km/h左右,同时组合仪表上的电机及控制…...
前端开发之webpack
安装与入门超详细!webpack入门教程(一)-腾讯云开发者社区-腾讯云...
将内容复制到剪贴板?分享 1 段优质 JS 代码片段!
大家好,我是大澈! 本文约 600 字,整篇阅读约需 1 分钟。 每日分享一段优质代码片段。 今天分享一段 JS 代码片段,使用 Clipboard API 实现将内容复制到剪贴板。 老规矩,先阅读代码片段并思考,再看代码解析…...
MAS0902量产工具分享,MAS0902A开卡教程,MAS0901量产工具下载
MAS0902和MAS1102都是基于SATA3.2技术开发的DRAM-less SSD控制芯片,简单来说就是SATA协议无缓存主控。下面是我摸索的麦光黑金300 240G SSD开卡修复简易教程,也就是MAS0902量产过程: 注意:开卡转接线必须要用ASM1153E或JMS578主控…...
从我邮毕业啦!!!
引言 时间过的好快,转眼间就要从北邮毕业了,距离上一次月度总结又过去了两个月,故作本次总结。 PS: https://github.com/WeiXiao-Hyy/blog整理了后端开发的知识网络,欢迎Star! 毕业🎓 6月1号完成了自己的…...
gemini 1.5 flash (node项目)
https://www.npmjs.com/package/google/generative-ai https://ai.google.dev/pricing?hlzh-cn https://aistudio.google.com/app/apikey https://ai.google.dev/gemini-api/docs/models/gemini?hlzh-cn#gemini-1.5-flash https://ai.google.dev/gemini-api/docs/get-started…...
在线字节大端序小端序转换器
具体请前往:在线字节大端序小端序转换器...
css_17_背景属性鼠标属性
一.背景属性 -属性值:background-color(设置背景颜色) 默认背景颜色是 transparent。 -属性值:background-image(设置背景图片) url(图片的地址) -属性值:background-re…...
Python hash编码(go hash编码)
id"中国人" 首先,go语言hash: import (mmh3 "murmurhash3") mmh3.Murmurhash3([]byte(id)) 对应到Python hash编码,可以直接使用mmh3 import mmh3 mmh3.hash(id,signedFalse) 其源码可以表示为 def sum32WithSeed(datas, seed…...
004 插入排序(lua)
文章目录 123 1 -- Lua中没有类和方法的概念,所以我们将所有功能都写在一个脚本中 -- 交换数组中两个元素的功能 local function swap(arr, i, j) local temp arr[i] arr[i] arr[j] arr[j] temp end -- 插入排序算法的实现 local function insertionS…...
计算机网络 —— 基本概念
基本概念 1. 通信协议2. 面向连接 v.s. 面向无连接3. 电路交换 v.s. 分组交换4. 单工通信 v.s. 双工通信 1. 通信协议 通信协议就是计算机与计算机之间通过网络实现通信时事先达成的一种“约定”。这种“约定”使那些由不同厂商的设备、不同的CPU 以及不同的操作系统组成的计算…...
高精度除法的实现
高精度除法与高精度加法的定义、前置过程都是大致相同的,如果想了解具体内容,可以移步至我的这篇博客:高精度加法计算的实现 在这里就不再详细讲解,只讲解主体过程qwq 主体过程 高精度除法的原理和小学学习的竖式除法是一样的。 …...
STM32CUBEMX配置USB虚拟串口
STM32CUBEMX配置USB虚拟串口 cubemx上默认配置即可。 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 配置完后生成工程,主要就是要知道串口的收发接口就行了。 发送:CDC_Transmit_FS(),同时记得包含头文件#include “…...
安卓开发中margin和padding的区别
在 Android 开发中,margin 和 padding 都是用来定义视图(View)的空间属性,但它们的作用和应用场景有所不同: Margin(外边距): Margin 是视图与其他视图之间的空间。它定义了视图之间…...
Symfony事件调度系统:掌控应用程序生命周期的钥匙
Symfony事件调度系统:掌控应用程序生命周期的钥匙 引言 Symfony是一个高度灵活的PHP框架,用于构建各种规模的Web应用程序。它的核心特性之一是事件调度系统,该系统允许开发者在应用程序的生命周期中触发和监听事件。这种机制为开发者提供了…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...
关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
Spring Security 认证流程——补充
一、认证流程概述 Spring Security 的认证流程基于 过滤器链(Filter Chain),核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤: 用户提交登录请求拦…...
数据结构:泰勒展开式:霍纳法则(Horner‘s Rule)
目录 🔍 若用递归计算每一项,会发生什么? Horners Rule(霍纳法则) 第一步:我们从最原始的泰勒公式出发 第二步:从形式上重新观察展开式 🌟 第三步:引出霍纳法则&…...
