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客户端
功能监听指定端口,等待客户端连接,处理客户端发送的数据连接到服务器,发送数据到服务器
主要类ServerSocketSocket
创建方式ServerSocket ss = new ServerSocket(port);Socket s = new Socket(host, port);
监听端口通过ServerSocket构造函数指定无需监听,连接到服务器的指定端口
数据接收使用ServerSocketaccept()方法等待客户端连接,然后获取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字符串,

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

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

相关文章

RocketMQ源码学习笔记:Broker接受消息和发送消息

这是本人学习的总结,主要学习资料如下 马士兵教育rocketMq官方文档 目录 1、Overview2、技术亮点2.1、消息写入时的自旋锁和可重入锁2.2、堆外内存机制2.2.1、Overview2.2.2、源码2.2.2.1、开启堆外内存的条件2.2.2.2、堆外内存的初始化2.2.2.3、写消息到堆外内存2…

MAS0902量产工具分享,MAS0902A开卡教程,MAS0901量产工具下载

MAS0902和MAS1102都是基于SATA3.2技术开发的DRAM-less SSD控制芯片,简单来说就是SATA协议无缓存主控。下面是我摸索的麦光黑金300 240G SSD开卡修复简易教程,也就是MAS0902量产过程: 注意:开卡转接线必须要用ASM1153E或JMS578主控…

(1)std::trhead的回调,中频繁发送信号,会导致qt的事件循环处理不过来吗

在Qt中,事件循环是负责处理所有事件和信号的核心机制。事件循环会不断地检查是否有待处理的事件,并且调度相应的事件处理器。在标准模板库(STL)的std::thread中使用回调函数来频繁发送信号到Qt的事件循环中,确实可能会导致性能问题,尤其是在高频率信号发送的情况下。 当…

鉴权开发框架Django REST framework的应用场景

目录 一、鉴权开发框架介绍二、Django REST framework是什么三、如何实现认证、权限与限流功能四、Django REST framework的应用场景 一、鉴权开发框架介绍 鉴权开发框架是一种用于实现身份验证和授权的软件开发工具。它可以帮助开发者快速构建安全、可靠的身份验证和授权系统…

24级中国科学技术大学843信号与系统考研分数线,中科大843初复试科目,参考书,大纲,真题,苏医工生医电子信息与通信工程。

