`
san_yun
  • 浏览: 2652081 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

java socket 参数说明

 
阅读更多

    Socket 的 I/O 调用可能会因为多种原因而阻塞。数据输入方法 read()和 receive()在没有数据可读时会阻塞。TCP 套接字的 write()方法在没有足够的空间缓存传输的数据时可能阻塞。 ServerSocket 的 accept()方法和 Socket 的构造函数都会阻塞等待,直到连接建立(见第6.4 节)。同时,长的信息往返时间,高错误率的连接和慢速的(或已发生故障的)服务器,都可能导致需要很长的时间来建立连接。所有这些情况,只有在连接请求得到满足后这些方法才会返回。

    当然,调用一个已经阻塞的方法将使应用程序停止(并使运行它的线程无效)。当程序在等待一次调用的完成时如果还有其他任务要执行的情况会怎样(如,更新"忙碌"状态的光标或响应用户请求)?这些程序可能没有时间来等待一个阻塞的方法调用。那UDP 数据报文丢失的情况呢?如果我们阻塞等待接收一个数据报文,而它已经丢失,则会导致程序无限期地阻塞下去。


accept(),read()和 receive()
    对于这些方法,我们可以使用 Socket 类、ServerSocket 类和 DatagramSocket 类的setSoTimeout()方法,设置其阻塞的最长时间(以毫秒为单位)。如果在指定时间内这些方
法没有返回,则将抛出一个 InterruptedIOException 异常。对于 Socket 实例,在调用 read()方法前,我们还可以使用该套接字的 InputStream 的 available()方法来检测是否有可读的数据。


写数据

    write()方法调用也会阻塞等待,直到最后一个字节成功写入到了 TCP 实现的本地缓存中。如果可用的缓存空间比要写入的数据小,在 write()方法调用返回前,必须把一些数据成功传输到连接的另一端(详情见第 6.1 节)。因此,write()方法的阻塞总时间最终还是取决于接收端的应用程序。不幸的是 Java 现在还没有提供任何使 write()超时或由其他线程将其打断的方法。所以如果一个可以在 Socket 实例上发送大量数据的协议可能会无限期地阻塞下去。(第 6.2 节介绍了这个特点可能导致的灾难性后果)


控制默认行为
    TCP/IP 协议的开发者用了大量的时间来考虑协议的默认行为,以满足大部分应用程序的需要。(如果你对此表示怀疑,可以参考 RFC1122 和 1123,它们根据多年的经验对 TCP/IP协议的实现的推荐行为进行了详尽的描述。)

Keep-Alive
    如果一段时间内没有数据交换,通信的每个终端可能都会怀疑对方是否还处于活跃状态。TCP 协议提供了一种 keep-alive 的机制,该机制在经过一段不活动时间后,将向另一个
终端发送一个探测消息。如果另一个终端还出于活跃状态,它将回复一个确认消息。如果经过几次尝试后依然没有收到另一终端的确认消息,则终止发送探测信息,关闭套接字,并在
下一次尝试 I/O 操作时抛出一个异常。注意,应用程序只要在探测信息失败时才能察觉到keep-alive 机制的工作。
    默认情况下,keep-alive 机制是关闭的。通过调用 setKeepAlive()方法将其设置为 true 来开启 keep-alive 机制。

发送和接收缓存区的大小
    一旦创建了一个 Socket 或 DatagramSocket 实例,操作系统就必须为其分配缓存区以存放接收的和要发送的数据。Socket, DatagramSocket: 设置和获取发送接收缓存区大小:
int getReceiveBufferSize()
void setReceiveBufferSize(int size)
int getSendBufferSize()
void setSendBufferSize(int size)

    getReceiveBufferSize(),setReceiveBufferSize(),getSendBufferSize(), 和setSendBufferSize()方法分别用于获取和设置接收发送缓冲区的大小(以字节为单位)。需要注意的是,这里指定的大小只是作为一种建议给出的,实际大小可能与之存在差异。

    还可以在 ServerSocket 上指定接收缓冲区大小。不过,这实际上是为 accept()方法所创建的新 Socket 实例设置接收缓冲区大小。为什么可以只设置接收缓冲区大小而不设置发送缓冲区的大小呢?当接收了一个新的 Socket,它就可以立刻开始接收数据,因此需要在accept()方法完成连接之前设置好缓冲区的大小。另一方面,由于可以控制什么时候在新接受的套接字上发送数据,因此在发送之前还有时间设置发送缓冲区的大小。
ServerSocket: 设置/获取所接受套接字的接收缓冲区大小:
int getReceiveBufferSize()
void setReceiveBufferSize(int size)
    getReceiveBufferSize()和 setReceiveBufferSize()方法用于获取和设置由 accept()方法创建的 Socket 实例的接收缓冲区的大小(字节)。

超时
    如前面所介绍的,很多 I/O 操作如果不能立即完成就会阻塞等待:读操作将阻塞等待直到至少有一个字节可读;接收操作将阻塞等待直到成功建立连接。不幸的是阻塞的时间没有
限制。可以为各种操作指定一个最大阻塞时间。
   

地址重用
    对于 TCP,当一个连接关闭后,通信的一端(或两端)必须在"Time-Wait"状态上等待一段时间,以对传输途中丢失的数据包进行清理(见第 6.4.2 节)。不幸的是,通信终端可能无法等到 Time-Wait 结束。对于这两种情况,都需要能够与正在使用的地址进行绑定的能力,这就要求实现地址重用。
Socket, ServerSocket, DatagramSocket: 设置/获取地址重用
    boolean getReuseAddress()
    void setReuseAddress(boolean on)

消除缓冲延迟
    TCP 协议将数据缓存起来直到足够多时一次发送,以避免发送过小的数据包而浪费网络资源。虽然这个功能有利于网络,但应用程序可能对所造成的缓冲延迟不能容忍。好在可
以人为禁用缓存功能。
    Socket: 设置/获取 TCP 缓冲延迟
    boolean getTcpNoDelay()
    void setTcpNoDelay(boolean on)
getTcpNoDelay()和 setTcpNoDelay()方法用于获取和设置是否消除缓冲延迟。将值设置为 true 表示禁用缓冲延迟功能。


紧急数据
    假设你已经向一个慢速接收者发送了很多数据,突然又有了它急需的其它数据。如果将这些数据发送到输出流,它们将追加在常规数据队列的后面,无法保证接收者能够立即接收。为了解决这个问题,TCP 协议中包含了紧急(urgent)数据的概念,这类数据可以(理论上来说)跳到前面去。由于它们能够绕过常规数据流,这些数据称为频道外数据。
Socket: 紧急数据
    void sendUrgentData(int data)
    boolean getOOBInline()
    void setOOBInline(boolean on)

    要发送紧急数据需要调用 sendUrgentData() 方法,它将发送其 int 参数的最低位字节。要接收这个字节,必须为 setOOBInline()方法传递 true 参数启用接收者对频道外数据的接收。该字节在接收者的输入流中被接收。发送于紧急字节之前的数据将处于接收者的输入流中的紧急字节前面。如果没有启用接收者接收频道外数据的功能,紧急字节将被无声地丢弃。
    注意 Java 中的紧急数据几乎没什么用,因为紧急字节与常规字节按照传输的顺序混在了一起。实际上,Java 接收者并不能区分其是否在接收紧急数据。

关闭后停留
    当调用套接字的 close()方法后,即使套接字的缓冲区中还有没有发送的数据,它也将立即返回。这样不发送完所有数据可能导致的问题是主机将在后面的某个时刻发生故障。
其实可以选择让 close()方法"停留"或阻塞一段时间,直到所有数据都已经发送并确认,或发生了超时。详情见第 6.4.2 节
Socket: 在 close()方法停留
    int getSoLinger()
    void setSoLinger(boole
如果调用 setSoLinger()并将其设置为 true,那么后面再调用的 close()方法将阻塞等待,直到远程终端对所有数据都返回了确认信息,或者发生了指定的超时(秒)。如果发生了超
时,TCP 连接将强行关闭。如果开启了停留功能,getSoLinger()方法将返回指定的超时时间,否则返回-1。

int getSoLinger()
void setSoLinger(boolean on, int linger)

分享到:
评论

相关推荐

    Java Socket聊天和文件传输工具(更新)

    文档则可能包含关于如何运行程序、配置参数以及解决常见问题的说明。 总的来说,这个Java Socket聊天和文件传输工具是一个很好的学习和实践案例,涵盖了网络编程、多线程、文件I/O等多个Java核心技术。无论是对初学...

    最近开发的一个 java socket项目

    在本项目中,我们关注的是一个基于Java Socket编程的开发实例。Java Socket是Java网络编程的基础,它提供了在网络中两台计算机之间建立通信链接的能力。在这个"最近开发的一个 Java socket项目"中,开发者可能实现了...

    Java Socket源码

    - Java Socket API的官方文档,详细解释了各个方法的功能、参数和返回值。 - 相关设计模式或最佳实践,指导如何高效地使用Socket进行网络编程。 - Socket编程中可能出现的问题和解决方案。 9. **Exe.rar** 文件...

    java socket查询数据库实现登录验证.zip

    Java Socket编程是网络编程的基础,它允许两个应用之间建立直接的、双向的通信。在这个"java socket查询数据库实现登录验证"的示例中,我们将深入探讨如何使用Java Socket连接到数据库,进行用户登录验证。 首先,...

    java socket编程实例(出自《java大学教程》)

    在《Java大学教程》中,通常会通过实例来详细解释和演示这些概念。本实例集中,我们关注的是三个关键的Socket编程示例,旨在帮助初学者理解其工作原理和应用。 1. **基础Socket连接** - 客户端(Socket):通过`...

    Java socket简单示例

    下面将详细解释Java Socket的基本概念以及如何在实际应用中使用。 1. **Socket基础** - **Socket接口**:在Java中,`java.net.Socket` 类代表了TCP连接中的一个实例,它提供了双向通信通道,允许两个网络应用程序...

    SSLServerSocket.rar_java socket _java socket ssl_java ssl server

    在“Secure Login based on SSL Server Socket.txt”文件中,可能会包含具体实现这些步骤的代码示例和详细说明。例如,它可能涵盖如何创建和配置KeyStore,以及如何处理SSL/TLS握手过程中的异常。 为了增强安全性,...

    基于ssl的Java的socket网络通信

    本篇文章将详细讲解基于SSL(Secure Socket Layer)的Java Socket网络通信,帮助开发者理解如何在Java中实现安全的、加密的数据传输。 SSL是一种广泛使用的网络安全协议,它为网络通信提供了数据加密、服务器身份...

    JAVA服务器端应用Socket线程池

    #### 三、核心参数说明 - **`MAX_THREADS`**: 线程池的最大线程数量。 - **`MAX_SPARE_THREADS`**: 最大空闲线程数量。 - **`MIN_SPARE_THREADS`**: 最小空闲线程数量。 - **`WORK_WAIT_TIMEOUT`**: 空闲线程等待新...

    Java SSLSocket的使用

    以下是对Java SSLSocket使用的一些关键知识点的详细解释: 1. **SSL/TLS协议**: SSL(Secure Socket Layer)协议最初由Netscape开发,现在已经被TLS(Transport Layer Security)协议取代。TLS协议提供了身份认证...

    Java_TCP_IP_Socket编程(原书第2版)

    以下是对Java TCP/IP Socket编程的一些关键知识点的详细说明: 1. **TCP/IP协议基础**:TCP/IP协议栈由四层组成,分别是应用层、传输层、网络层和数据链路层。TCP(Transmission Control Protocol)是传输层协议,...

    Socket说明文档(英文版)

    一个 Socket 包括 IP 地址和端口号,这两个参数共同标识了一个特定的网络连接。 2. **Socket类型**:主要分为两种类型: - **流式 Socket (TCP)**:基于 TCP 协议,提供面向连接的服务,确保数据的可靠传输。 - **...

    oracle Socket监听数据库推送信息

    - Java Socket是Java提供的网络通信API,允许应用程序作为客户端(Socket)或服务器(ServerSocket)进行双向通信。 - 在Oracle数据库监听中,Java程序会启动一个ServerSocket,等待数据库通过Socket连接并发送...

    java阻塞式socket服务

    Java阻塞式Socket服务是网络编程中的基础组件,主要用于客户端和服务器之间的通信。在这个场景下,我们使用Java标准库中的`java.net.Socket`和`java.net.ServerSocket`类来建立和管理连接。以下是对这个主题的详细...

    javaQQ聊天室+SocketTCP

    在Java编程语言中,Socket TCP通信是用于网络应用程序间建立通信连接的重要机制。在这个JavaQQ聊天室示例中,我们看到客户端(ChatRoomClient)和服务器(ChatRoomServer)使用Socket进行TCP通信来实现简单的聊天...

    java写局域网通讯工具(只需jdk1.7即可运行!)

    Java局域网通讯工具是一种基于...其核心在于理解并应用Java的网络编程概念,如Socket和ServerSocket,以及如何管理并发连接,设置通信参数等。对于初学者和开发者来说,这是一个很好的学习和实践Java网络编程的实例。

    Socket中文注释版本

    注释通常包括功能描述、参数说明、返回值和可能的异常情况,有助于理解Socket编程的细节。 5. **FlawlessCode**:这个文件名可能表示提供的代码是无错误的示例,可以作为模板或参考,帮助开发者快速构建自己的...

    Java虚拟机JVM参数配置说明.pdf

    这会显示包括`java.exe`工具和JVM的所有命令行选项,其中包括了标准选项和非标准选项的详细说明。 #### 总结 正确配置JVM非标准参数对于提高Java应用在生产环境中的性能和稳定性具有重要意义。开发人员应当根据...

    java源码包---java 源码 大量 实例

     Java语言开发的简洁实用的日期选择控件,源码文件功能说明:  [DateChooser.java] Java 日期选择控件(主体类) [public]  [TablePanel.java] 日历表格面板  [ConfigLine.java] 控制条类  [RoundBox.java] ...

    java实现的模拟ping功能

    ##### 3.2 主要代码段解释 - **创建线程池**:为了提高并发性能,程序使用了`ThreadPoolExecutor`来管理线程池。这样可以在多个线程中并行执行Ping操作,减少总的执行时间。 ```java ThreadPoolExecutor ...

Global site tag (gtag.js) - Google Analytics