《Java核心技术II》可中断套接字
4.2.4 可中断套接字
SocketChannel可以中断套接字
SocketChannel channel.open(new InetSocketAddress(host,port));
通道(channel)并没有与之相关联的流,实际上,所拥有的read和write方法都是通过Buffer对象实现的。
如果不想处理缓冲区,可以使用Scanner从SocketChannel中读取信息。
Scanner有一个带ReadableByteChannel参数的构造器。
var in = new Scanner(channel,StandardCharsets.UTF-8);
通过调用静态方法Channels.newOutputStream,可以将通道转换成输出流。
OutputStream outStream = Channels.newOutputStream(channel);
对比中断套接字和阻塞套接字
package 第4章网络.interruptible;import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.HeadlessException;
import java.awt.Toolkit;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.nio.channels.SocketChannel;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;public class InterruptibleSocketTest {public static void main(String[] args) {var frame = new InterruptibleSocketFrame();frame.setTitle("InterruptibleSocketTest");
// frame.setSize(400, 400);//初始打开为屏幕中央Toolkit toolkit = Toolkit.getDefaultToolkit();Dimension screenSize = toolkit.getScreenSize();int screenWidth = (int) screenSize.getWidth();int screenHeight = (int) screenSize.getHeight();//计算窗口位置int x = (screenWidth - frame.getWidth())/2;int y = (screenHeight - frame.getHeight())/2;frame.setLocation(x, y);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);}}
class InterruptibleSocketFrame extends JFrame {private Scanner in;private JButton interruptibleButton;private JButton blockingButton;private JButton cancelButton;private JTextArea messages;private TestServer server;private Thread connectThread;public InterruptibleSocketFrame() throws HeadlessException {var northPanel = new JPanel();add(northPanel,BorderLayout.NORTH);final int TEXT_ROWS = 20;final int TEXT_COLUMNS = 60;messages = new JTextArea(TEXT_ROWS, TEXT_COLUMNS);add(new JScrollPane(messages));interruptibleButton = new JButton("可中断");blockingButton = new JButton("阻塞中");northPanel.add(interruptibleButton);northPanel.add(blockingButton);interruptibleButton.addActionListener(e -> {interruptibleButton.setEnabled(false);blockingButton.setEnabled(false);cancelButton.setEnabled(true);connectThread = new Thread(() -> {try {connectInterruptibly();} catch (IOException e1) {messages.append("\nInterruptibleSocketTest.connectInterruptibly: "+e);}});connectThread.start();});blockingButton.addActionListener(e -> {interruptibleButton.setEnabled(false);blockingButton.setEnabled(false);cancelButton.setEnabled(true);connectThread = new Thread(() -> {try {connectBlocking();} catch (IOException e1) {messages.append("\nInterruptibleSocketTest.connectBlocking: "+e);}});connectThread.start();});cancelButton = new JButton("取消");cancelButton.setEnabled(false);northPanel.add(cancelButton);cancelButton.addActionListener(e -> {connectThread.interrupt();cancelButton.setEnabled(false);});server = new TestServer();new Thread(server).start();pack();}//连接测试服务器,用可中断IOpublic void connectInterruptibly() throws IOException {messages.append("可中断:\n");try (SocketChannel channel = SocketChannel.open(new InetSocketAddress("localhost",8189))){in = new Scanner(channel,StandardCharsets.UTF_8);while(!Thread.currentThread().isInterrupted()) {messages.append("读取 ");if(in.hasNextLine()) {String line = in.nextLine();messages.append(line);messages.append("\n");}}} finally {EventQueue.invokeLater(() -> {messages.append("管道关闭\n");interruptibleButton.setEnabled(true);blockingButton.setEnabled(true);});}}//连接测试服务器,用阻塞IOpublic void connectBlocking() throws UnknownHostException, IOException {messages.append("阻塞中:\n");try (var sock = new Socket("localhost",8189)){in = new Scanner(sock.getInputStream(),StandardCharsets.UTF_8);while(!Thread.currentThread().isInterrupted()) {messages.append("读取 ");if (in.hasNextLine()) {String line = in.nextLine();messages.append(line);messages.append("\n");}}} finally {EventQueue.invokeLater(() -> {messages.append("套接字关闭\n");interruptibleButton.setEnabled(true);blockingButton.setEnabled(true);});}}class TestServer implements Runnable {@Overridepublic void run() {try(var s = new ServerSocket(8189)){while (true) {Socket incoming = s.accept();Runnable r = new TestServerHandler(incoming);new Thread(r).start();}} catch (IOException e) {messages.append("\nTestServer.run: "+e);}}}class TestServerHandler implements Runnable{private Socket incoming;private int counter;public TestServerHandler(Socket incoming) {super();this.incoming = incoming;}@Overridepublic void run() {OutputStream outStream;try {try {outStream = incoming.getOutputStream();var out = new PrintWriter(new OutputStreamWriter(outStream, StandardCharsets.UTF_8),true);while(counter < 100) {counter++;if(counter<=10) out.println(counter);Thread.sleep(100);}}finally {incoming.close();messages.append("关闭服务\n");}} catch (Exception e) {messages.append("\nTestServerHandler.run:"+e);}}}
}


相关文章:
《Java核心技术II》可中断套接字
4.2.4 可中断套接字 SocketChannel可以中断套接字 SocketChannel channel.open(new InetSocketAddress(host,port)); 通道(channel)并没有与之相关联的流,实际上,所拥有的read和write方法都是通过Buffer对象实现的。 如果不想处理缓冲区,…...
基于 Python 的深度学习的车俩特征分析系统,附源码
博主介绍:✌stormjun、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&…...
C#读写ini配置文件保存设置参数
本示例使用设备:https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.52de2c1b5P5rkA&ftt&id22173428704 [DllImport("kernel32", CharSet CharSet.Unicode)] public static extern uint GetPrivateProfileString(string lpAppName, stri…...
SwanLab环境变量列表
文章目录 环境变量全局配置服务配置登录认证其他 环境变量 ⚙️完整环境变量1 -> Github、⚙️完整环境变量2 -> Github 全局配置 环境变量描述默认值SWANLAB_SAVE_DIRSwanLab 全局文件夹保存的路径用户主目录下的 .swanlab 文件夹SWANLAB_LOG_DIRSwanLab 解析日志文件…...
深度学习入门-CNN
一、CNN是什么 CNN,即卷积神经网络(convolutional neural network),是用于预测的标准神经网络架构。在人工智能的广阔领域中,CNN被用于图像识别、语音识别等各种场合,CNN通过模拟人类视觉皮层的神经元连接方…...
微服务网关,如何选择?
什么是API网关 API网关(API Gateway)是微服务架构中的一个关键组件,它充当了客户端与后端服务之间的中间层。其主要功能包括请求路由、协议转换、负载均衡、安全认证、限流熔断等。通过API网关,客户端无需直接与多个微服务交互&a…...
SpringBoot集成Mqtt服务实现消费发布和接收消费
该项目介绍了docker环境下如何安装mqtt和springboot集成mqtt服务 前述 MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,设计用于在资源受限的设备和低带宽、不可靠的网络连接中高效地传输数据。主要用于物联网设备传输,设备之间可以高效地交换数据…...
在Mac mini上实现本地话部署AI和知识库
在Mac mini上实现本地话部署AI和知识库 硬件要求:大模型AI,也叫LLM,需要硬件支持,常见的方式有2种:一种是采用英伟达之类支持CUDA库的GPU芯片或者专用AI芯片;第二种是采用苹果M系列芯片架构的支持统一内存架…...
一个方法被多个线程同时调用,确保同样参数的调用只能有一个线程执行,不同参数的调用则可以多个线程同时执行
我们知道通过lock一个固定静态object给代码段加同步锁,可以让多个线程的同时调用以同步执行,因此可以利用字典来给不同参数分配不同的静态对象,方法中不同的参数调用锁住各自不同的静态对象即可实现不同参数不加锁,相同参数才加锁…...
3. MySQL事务并发的问题与解决方法
一. 并发事务带来的问题 并发会造成事务间出现脏读,不可重复读,幻读现象。 1. 脏读 一个事务在处理过程中读取了另外一个事务未提交的数据。若另外一个事务回滚,则读取到的数据是无效的,又称为脏读。 2. 不可重复读 在一个事务…...
25/1/15 嵌入式笔记 初学STM32F108
GPIO初始化函数 GPIO_Ini:初始化GPIO引脚的模式,速度和引脚号 GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化GPIOA的引脚0 GPIO输出控制函数 GPIO_SetBits:将指定的GPIO引脚设置为高电平 GPIO_SetBits(GPIOA, GPIO_Pin_0); // 将GPIO…...
MySQL的不同SQL模式导致行为不同?
现象: 我在两个mysql库都有相同定义的表,其中一个字段是varchar(1200)。当我都对这个表进行insert操作,而且超过此字段的规定长度(此处是1200),这两库的行为是不一样的:库B是直接报错too long&…...
Flink 使用 Kafka 作为数据源时遇到了偏移量提交失败的问题
具体的错误日志 21:43:57.069 [Kafka Fetcher for Source: Custom Source -> Map -> Filter (1/1)#2] ERROR org.apache.kafka.clients.consumer.internals.ConsumerCoordinator - [Consumer clientIdconsumer-my-group-6, groupIdmy-group] Offset commit failed on pa…...
【日志篇】(7.6) ❀ 01. 在macOS下刷新FortiAnalyzer固件 ❀ FortiAnalyzer 日志分析
【简介】FortiAnalyzer 是 Fortinet Security Fabric 安全架构的基础,提供集中日志记录和分析,以及端到端可见性。因此,分析师可以更有效地管理安全状态,将安全流程自动化,并快速响应威胁。具有分析和自动化功能的集成…...
LSA更新、撤销
LSA的新旧判断: 1.seq,值越大越优先 2.chksum,值越大越优先 3.age,本地的LSA age和收到的LSA age作比较 如果差值<900s,认为age一致,保留本地的:我本地有一条LSA是100 你给的是400 差值小于…...
DevUI 2024 年度运营报告:开源生态的成长足迹与未来蓝图
在当今数字化飞速发展的时代,开源已成为推动技术创新与协作的重要力量。DevUI 作为开源领域的重要一员,其发展历程与成果备受关注。值此之际,GitCode 精心整理了 DevUI 年度运营报告,为您全面呈现 DevUI 社区在过去一年里的开源之…...
centos 7 Mysql服务
将此服务器配置为 MySQL 服务器,创建数据库为 hubeidatabase,将登录的root密码设置为Qwer1234。在库中创建表为 mytable,在表中创建 2 个用户,分别为(xiaoming,2010-4-1,女,male&…...
React 表单处理与网络请求封装详解[特殊字符][特殊字符]
在 React 开发中,表单处理和网络请求是非常常见的需求。本文将围绕以下几个方面展开讲解: FormItem 绑定 name 属性表单校验与失焦校验获取表单数据封装请求模块 request 1. FormItem 绑定 name 属性 在 React 中,使用 Ant Design 的 Form …...
C++ 的 CTAD 与推断指示(Deduction Guides)
1 类模板参数推导(CTAD) 1.1 曲线救国 CTAD 的全称是类模板参数推导(Class Template Argument Deduction),它允许在实例化类模板时,根据构造函数的参数类型自动推导模板参数,从而避免显式指…...
【Rust自学】13.2. 闭包 Pt.2:闭包的类型推断和标注
13.2.0. 写在正文之前 Rust语言在设计过程中收到了很多语言的启发,而函数式编程对Rust产生了非常显著的影响。函数式编程通常包括通过将函数作为值传递给参数、从其他函数返回它们、将它们分配给变量以供以后执行等等。 在本章中,我们会讨论 Rust 的一…...
别再纠结了!用SpringBoot实战告诉你,图片上传选FastDFS还是MinIO(附完整代码)
SpringBoot实战:FastDFS与MinIO文件存储方案深度对比与选型指南 在当今数据驱动的互联网应用中,文件存储系统如同数字世界的基础设施,支撑着从用户头像到高清视频的各种数据存取需求。作为Java开发者,当我们面对"选择困难症&…...
Web AR技术深度探秘:7个创新案例重构浏览器增强现实体验
Web AR技术深度探秘:7个创新案例重构浏览器增强现实体验 【免费下载链接】AR.js Image tracking, Location Based AR, Marker tracking. All on the Web. 项目地址: https://gitcode.com/gh_mirrors/arj/AR.js 你是一个文章写手,你负责为开源项目…...
Path of Building终极指南:5分钟掌握流放之路最强Build规划工具
Path of Building终极指南:5分钟掌握流放之路最强Build规划工具 【免费下载链接】PathOfBuilding Offline build planner for Path of Exile. 项目地址: https://gitcode.com/GitHub_Trending/pa/PathOfBuilding Path of Building(简称PoB&#x…...
LFM2.5-1.2B-Thinking-GGUF基础教程:单页Web界面交互逻辑与后处理机制
LFM2.5-1.2B-Thinking-GGUF基础教程:单页Web界面交互逻辑与后处理机制 1. 模型与平台介绍 LFM2.5-1.2B-Thinking-GGUF是Liquid AI推出的轻量级文本生成模型,专为低资源环境优化设计。这个镜像采用内置GGUF模型文件和llama.cpp运行时,提供了…...
全网资源嗅探下载神器:轻松获取视频音频资源的终极指南
全网资源嗅探下载神器:轻松获取视频音频资源的终极指南 【免费下载链接】res-downloader 资源下载器、网络资源嗅探,支持微信视频号下载、网页抖音无水印下载、网页快手无水印视频下载、酷狗音乐下载等网络资源拦截下载! 项目地址: https://gitcode.co…...
OpenClaw多模态扩展:为nanobot添加图像识别能力
OpenClaw多模态扩展:为nanobot添加图像识别能力 1. 为什么需要图像识别能力 去年夏天,我接手了一个自动化内容审核的小项目。最初只是用OpenClaw处理文本内容,但很快发现一个致命缺陷——当需要审核带图片的帖子时,我的机器人就…...
论文AIGC检测率多少算正常?超标后怎么高效降AI率达标?
论文AIGC检测率多少算正常?超标后怎么高效降AI率达标? “我的论文AIGC率31%,这算高吗?”“学校要求低于多少?”“超标了怎么办?”——最近这类问题在各大毕业论文群里出现的频率越来越高。说实话我去年也是…...
CTFHub—Web题目解题合集1(超详细)
目录一. HTTP协议(web前置技能)1. 请求方式题解小知识2. 302跳转3. Cookie题目解法二. 信息泄露2.1 备份文件下载1. 网站源码2. bak文件题目题解小知识3. vim缓存题目小知识题解4. DS_Store题目小知识题解2.2 Git泄露1. Log题目小知识(GitHack与dirsearc…...
如何快速下载Google Drive受保护PDF:终极免费解决方案指南
如何快速下载Google Drive受保护PDF:终极免费解决方案指南 【免费下载链接】Google-Drive-PDF-Downloader 项目地址: https://gitcode.com/gh_mirrors/go/Google-Drive-PDF-Downloader 你是否经常遇到Google Drive中那些"仅查看"权限的PDF文件&am…...
AutoHotkey实战:5分钟搞定Mac/Windows跨平台快捷键统一(附完整脚本)
AutoHotkey实战:5分钟搞定Mac/Windows跨平台快捷键统一(附完整脚本) 对于频繁切换Mac和Windows双系统的开发者来说,最令人抓狂的莫过于两种操作系统下完全不同的快捷键体系。特别是Cmd/Ctrl键位的混乱,常常让人在复制粘…...
