socket基础学习以及java搭建
在 Java 中,Socket 编程用于实现网络通信。Java 提供了丰富的网络 API,使得通过 Socket 进行通信变得简单和高效。Java 的 Socket 编程常见于客户端-服务器应用中,比如聊天程序、文件传输工具等。
1. Socket 基本概念
Socket 编程的基本概念和之前提到的一样,Socket 是网络通信中的端点,由 IP 地址和端口号唯一确定。Java 的 java.net 包提供了 Socket 编程所需的类,常见的类包括:
- Socket:客户端用来连接服务器的 Socket。
- ServerSocket:服务器端监听客户端请求的 Socket。
- InetAddress:表示 IP 地址。
- SocketException:网络连接异常。
2. Socket 编程的基本流程
Socket 编程的流程通常包括以下几个步骤:
- 服务器端创建 ServerSocket 对象,监听客户端连接。
- 客户端创建 Socket 对象,连接到服务器。
- 数据传输:客户端与服务器通过 InputStream 和 OutputStream 进行数据传输。
- 关闭连接:通信结束后,客户端和服务器都需要关闭 Socket。
3. 基本代码示例
服务器端代码:
服务器端代码中,ServerSocket 用于监听客户端的连接请求,Socket 用于与客户端建立连接,进行数据的读写。
import java.io.*;
import java.net.*;public class Server {public static void main(String[] args) {try {// 创建一个 ServerSocket,绑定到特定端口ServerSocket serverSocket = new ServerSocket(12345);System.out.println("服务器启动,等待连接...");// 等待客户端连接Socket clientSocket = serverSocket.accept();System.out.println("客户端连接成功");// 获取输入流读取客户端发来的数据BufferedReader input = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));String clientMessage = input.readLine();System.out.println("收到客户端的消息: " + clientMessage);// 向客户端发送响应消息PrintWriter output = new PrintWriter(clientSocket.getOutputStream(), true);output.println("Hello, Client!");// 关闭连接input.close();output.close();clientSocket.close();serverSocket.close();} catch (IOException e) {e.printStackTrace();}}
}
客户端代码:
客户端代码中,Socket 用于连接服务器,InputStream 和 OutputStream 用于数据的读取和写入。
import java.io.*;
import java.net.*;public class Client {public static void main(String[] args) {try {// 创建一个 Socket 连接到服务器Socket socket = new Socket("localhost", 12345);// 向服务器发送消息PrintWriter output = new PrintWriter(socket.getOutputStream(), true);output.println("Hello, Server!");// 获取服务器响应BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));String serverMessage = input.readLine();System.out.println("收到服务器的消息: " + serverMessage);// 关闭连接input.close();output.close();socket.close();} catch (IOException e) {e.printStackTrace();}}
}
4. 常用的 Socket 类
- ServerSocket:用于服务器端监听客户端的连接请求。它提供了一个 accept() 方法,用于等待客户端连接。
- Socket:客户端使用该类连接服务器,通过 getInputStream() 和 getOutputStream() 进行数据通信。
- InetAddress:代表 IP 地址,可以通过该类获取本机或远程主机的 IP 地址。
5. 数据传输
在 Socket 编程中,数据的传输是通过流(流的概念与文件操作中的流类似)来实现的。常见的数据流类:
- InputStream/OutputStream:用于字节流的数据传输。
- BufferedReader/BufferedWriter:用于字符流的数据传输,通常比字节流更高效,适合处理文本数据。
发送和接收数据的基本操作: - 使用 getOutputStream() 获取客户端或服务器的输出流,通过 PrintWriter 将数据发送给对方。
- 使用 getInputStream() 获取客户端或服务器的输入流,通过 BufferedReader 读取接收到的数据。
6. 多线程处理多个客户端
通常,在实际应用中,服务器需要处理多个客户端的连接。为此,可以使用多线程来处理每个客户端的请求。
修改服务器端代码,支持多线程:
import java.io.*;
import java.net.*;public class Server {public static void main(String[] args) {try {// 创建一个 ServerSocket,绑定到特定端口ServerSocket serverSocket = new ServerSocket(12345);System.out.println("服务器启动,等待连接...");// 无限循环,接受多个客户端连接while (true) {Socket clientSocket = serverSocket.accept();System.out.println("客户端连接成功");// 为每个客户端创建一个线程处理new ClientHandler(clientSocket).start();}} catch (IOException e) {e.printStackTrace();}}
}// 处理每个客户端的线程
class ClientHandler extends Thread {private Socket socket;public ClientHandler(Socket socket) {this.socket = socket;}@Overridepublic void run() {try {// 获取输入流读取客户端发来的数据BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));String clientMessage = input.readLine();System.out.println("收到客户端的消息: " + clientMessage);// 向客户端发送响应消息PrintWriter output = new PrintWriter(socket.getOutputStream(), true);output.println("Hello, Client!");// 关闭连接input.close();output.close();socket.close();} catch (IOException e) {e.printStackTrace();}}
}
7. 常见问题及调试
- 端口被占用:如果服务器端的端口被占用,可以使用其他端口号。
- 连接超时:如果连接无法建立,可能是服务器没有启动,或者防火墙阻止了连接。
- EOFException:可能是连接中断或客户端没有发送预期的数据。
- 异常处理:确保在网络通信过程中使用适当的异常处理机制,避免因为网络故障导致程序崩溃。
8. 进阶学习
- UDP Socket:UDP 是一种无连接的协议,不需要建立连接即可发送数据。可以学习 Java 中如何使用 DatagramSocket
和 DatagramPacket 实现 UDP 通信。 - 非阻塞式 I/O:了解 Java NIO(New Input/Output)库,使用 Selector 进行非阻塞式的 I/O
操作,适用于高并发应用。 - SSL/TLS 加密:学习如何通过 Java 中的 SSLSocket 来进行安全的加密通信,保护数据传输的安全性。
相关文章:
socket基础学习以及java搭建
在 Java 中,Socket 编程用于实现网络通信。Java 提供了丰富的网络 API,使得通过 Socket 进行通信变得简单和高效。Java 的 Socket 编程常见于客户端-服务器应用中,比如聊天程序、文件传输工具等。 1. Socket 基本概念 Socket 编程的基本概念…...
Exoplayer2源码编译FFmpeg拓展模块实现音频软解码
在前面文章最新版本Exoplayer扩展FFmpeg音频软解码保姆级教程中介绍了最新版本的Exoplayer(androidx.Media3)编译FFmpeg模块的流程,有就是media3版本的explayer最低支持的sdk版本是21也就是Android5.x,但是市面上还是有很多IOT设备是很老的android4.4(sdk19)的&…...
Docker安装嵌入框架Text Embeddings Inference (TEI)
Docker安装Text Embeddings Inference (TEI) 1 简单介绍 文本嵌入推理(TEI,Text Embeddings Inference )是HuggingFace研发的一个用于部署和服务开源文本嵌入和序列分类模型的工具包。TEI兼容OpenAI的嵌入模型的规范。 # 官网地址 https:/…...
使用easyocr、PyPDF2对图像及PDF文档进行识别
一、概述 本 Python 脚本的主要功能是对当前目录及其子目录下的图片和 PDF 文件进行光学字符识别(OCR)处理。它使用 easyocr 库处理图片中的文字,使用 PyPDF2 库提取 PDF 文件中的文本,并将处理结果保存为文本文件。同时ÿ…...
MAUI(C#)安卓开发起步
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...
oracle decode
1. 基本语法 DECODE(expression, search1, result1, search2, result2, ..., default_result) expression :需要比较的表达式或列。search1, search2, ... :要匹配的值。result1, result2, ... :当 expression 等于 search 时返回的结果。def…...
826考研
初试总分第一的hh佬小红书:https://www.xiaohongshu.com/user/profile/64e106aa000000000100fe33 深研院巨佬经验贴:https://zhuanlan.zhihu.com/p/690464528 本部羊神经验贴:https://zhuanlan.zhihu.com/p/689494655 本部学硕佬经验贴&#…...
PPT小黑第26套
对应大猫28 层次级别是错的,看着是十页,导入ppt之后四十多页 选中所有 红色蓝色黑色 文本选择标题:选择 -格式相似文本(检查有没有漏选 漏选的话 按住ctrl 点下一个) 要求新建幻灯片中不包含原素材中的任何格式&…...
【Linux-网络】HTTP的清风与HTTPS的密语
🎬 个人主页:谁在夜里看海. 📖 个人专栏:《C系列》《Linux系列》《算法系列》 ⛰️ 道阻且长,行则将至 目录 📚 引言 📚 一、HTTP 📖 1.概述 📖 2.URL ǵ…...
Vue 与 Nuxt 的区别
Nuxt 实现服务端渲染SSR Nuxt.js 是基于 Vue.js 的一个框架,它为构建 Vue.js 应用提供了更高级的功能和更便捷的开发体验。 一、定位与功能 Vue.js 是一个前端 JavaScript 框架,专注于构建用户界面和单页应用(SPA)。 核心功能…...
华为OD机试-最长的密码(Java 2024 E卷 100分)
题目描述 小王正在进行游戏大闯关,有一个关卡需要输入一个密码才能通过。密码获得的条件如下: 在一个密码本中,每一页都有一个由26个小写字母组成的密码,每一页的密码不同。需要从这个密码本中寻找这样一个最长的密码,从它的末尾开始依次去掉一位得到的新密码也在密码本…...
利用golang embed特性嵌入前端资源问题解决
embed嵌入前端资源,配置前端路由的代码如下 func StartHttpService(port string, assetsFs embed.FS) error {//r : gin.Default()gin.SetMode(gin.ReleaseMode)r : gin.New()r.Use(CORSMiddleware())// 静态文件服务dist, err : fs.Sub(assetsFs, "assets/di…...
解决docker认证问题 failed to authorize: failed to fetch oauth token
报错信息[bash1]解决方案 全局代理打开“buildkit”: false ,见[图1] [bash1] >docker build -t ffpg . [] Building 71.8s (3/3) FINISHED docker:desktop-linux> [internal] load bui…...
【Flink银行反欺诈系统设计方案】3.欺诈的7种场景和架构方案、核心表设计
【Flink银行反欺诈系统设计方案】3.欺诈的7种场景和架构方案、核心表设计 1. **欺诈场景分类与案例说明**1.1 **大额交易欺诈**1.2 **异地交易欺诈**1.3 **高频交易欺诈**1.4 **异常时间交易欺诈**1.5 **账户行为异常**1.6 **设备指纹异常**1.7 **交易金额突变** 2. **普适性软…...
docker拉取失败
备份原始配置文件 sudo cp /etc/docker/daemon.json /etc/docker/daemon.json.bak 清理或修复 daemon.json 文件 sudo nano /etc/docker/daemon.json 删除 文件中的所有内容,确保文件为空。 cv下面这个文件内容 { "registry-mirrors": [ &…...
无人机应用探索:玻纤增强复合材料的疲劳性能研究
随着无人机技术的快速发展,轻量化已成为其结构设计的核心需求。玻纤增强复合材料凭借高强度、低密度和优异的耐环境性能,成为无人机机身、旋翼支架等关键部件的理想选择。然而,无人机在服役过程中需应对复杂多变的环境:高空飞行时…...
Visual Studio工具
高亮显示匹配的标签(小括号,中括号,大括号)...
STM32Cubemx配置E22-xxxT22D lora模块实现定点传输
文章目录 一、STM32Cubemx配置二、定点传输**什么是定点传输?****定点传输的特点****定点传输的工作方式****E22 模块定点传输配置****如何启用定点传输?****示例** **应用场景****总结** **配置 1:C0 00 07 00 02 04 62 00 17 40****解析** …...
iterm2更新后主题报错
报错 .oh-my-zsh/themes/agnoster.zsh-theme:307: parse error near <<<。方法1:更新Oh My Zsh主题(以agnoster为例) 适用场景:使用Oh My Zsh自带主题(如agnoster)时出现语法错误。 备份当前主题…...
WPF+WebView 基础
1、基于.NET8,通过NuGet添加Microsoft.Web.WebView2。 2、MainWindow.xaml代码如下。 <Window x:Class"Demo.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/win…...
不懂ui->layout()->removeWidget(bar);
ui->layout()->removeWidget(bar);解释起来就是:ui->layout()返回一个指针,然后这个指针再调用->removeWidget(bar)。 你提到的语法 ui->layout()->removeWidget(bar) 确实可能让人感到困惑,尤其是如果你对 Qt 的 UI 系统不…...
蓝桥杯算法——铠甲合体
问题描述 暗影大帝又开始搞事情了!这次他派出了 MM 个战斗力爆表的暗影护法,准备一举摧毁 ERP 研究院!MM 个暗影护法的战斗力可分别用 B1,⋯,BMB1,⋯,BM 表示。 ERP 研究院紧急召唤了 NN 位铠甲勇士前来迎战!每位铠甲勇士都…...
JAVA毕设项目-基于SSM框架的百色学院创新实践学分认定系统源码+设计文档
文末获取源码数据库文档 感兴趣的可以先收藏,有毕设问题,项目以及论文撰写等问题都可以和博主沟通,尽最大努力帮助更多的人! 百色学院创新实践学分认定系统设计与实现 摘 要 本百色学院创新实践学分认定系统是针对目前实践学分认定…...
【LangChain】存储与管理对话历史
0. 代码演示 from langchain_community.chat_message_histories import SQLChatMessageHistorydef get_session_history(session_id):# 通过 session_id 区分对话历史,并存储在 sqlite 数据库中return SQLChatMessageHistory(session_id, "sqlite:///memory.d…...
[machine learning] MACS、MACs、FLOPS、FLOPs
本文介绍机器学习中衡量一个模型计算复杂度的四个指标:MACS、MACs、FLOPS、FLOPs。 首先从含义上讲,可以分类两类:MACS/FLOPS和MACs/FLOPs。MACs/FLOPs表示总的操作数(后缀s可以看成是表示复数),MACS/FLOPS表示每秒可以执行的操作…...
学习笔记-AMD CPU 命名
AMD的AI处理器主要分为锐龙AI 1代(基于Zen4架构XDNA 1 NPU)和锐龙AI 2代(基于Zen5架构XDNA 2 NPU),以下是两代的详细说明: 一、锐龙AI 1代(2024年发布) 1. 命名规则 结构…...
【Javascript】计算器(Calculator)网页设计案例
代码如下: <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>计算器</title…...
Stable Diffusion模型高清算法模型类详解
Stable Diffusion模型高清算法模型类详细对比表 模型名称核心原理适用场景参数建议显存消耗细节增强度优缺点4x-UltraSharp残差密集块(RDB)结构优化纹理生成真实人像/建筑摄影重绘幅度0.3-0.4,分块尺寸768px★★★★★☆皮肤纹理细腻,但高对比场景易出现…...
十大经典排序算法简介
一 概述 本文对十大经典排序算法做简要的总结(按常用分类方式排列),包含核心思想、时间/空间复杂度及特点。 二、比较类排序 1. 冒泡排序 (BUBBLE SORT) 思想:重复交换相邻逆序元素,像气泡上浮 复杂度: 时间:O(n^2)(最好情况O(n)) 空间:O(1) 特点:简单但效率低,稳…...
迷你世界脚本玩家接口:Player
玩家接口:Player 彼得兔 更新时间: 2024-07-28 17:49:05 继承自 Actor 具体函数名及描述如下: 序号 函数名 函数描述 1 getAttr(...) 玩家属性获取 2 setAttr(...) 玩家属性设置 3 getHostUin(...) 获取房主uin 4 isMainPlayer(...) …...