(上岸难度:★★★★☆,考试大纲、真题、经验帖等考研资讯和资源加群960507167/博睿泽电子信息通信考研咨询:34342183) 一、专业目录及考情分析 说明: ①复试成绩:满分100分。上机满分50分,面试满分150分,复试成绩(上机…

ros1仿真导航机器人 基础传感器数据读取

仅为学习记录和一些自己的思考&#xff0c;不具有参考意义。 1 仿真环境 gazebo、rviz、ros1 2 机器人模型 <?xml version"1.0"?> <robot name"wpb_home_gazebo"><link name"base_footprint"><visual><origin …

C++进阶

C进阶 一、细节1.cout与输出缓冲区2.constexpr3.NULL和nullptr是不同的类型4.关于inline5.函数杂合用法6.const char*、char const*、char * const7.进程地址空间&#xff0c;所谓静态区常量区不准8.位运算9.多态9.1 内存切片9.2 转型9.3 构造函数和析构函数里是静态绑定9.4 dy…

【云服务-3】公网IP和私有IP

IP地址的作用&#xff1f; IP地址的作用: 标识设备身份: IP地址能够唯一标识网络上的每一个设备,就像是设备的"身份证"。路由寻址: IP地址可以用于确定数据包的传输路径,从而将数据包准确送达目的地。网络互连: IP地址允许不同网络之间的设备进行通信和数据交换。 …

DP:解决路径问题

文章目录 二维DP模型如何解决路径问题有关路径问题的几个问题1.不同路径2.不同路径Ⅱ3.下降路径最小和4.珠宝的最高价值5.地下城游戏 总结 二维DP模型 二维动态规划&#xff08;DP&#xff09;模型是一种通过引入两个维度的状态和转移方程来解决复杂问题的技术。它在许多优化和…

docker容器内为什么能解析宿主机的hosts文件

Docker容器可以通过特定的网络设置来解析宿主机的hosts文件&#xff0c;这是因为Docker容器在创建网络时&#xff0c;会自动将宿主机的DNS配置信息传递给容器。 当你启动一个Docker容器时&#xff0c;如果没有指定任何DNS相关的选项&#xff0c;Docker默认会使用宿主机的DNS配…

Hi3861 OpenHarmony嵌入式应用入门--LiteOS MessageQueue

CMSIS 2.0接口中的消息&#xff08;Message&#xff09;功能主要涉及到实时操作系统&#xff08;RTOS&#xff09;中的线程间通信。在CMSIS 2.0标准中&#xff0c;消息通常是通过消息队列&#xff08;MessageQueue&#xff09;来进行处理的&#xff0c;以实现不同线程之间的信息…

JS逆向:由 words 、sigBytes 引发的一系列思考与实践

【作者主页】&#xff1a;小鱼神1024 【擅长领域】&#xff1a;JS逆向、小程序逆向、AST还原、验证码突防、Python开发、浏览器插件开发、React前端开发、NestJS后端开发等等 在做JS逆向时&#xff0c;你是否经常看到 words 和 sigBytes 这两个属性呢&#xff0c;比如&#xff…

【机器学习300问】135、决策树算法ID3的局限性在哪儿?C4.5算法做出了怎样的改进?

ID3算法是一种用于创建决策树的机器学习算法&#xff0c;该算法基于信息论中的信息增益概念来选择最优属性进行划分。信息增益是原始数据集熵与划分后数据集熵的差值&#xff0c;熵越小表示数据集的纯度越高。有关ID3算法的详细步骤和算法公式在我之前的文章中谈到&#xff0c;…

探索 Electron:将 Web 技术带入桌面应用

Electron是一个开源的桌面应用程序开发框架&#xff0c;它允许开发者使用Web技术&#xff08;如 HTML、CSS 和 JavaScript&#xff09;构建跨平台的桌面应用程序&#xff0c;它的出现极大地简化了桌面应用程序的开发流程&#xff0c;让更多的开发者能够利用已有的 Web 开发技能…

关于Java依赖版本升级的相关问题解决(持续更新)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

VMware Workstation 安装 Centos 虚拟机

1. 下载 VMware Workstation 直接上网找官网下载即可 2. 下载 Centos 镜像 阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 3.打开 VMware 创建虚拟机 3.1点击创建虚拟机 3.2 选择自定义安装 3.3 选择使用 Workstation 的版本 版本越高兼容性越低但性能越好&#xff0c;一…

Linux磁盘分区方案

如下&#xff1a; /boot 分区&#xff1a;存放Linux系统启动有关程序&#xff0c;建议大小100MB。 /usr 分区&#xff1a;存放Linux系统中的应用程序&#xff0c;数据较多&#xff0c;建议大于3GB。 /var 分区&#xff1a;存放Linux系统中经常变化的数据及日志文件&#xff0c…

智慧校园-实训管理系统总体概述

智慧校园实训管理系统&#xff0c;专为满足高等教育与职业教育的特定需求而设计&#xff0c;它代表了实训课程管理领域的一次数字化飞跃。此系统旨在通过革新实训的组织结构、执行流程及评估标准&#xff0c;来增强学生的实践操作技能和教师的授课效率&#xff0c;为社会输送具…

Leetcode 701:二叉搜索树的插入操作

给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和要插入树中的值 value &#xff0c;将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 &#xff0c;新值和原始二叉搜索树中的任意节点值都不同。 //遍历二叉搜索树&#xff0c;遇到空结点&#…

python如何把一个函数的返回值,当成这个函数的参数值

python如何把一个函数的返回值&#xff0c;当成这个函数的参数值 1. 递归调用 递归是一种函数自己调用自己的方法。在递归调用中&#xff0c;你可以将前一次调用的返回值作为下一次调用的参数。 def recursive_function(x):# 函数逻辑if 条件满足:return 结果else:return rec…