Java网络编程入门
在现代软件开发中,网络编程是一项不可或缺的技能。Java提供了强大的网络编程支持,使得开发者能够轻松地创建网络应用程序。今天将介绍Java中的网络编程基础,重点讲解Socket和ServerSocket类的使用。
什么是Socket?
Socket是网络通信的基本组件,它为应用程序提供了一个与网络进行交互的接口。通过Socket,程序可以发送和接收数据,类似于文件操作的方式。Socket的工作原理可以简单概括为:
- 建立连接:客户端通过Socket连接到服务器。
- 数据传输:一旦连接建立,双方可以通过输入输出流进行数据的发送和接收。
- 关闭连接:通信完成后,Socket会被关闭以释放资源。
什么是ServerSocket?
ServerSocket是专门用于服务器端的Socket,它负责监听客户端的连接请求。ServerSocket的主要功能包括:
- 监听端口:在指定的端口上等待客户端的连接请求。
- 接受连接:当有客户端请求连接时,ServerSocket会返回一个新的Socket对象,用于与该客户端进行通信。
Socket与ServerSocket的基本用法
1. 服务器端实现
下面是一个简单的服务器端代码示例,使用ServerSocket监听客户端连接并处理消息。
import java.io.*;
import java.net.*;public class SimpleServer {public static void main(String[] args) {// 创建ServerSocket,监听8888端口try (ServerSocket serverSocket = new ServerSocket(8888)) {System.out.println("服务器启动,等待客户端连接...");// 接受客户端连接Socket clientSocket = serverSocket.accept();System.out.println("客户端已连接:" + clientSocket.getInetAddress());// 创建输入流和输出流BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);// 读取客户端发送的消息String message = in.readLine();System.out.println("收到消息:" + message);// 向客户端发送回复out.println("服务器已收到消息:" + message);} catch (IOException e) {e.printStackTrace();}}
}
服务器端代码解析
- 创建ServerSocket:在
try语句中创建ServerSocket对象,指定监听的端口(8888)。- 等待客户端连接:调用
accept()方法,服务器会阻塞,直到有客户端连接。- 创建输入输出流:使用
InputStream和OutputStream来接收和发送数据。- 读取消息:通过
BufferedReader读取客户端发送的消息。- 发送回复:使用
PrintWriter向客户端发送确认消息。
2. 客户端实现
下面是一个简单的客户端代码示例,连接到服务器并发送消息。
import java.io.*;
import java.net.*;public class SimpleClient {public static void main(String[] args) {// 创建Socket,连接到服务器的8888端口try (Socket socket = new Socket("127.0.0.1", 8888)) {// 创建输入流和输出流PrintWriter out = new PrintWriter(socket.getOutputStream(), true);BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));// 向服务器发送消息out.println("Hello, Server!");// 读取服务器的回复String response = in.readLine();System.out.println("服务器回复:" + response);} catch (IOException e) {e.printStackTrace();}}
}
客户端代码解析
- 创建Socket:指定服务器的IP地址和端口号(8888),建立连接。
- 创建输入输出流:同样使用
InputStream和OutputStream来处理数据。- 发送消息:向服务器发送一条消息。
- 接收回复:读取服务器的回复并打印到控制台。
运行示例
- 启动服务器:首先运行
SimpleServer类,服务器会在控制台输出“服务器启动,等待客户端连接...”。 - 启动客户端:然后运行
SimpleClient类,客户端会连接到服务器并发送消息。 - 查看输出:在服务器控制台上,你会看到客户端的IP地址和发送的消息;在客户端控制台上,你会看到服务器的回复。
总结
Java的网络编程通过Socket和ServerSocket类提供了强大的功能,使得开发者能够轻松实现网络通信。本文通过简单的示例展示了如何创建一个基本的客户端和服务器,帮助你入门Java网络编程。随着对网络编程的深入理解,你可以实现更复杂的网络应用,如聊天室、文件传输等。希望这篇文章对你有所帮助。
相关文章:
Java网络编程入门
在现代软件开发中,网络编程是一项不可或缺的技能。Java提供了强大的网络编程支持,使得开发者能够轻松地创建网络应用程序。今天将介绍Java中的网络编程基础,重点讲解Socket和ServerSocket类的使用。 什么是Socket? Socket是网络通…...
前端基础面试题·第三篇——JavaScript(其一)
1.JavaScript数据类型与运算符 数据类型 原始数据类型: 1.Number 2.String 3.Boolean 4.undefined 5.null 6.Symbol 7.bigint 复杂数据类型: 1.Function 2.非函数: Array: 数组 Object: 对象 Date: 日期 RegExp: 正则 Map: 映射 Set: 集合 …...
【机器学习】生成对抗网络(Generative Adversarial Networks, GANs)详解
1.引言 生成对抗网络(Generative Adversarial Networks, GANs)是近年来人工智能领域最具创新性和颠覆性的模型之一。自2014年由Ian Goodfellow及其团队提出以来,GAN的出现彻底改变了生成模型的研究范式。传统的生成模型,如变分自编码器(VAE)、隐马尔可夫模型(HMM)等,…...
QT作业1
1> 手写unique_ptr指针指针 代码: #include <iostream>using namespace std;// 自定义的unique_ptr类模板 template <typename T> class unique_ptr { public:// 构造函数,接收一个指针explicit unique_ptr(T* ptr nullptr) noexcept …...
Mybatis-设计模式总结
1、Builder模式 Builder模式的定义是“将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。”,它属于创建类模式,一般来说,如果一个对象的构建比较复杂,超出了构造函数所能包含的范围&#x…...
【笔记】Java | 三目运算符和Math函数的比较
实际效果 比较两数并赋值,如下两种方法的耗时不会有差异。 result Math.min(result, subLen);result result < subLen ? result : subLen; 源码解析 因为源码Math.min的源码本质就算三目运算符的比较,所以执行结果是一样的。 三目运算符简介 概…...
信创实践(2):利用Leapp工具迁移CentOS至AnolisOS,实现系统升级与自主可控
1. 引言 为了满足用户在CentOS退出后对操作系统使用的诉求,OpenAnolis龙蜥社区正式发布了Anolis OS。越来越多的CentOS客户期望能够迁移到Anolis OS上来。操作系统迁移是一个复杂工程,手工迁移技术要求高,操作复杂度强,需要耗费大…...
数据库死锁查询SQL
Oracle 从Oracle数据库的动态性能视图(Dynamic Performance Views)中检索当前被锁定的数据库对象的相关信息,以及持有这些锁的会话(session)的详细信息。具体来说,它连接了v$ session和v$locked_object两个…...
vLLM (4) - LLMEngine上篇
系列文章目录 vLLM (1) - Qwen2推理&部署 vLLM (2) - 架构总览 vLLM (3) - Sequence & SequenceGroup vLLM (4) - LLMEngine上篇 vLLM (5) - LLMEngine下篇 文章目录 系列文章目录前言一、类图二、LLM三、LLMEngine四、GPUExectuor五、Worker六、ModelRunner七、Cache…...
Java重修笔记 第五十天 HashSet 和 TreeSet 的去重机制比较
HashSet 和 TreeSet 的去重机制比较 1. HashSet 的去重机制:HashCode() equals() 。通过运算得到 key ,也就是该对象的哈希值,再通过哈希值得到该对象在 table 表上的索引位置,若该位置上没有链表数据就直接存放,若…...
提前购|基于SSM+vue的创新型产品提前购平台(源码+数据库+文档)
创新型产品提前购平台 基于SSMvue的创新型产品提前购平台 一、前言 二、系统设计 三、系统功能设计 系统功能实现 后台模块实现 管理员模块实现 发布企业管理实现 个体管理实现 投资企业管理实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选…...
上海市计算机学会竞赛平台2024年7月月赛丙组求和问题
题目描述 给定 nn 个整数 a1,a2,…,ana1,a2,…,an,请问这个序列最长有多少长的前缀,满足元素的和大于或等于 00?如果任何长度大于 00 的前缀之和都为负数,则输出 00 输入格式 第一行:单个整数表示 nn第二行&a…...
【LVI-SAM】激光雷达点云处理特征提取LIO-SAM 之FeatureExtraction实现细节
激光雷达点云处理特征提取LIO-SAM 之FeatureExtraction实现细节 1. 特征提取实现过程总结1.0 特征提取过程小结1.1 类 FeatureExtraction 的整体结构与作用1.2 详细特征提取的过程1. 平滑度计算(calculateSmoothness())2. 标记遮挡点(markOcc…...
[数据集][目标检测]血细胞检测数据集VOC+YOLO格式2757张4类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2757 标注数量(xml文件个数):2757 标注数量(txt文件个数):2757 标注…...
opencart journal 3 在价格前添加文本prefix
要修改的文件: /catalog/view/theme/journal3/template/product.twig 行274: <div class="product-price">{{ price }}</div>{% else %}<div class="product-price-new">{{ special }}</div><div class="product-pric…...
c++ string类的模拟实现的注意事项
一.构造函数 第一种形式,使用字符指针赋值 为了防止修改,我们传入了常量字符串。但是这里的初始化列表出错了,因为_str是一个变量,将常量给到一个变量涉及到权限的放大,是错误的。那该怎么写呢?对_str的赋…...
Unity3D中控制3D场景中游戏对象显示层级的详解
前言 在Unity3D开发中,控制游戏对象的显示层级(也称为渲染顺序或渲染层级)是一个常见的需求,特别是在处理复杂的3D场景时,如角色、道具、UI元素等的可见性和渲染顺序的管理变得尤为重要。Unity通过几种不同的机制来实…...
代码执行漏洞-Log4j2漏洞 vulhub CVE-2021-44228
步骤一:执行以下命令启动靶场环境并在浏览器访问!!! 查看端口 浏览器访问 可以发现 /solr/admin/cores?action 这⾥有个参数可以传,可以按照上⾯的原理 先构造⼀个请求传过去存在JNDI注⼊那么ldap服务端会执⾏我们传上去的payload JDNI项⽬地址 https://github.com…...
uniapp / uniapp x UI 组件库推荐大全
在 uniapp 开发中,我们大多数都会使用到第三方UI 组件库,提起 uniapp 的UI组件库,我们最常使用的应该就是uview了吧,但是随着日益增长的需求,uview 在某些情况下已经不在满足于我们的一些开发需求,尽管它目…...
花8000元去培训机构学习网络安全值得吗,学成后就业前景如何?
我就是从培训机构学的网络安全,线下五六个月,当时学费不到一万,目前已成功入行。所以,只要你下决心要入这一行,过程中能好好学,那这8000就花得值~ 因为只要学得好,工作两个多月就能赚回学费&am…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
