Java NIO系列教程(八) SocketChannel

转载自  Java NIO系列教程(八) SocketChannel

译文链接     作者:Jakob Jenkov     译者:郑玉婷      校对:丁一

Java NIO中的SocketChannel是一个连接到TCP网络套接字的通道。可以通过以下2种方式创建SocketChannel:

  1. 打开一个SocketChannel并连接到互联网上的某台服务器。
  2. 一个新连接到达ServerSocketChannel时,会创建一个SocketChannel。

打开 SocketChannel

下面是SocketChannel的打开方式:

1SocketChannel socketChannel = SocketChannel.open();
2socketChannel.connect(new InetSocketAddress("http://jenkov.com"80));

关闭 SocketChannel

当用完SocketChannel之后调用SocketChannel.close()关闭SocketChannel:

1socketChannel.close();

从 SocketChannel 读取数据

要从SocketChannel中读取数据,调用一个read()的方法之一。以下是例子:

1ByteBuffer buf = ByteBuffer.allocate(48);
2int bytesRead = socketChannel.read(buf);

首先,分配一个Buffer。从SocketChannel读取到的数据将会放到这个Buffer中。

然后,调用SocketChannel.read()。该方法将数据从SocketChannel 读到Buffer中。read()方法返回的int值表示读了多少字节进Buffer里。如果返回的是-1,表示已经读到了流的末尾(连接关闭了)。

写入 SocketChannel

写数据到SocketChannel用的是SocketChannel.write()方法,该方法以一个Buffer作为参数。示例如下:

01String newData = "New String to write to file..." + System.currentTimeMillis();
02 
03ByteBuffer buf = ByteBuffer.allocate(48);
04buf.clear();
05buf.put(newData.getBytes());
06 
07buf.flip();
08 
09while(buf.hasRemaining()) {
10    channel.write(buf);
11}

注意SocketChannel.write()方法的调用是在一个while循环中的。Write()方法无法保证能写多少字节到SocketChannel。所以,我们重复调用write()直到Buffer没有要写的字节为止。

非阻塞模式

可以设置 SocketChannel 为非阻塞模式(non-blocking mode).设置之后,就可以在异步模式下调用connect(), read() 和write()了。

connect()

如果SocketChannel在非阻塞模式下,此时调用connect(),该方法可能在连接建立之前就返回了。为了确定连接是否建立,可以调用finishConnect()的方法。像这样:

1socketChannel.configureBlocking(false);
2socketChannel.connect(new InetSocketAddress("http://jenkov.com"80));
3 
4while(! socketChannel.finishConnect() ){
5    //wait, or do something else...
6}

write()

非阻塞模式下,write()方法在尚未写出任何内容时可能就返回了。所以需要在循环中调用write()。前面已经有例子了,这里就不赘述了。

read()

非阻塞模式下,read()方法在尚未读取到任何数据时可能就返回了。所以需要关注它的int返回值,它会告诉你读取了多少字节。

非阻塞模式与选择器

非阻塞模式与选择器搭配会工作的更好,通过将一或多个SocketChannel注册到Selector,可以询问选择器哪个通道已经准备好了读取,写入等。Selector与SocketChannel的搭配使用会在后面详讲。


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

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

相关文章

php 正则获取html标签,php正则取嵌套html标签

