1、由于可读状态是在对方写入数据后或socket关闭时才能出现,因此如果客户端和服务端都停留在read时,如果没有任何一方,向对方写入数据,这将会产生一个死锁。

2、此外,在本地接收操作发起之前,很可能接收缓冲区中已经有数据了,这是一种异步。不要误以为,本地调用接收操作后,对方才会发送数据,实际数据何时到达,本地不能做出任何假设。

3、

Java提供了便捷的网络编程模式,尤其在套接字中,直接提供了与网络进行沟通的输入和输出流,用户对网络的操作就如同对文件操作一样简便。在客户端与服务端建立Socket连接后,客户端与服务端间的写入和写出流也同时被建立,此时即可向流中写入数据,也可以从流中读取数据。在对数据流进行操作时,客户端和服务端的read和write是不对应的。

如果服务端先向客户端输出了两次,之后刷新了输出缓冲区。客户端先向服务端输出了一次,然后刷新输出缓冲,之后调用了一次接收操作。服务端和客户端的输入和输出并不是对应的,有时一次接收操作可以接收对方几次发过来的信息,并且不是每次输出操作对方都需要接收处理。

在创建Socket后,系统会为新创建的套接字分配缓冲区空间。这时套接字已经具有了输入缓冲区和输出缓冲区。缓冲区大小需要根据具体情况进行设置,一般要低于64K(TCP能够指定的最大负重载数据量,TCP的窗口大小是由16bit来确定的),增大缓冲区可以增大网络I/O的性能,而减少缓冲区有助于减少传入数据的backlog(就是缓冲长度,因此提高响应速度)。对于Socket和SeverSocket如果需要指定缓冲区大小,必须在连接之前完成缓冲区的设定。

了解了Socket缓冲区的概念后,需要探讨一下Socket的可写状态和可读状态。当输出缓冲区未满时,Socket是可写的(注意,不是对方启用接收操作后,本地才能可写,这是错误的理解),因此,当套接字被建立时,即处于可写如的状态。对于可读,则是指缓冲区中有接收到的数据,并且这些数据未完成处理。在socket创建时,并不处于可读状态,仅当连接的另一方向本套接字的通道写入数据后,本套接字方能处于可读状态(注意,如果对方套接字已经关闭,那么本地套接字将处于可读状态,并且每次调用read后,返回的都是-1)。

对于缓冲区空间的设定,要根据具体情况来定,如果存在大量的长信息(比如文件传输),将缓冲区定义的大些,可能更好的利用网络资源,如果更多的是短信息(比如聊天消息),使用小的缓冲区可能更好些,这样刷新的速度会更快。一般系统默认的缓冲大小是8*1024。除非对自己处理的情况很清晰,否则请不要随意更改这个设置。

如果想要将多条输入的信息区分开,可以使用一些技巧,在文件操作中使用-1表示EOF,就是文件的结束,在网络传输中,也可以使用-1表示一条传输语句的结束。在客户端和服务端对称的使用这两个类,可以将每一条信息分析出来。并不是将网络的传输同步,而是分析出缓冲中的数据,将以-1为结尾进行数据划分。如果写聊天程序可以使用类似的模式。

Socket缓冲区的更多相关文章

  1. Socket缓冲区探讨,是否有拆包的方式?

    Socket缓冲区探讨 本文主要探讨java网络套接字传输模型,并对如何将NIO应用于服务端,提高服务端的运行能力和降低服务负载. 1.1 socket套接字缓冲区 Java提供了便捷的网络编程模式, ...

  2. Linux网卡调优篇-禁用ipv6与优化socket缓冲区大小

    Linux网卡调优篇-禁用ipv6与优化socket缓冲区大小 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   一般在内网环境中,我们几乎是用不到IPV6,因此我们没有必要把多不 ...

  3. socket缓冲区以及阻塞模式

    socket缓冲区 每个 socket 被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区. write()/send() 并不立即向网络中传输数据,而是先将数据写入缓冲区中,再由TCP协议将数据从 ...

  4. 修改帧大小和socket缓冲区大小(转)

    修改帧大小和socket缓冲区大小 MTU (最大传输单元)的缺省值为1500. 通过下面命令将其改为9000(jumbo frame) % ifconfig eth0 mtu 9000 socket ...

  5. socket缓冲区以及阻塞模式(七)

    一.socket缓冲区 每个 socket 被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区. 以下用write()/send()表示写数据/发送数据,read()/recv() 表示读数据/接收 ...

  6. 修改socket缓冲区大小

    #include <stdio.h>#include <sys/time.h>#include <sys/types.h>#include <sys/sock ...

  7. ss 显示unix 域 的socket 缓冲区不正确

    一个unix 域socket,平时我们用ss -auxp 来查看是否有数据在内核没有到用户态, [root@localhost unix]# ss -auxp |grep -i server.o u_ ...

  8. socket tcp缓冲区大小的默认值、最大值

    Author:阿冬哥 Created:2013-4-17 Blog:http://blog.csdn.net/c359719435/ Copyright 2013 阿冬哥 http://blog.cs ...

  9. Socket初识

    基础概念 Socket,套接字,本质是网络编程接口.提供网络通信的能力,实现不同虚拟机或不同计算机之间的通信.面向客户/服务(C/S)模型,socket是应用层和传输层之间的中间软件抽象层: 顶上三层 ...

随机推荐

  1. JavaScript:正则表达式 分组2

    继续上一篇的写,这篇复杂点. 分组+范围 var reg=/([abcd]bc)/g; var str="abcd bbcd cbcd dbcd"; console.log(str ...

  2. maven插件安装

    eclipse安装maven插件,在网上有各种各样的方法,博主使用过的也不止一种,但是留下的印象总是时好时不好,同样的方法也不确定那一次能够成功.其实失败的大多数原因是因为所安装的maven插件版本与 ...

  3. MVC ---- 标准查询运算符

    标准查询运算符:定义在System.Linq.Enumerable类中的50多个为IEnumerable<T>准备的扩展方法,这些方法用来 对它操作的集合进行查询筛选. 筛选集合Where ...

  4. illumina support

    http://support.illumina.com/help/BaseSpace_App_WGS_BWA_help/Content/Vault/Informatics/Sequencing_Ana ...

  5. 性能测试 tps持续走低,响应时间持续增加,瓶颈分析

    吞吐量图如上 响应时间图如上 自身压测的机器,资源使用率并没有饱和 服务器,top命令下看到load average的值很低,本身是4核的server. 每个核的CPU使用率也极低,空闲cpu占95+ ...

  6. Window系统下用Ant实现Java项目的自动构建和部署

    https://blog.csdn.net/xinxin19881112/article/details/7297021 Step 1: 从官网下载Ant包,官网地址http://ant.apache ...

  7. jq 命名空间

    $('ul').on("click",function(){console.log('all');});$('ul').on("click.a",functio ...

  8. Lua 中与字符串有关的函数学习

    string1 = "lua" print(string.upper(string1)) string2 = 'LGS' print(string.lower(string2)) ...

  9. Java JDK5新特性-静态导入

    2017-10-31 00:10:50 静态导入格式:import static 包名 ...类名.方法名: 也就说可以直接导入到方法名. 注意: 方法必须是静态的 如果有多个同名的静态方法,容易不知 ...

  10. LINQ 系列

    C#图解教程 第十九章 LINQ   LINQ 什么是LINQLINQ提供程序 匿名类型 方法语法和查询语法查询变量查询表达式的结构 from子句join子句什么是联结查询主体中的from…let…w ...