$s <<nested tag testhtml;$pattern "/("."]*?)\s*>|"."\s]))?)*\s*\/?>|"."|"."".")/";preg_match_all($pattern, $s, $aMatches, PREG_OFFSET_CAPTURE);function getMatchTags($s, $arr) {$sM…

拥抱.NET Core,跨平台的轻量级RPC:Rabbit.Rpc

不久前发布了一篇博文“.NET轻量级RPC框架&#xff1a;Rabbit.Rpc”&#xff0c;当初只实现了非常简单的功能&#xff0c;也罗列了之后的计划&#xff0c;经过几天的不断努力又为Rabbit.Rpc增加了一大波新特性&#xff0c;今天主要介绍下项目近况。 特性一览 Apache License 2.…

oracle应用程序SQL提交方式,Oracle Submit Request - 请求的调用方法: FND_REQUEST.SUBMIT_REQUEST...

FND_REQUEST.SUBMIT_REQUEST 函数是用来提交一个请求的,它返回一个NUMBER值.具体调用如下:result : fnd_request.submit_request(application CHAR, --模快program CHAR, --应用程式description CHAR, --请求说明(可选)start_time CHAR, --RUN 时间(可选)sub_request…

Java NIO系列教程(六) Selector

转载自 Java NIO系列教程&#xff08;六&#xff09; Selector 译文链接 作者&#xff1a;Jakob Jenkov 译者&#xff1a;浪迹v 校对&#xff1a;丁一 Selector&#xff08;选择器&#xff09;是Java NIO中能够检测一到多个NIO通道&#xff0c;并能够知晓通道是否为诸如读写事…

.NET 框架兼容性简介

前言 从.NET框架4.0开始&#xff0c;所有主版本号为4&#xff08;称为“4.x”版本&#xff09;的.NET框架&#xff0c;都会进行就地更新。这就意味着在一段时间内&#xff0c;电脑上安装的只有一个.NET 4.x框架。安装.NET 4.5框架将替换.NET 4.0框架&#xff0c;.NET 4.5.1框架…

php滚动公告源码,好用的滚动公告HTML代码

JsCSS间断和不间断文本滚动代码.noticebox{width:150px;height:25px;line-height:25px;border:#bbb 1px solid;overflow:hidden;}.noticebox ul{margin:0;padding:0}.noticebox li{height:25px;line-height:25px;font-size:12px;text-align:center;list-style-type:none;}第一行…

当当网首页——CSS代码

charset "utf-8"; /* CSS Document *//*首页样式*/ /*右侧随鼠标滚动的广告图片*/ .right{top:50px;right:30px;position:absolute;z-index:3; } .dd_close{width:35px;height:18px;text-align:center;border:solid 1px #999;background-color:#E0E0E0;top:0px;right…

Java NIO系列教程(七) FileChannel

转载自 Java NIO系列教程&#xff08;七&#xff09; FileChannel 译文链接 作者&#xff1a;Jakob Jenkov 译者&#xff1a;周泰 校对&#xff1a;丁一 Java NIO中的FileChannel是一个连接到文件的通道。可以通过文件通道读写文件。 FileChannel无法设置为非阻塞…

js+php在线截图 jquery fileupload.js,另一种图片上传 jquery.fileupload.js

今天遇到另外一种上传图片方法用jquery.fileupload.js一个文件类型的元素$("#fileupload").fileupload({datatype:"json",url: "/File/UploadFiles",done: function (e, data) { //上传结束的操作if (data.result[0].result ! "OK") /…

当当网首页——JS代码

$(function($){//打开一个广告窗口window.open(open.html,,top0,left200,width500,height327,scrollbars0,resizable0);//随滚动条滚动的可关闭广告窗口$(window).scroll(function(){var st $(this).scrollTop()50;$("#right").css("top",st);});$("…

Java NIO系列教程(一) Java NIO 概述

转载自 Java NIO系列教程&#xff08;一&#xff09; Java NIO 概述 译文链接 作者&#xff1a;Jakob Jenkov 译者&#xff1a;airu 校对&#xff1a;丁一 Java NIO 由以下几个核心部分组成&#xff1a; ChannelsBuffersSelectors 虽然Java NIO 中除此之外还有很多…

linux原有的文件系统扩展,原来linux不用LVM也能扩展文件系统

以前总以为UNIX/LINUX使用了lvm才能扩展或缩小卷和文件系统&#xff0c;今天才发现我错了&#xff1a;即使没有lvm&#xff0c;linux也能扩展卷和及其相应的文件系统而不会丢失原有数据。以下是测试步骤&#xff0c;记录备查。1、系统是redhat linux 6[rootlocalhost ku]# unam…

当当网上书店购物车——源码

关于当当网的所有图片资源都已上传&#xff0c;下载地址&#xff1a;当当网资料&#xff0c;点击下载即可&#xff0c;下面上html代码&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml…

Java NIO系列教程(二) Channel

转载自 Java NIO系列教程&#xff08;二&#xff09; Channel译文链接 作者&#xff1a;Jakob Jenkov 译者&#xff1a;airu 校对&#xff1a;丁一 Java NIO的通道类似流&#xff0c;但又有些不同&#xff1a; 既可以从通道中读取数据&#xff0c;又可以写数据到通…

linux写入二进制文件内容,linux – 从管道读取数据并写入标准输出,中间延迟.必须处理二进制文件...

我现在已经尝试了大约一个小时来找到解决这个问题的优雅方案.我的目标基本上是编写带宽控制管道命令,我可以在各种情况下重复使用(不仅仅是网络传输,我知道scp -l 1234).我想做的是&#xff1a;>延迟X秒.>从管道读取Y量(或者如果没有足够的话,小于Y).>将读取数据写入标…

ASP.NET Core 发布至Linux生产环境 Ubuntu 系统

ASP.NET Core 发布至Linux生产环境 Ubuntu 系统&#xff0c;之前跟大家讲解了 dotnet publish 发布&#xff0c;而没有将整个系统串起来。 今天就跟大家综合的讲一下ASP.NET Core发布至Linux生产环境。 开发及发布环境&#xff1a;WIN10 x64 生产Linux环境&#xff1a;Ubuntu …

Java NIO系列教程(三) Buffer

转载自 Java NIO系列教程&#xff08;三&#xff09; Buffer原文链接 作者&#xff1a;Jakob Jenkov 译者&#xff1a;airu 校对&#xff1a;丁一 Java NIO中的Buffer用于和NIO通道进行交互。如你所知&#xff0c;数据是从通道读入缓冲区&#xff0c;从缓冲区写入…

Linux程序之触摸,linux 触摸屏驱动编写

早在诺基亚手机还比较流行的时候&#xff0c;那时候触摸屏用的还不多。但是随着触摸屏手机、即智能手机的流行&#xff0c;触摸屏基本成了手机的标配。所以&#xff0c;今天可以看看触摸屏驱动在linux上是如何进行的。1、驱动目录drivers/input2、看看这个目录的Makefile如何设…

跨站请求伪造(CSRF/XSRF)

简介 CSRF&#xff08;Cross-site request forgery跨站请求伪造&#xff0c;也被称为“One Click Attack”或者Session Riding&#xff0c;通常缩写为CSRF或者XSRF&#xff0c;是一种对网站的恶意利用。尽管听起来像跨站脚本&#xff08;XSS&#xff09;&#xff0c;但它与XSS非…

Java NIO系列教程(四) Scatter/Gather

转载自 Java NIO系列教程&#xff08;四&#xff09; Scatter/Gather译文地址 作者&#xff1a;Jakob Jenkov 译者&#xff1a;郭蕾 Java NIO开始支持scatter/gather&#xff0c;scatter/gather用于描述从Channel&#xff08;译者注&#xff1a;Channel在中文经常翻译为…