阻塞和超时
Socket的I/O调用可能会因为多种原因而阻塞。数据输入方法read()和receive()在没有数据可读时会阻塞。TCP套接字的write()方法在没有足够的空间缓存传输的数据时可能阻塞。ServerSocket的accept()方法和Socket的构造函数都会阻塞等待,直到连接建立。同时,长的信息往返时间,高错误率的连接和慢速的(或已发生故障的)服务器,都可能导致需要很长的时间来建立连接。所有这些情况,只有在连接请求得到满足后这些方法才会返回。当然,调用一个已经阻塞的方法将使应用程序停止(并使运行它的线程无效)。
accept() . read() 和receive()
对于这些方法,我们可以使用Socket类,ServerSocket类和DatagramSocket类的setSoTimeout()方法,设置其阻塞的最长时间(以毫秒为单位)。如果在指定时间内这些方法没有返回,则将抛出一个InterruptedIOException异常。对于Socket实例,在调用read()方法之前,我们还可以使用该套接字的InputStream的available()方法来检测是否有可读的数据。
连接和写数据
Socket类的构造函数会尝试根据参数中指定的主机和端口号来建立连接,并阻塞等待,直到连接成功建立或发生了系统定义的超时。不幸的是,系统定义的超时时间很长,而JAVA又没有提供任何缩短它的方法。要改变这种情况,可以使用Socket类的无参数的构造函数,它返回的是一个没有建立连接的Socket实例。需要建立连接时,调用该实例的connect()方法,并指定一个远程终端和超时时间(毫秒)
write()方法调用也会阻塞等待,直到最后一个字节成功写入到了TCP实现的本地缓存中。如果可用的缓存空间比要写入的数据小,在write()方法调用返回前,必须把一些数据成功传输到连接的另一端。因此,write()方法的阻塞总时间最终还是取决于接收端的应用程序。不幸的是java现在还没有提供任何使write()超时或由其他线程将其打断的方法。所以如果一个可以在Socket实例上发送大量数据的协议可能会无限期地阻塞下去。
发送和接收缓冲区大小
Socket DatagramSocket 设置发送接收缓冲区大小,setReceiveBufferSize(),setSendBufferSize() ,该大小以字节为单位。需要注意的是,这里指定的大小只是作为一种建议给出的,实际大小可能与之存在差异。
ServerSocket 设置所接受套接字的接收缓冲区大小,setReceiveBufferSize()方法用于设置由accept()方法创建的Socket实例的接收缓冲区的大小(字节)
地址重用
在某些情况下,可能希望能够将多个套接字绑定到同一个套接字地址。对于UDP多播的情况,在同一个主机上可能有多个应用程序加入了相同的多播组。对于TCP,当一个连接关闭后,通信的一端(或两端)必须在“TIme-Wait” 状态上等待一段时间,以对传输途中丢失的数据包进行清理。不幸的是,通信终端可能无法等到Time-Wait结束。对于这两种情况,都需要能够与正在使用的地址进行绑定的能力,这就要求实现地址重用。
Socket ServerSocket DatagramSocket 设置地址重用 ,setReuseAddress(boolean on)
分享到:
相关推荐
本文将深入探讨Java中如何利用TCP进行网络通信,主要基于提供的“Java TCP”相关资料,特别是“031904_【第19章:Java网络编程】_TCP程序设计笔记.pdf”。 首先,TCP是一种面向连接的、可靠的传输层协议,它确保...
标题“JAVA学习笔记4”和描述“JAVA语言学习路上的笔记4,通过实际结合总结,使用Eclipse编辑代码”所涉及的知识点是Java语言的学习和实践,尤其是涉及到Java网络程序设计。这部分内容中提及了TCP网络编程以及相关的...
8. **网络编程**:Java提供了Socket和ServerSocket类来进行TCP/IP通信,笔记可能会讲解如何创建客户端和服务端,进行数据的收发。 9. **JNI(Java Native Interface)**:如果笔记深入,可能会触及JNI,它是Java与...
12. **网络编程**:Java的Socket编程允许创建客户端和服务器应用程序,实现基于TCP/IP的网络通信。 13. **反射**:Java反射API允许程序在运行时动态访问和修改类的信息,如创建对象、调用方法、访问字段等,增强了...
- **网络编程基础**:Java支持TCP/IP协议栈,提供了Socket类来实现客户端和服务端之间的通信。 #### 第十一章:反射机制 - **反射基础**:反射允许程序在运行时检查类的信息并动态创建对象或调用方法。这对于框架...
Java 6学习笔记是针对初学者和有一定经验的开发者提供的一份全面的教育资源,它涵盖了Java编程语言的基础到高级概念。这份笔记旨在帮助读者深入理解Java 6的关键特性,提高编程技能,并为实际项目开发打下坚实基础。...
#### 第四章:异常机制 - **异常处理:** 异常处理机制帮助程序在出现错误时能够优雅地处理问题。 - **异常的分类:** 检查异常(checked exceptions)和运行时异常(runtime exceptions)。 - **try-catch-finally...
2. 网络编程:Socket编程是Java实现网络通信的核心,理解TCP/IP协议和套接字的工作原理,可以开发网络应用。 六、多线程 1. 线程与进程:理解线程与进程的区别,掌握如何在Java中创建和管理线程,是实现并发编程的...
18. **网络编程**:使用Socket和ServerSocket进行TCP/IP通信,以及URL和URLConnection进行HTTP请求。 19. **反射API**:通过反射动态地获取类的信息和调用方法,实现代码的灵活性。 20. **注解(Annotation)**:...
- **Socket通信**:客户端与服务器端的TCP/IP连接,数据的发送与接收。 - **URL和URLConnection**:使用URL和URLConnection进行HTTP请求。 9. **反射机制**: - **Class类**:通过Class对象获取类的信息,如类名...
5. **异常处理**(马士兵_J2SE第四章__Java_异常处理个人学习笔记.doc):Java通过异常处理机制来处理程序运行时可能出现的问题。异常是一种特殊的对象,可以通过try-catch-finally语句块来捕获和处理,提高代码的...
Java的`java.net`包提供了进行网络编程的接口和类,如Socket和ServerSocket用于TCP通信,DatagramSocket和DatagramPacket用于UDP通信。理解网络编程的基础知识,如TCP/IP协议栈、套接字编程,对于开发网络应用至关...
TCP/IP协议内部包含一系列的用于处理数据通信的协议,并采用了4层的分层模型,每一层都呼叫它的下一层所提供的协议来完成自己的需求。 网络通信协议可以分为面向连接的协议和面向无连接的协议,例如TCP协议和UDP...
- **Socket编程**:基于TCP/IP协议的网络通信,用于建立客户端与服务器端的连接。 - **URL和URLConnection**:用于获取网络资源,处理HTTP请求和响应。 8. **JDBC数据库操作** - **连接数据库**:使用...
学习者需要掌握TCP/IP协议,了解客户端/服务器模型,以及如何通过Java进行网络通信。 4. **多线程**:Java支持多线程编程,Thread类和Runnable接口是主要的实现方式。理解线程的生命周期,学会同步控制...
在TCP/IP协议栈中,socket接口定义了应用程序如何通过IP网络进行通信。 2. **TCP/IP协议**:TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,而IP(互联网协议)则是负责在不同网络之间...
### Java入门学习笔记 #### 一、Java特点与运行原理 **1.1 Java特点** - **简单性:** Java的设计使得它易于学习且避免了许多传统编程语言中存在的复杂性。 - **面向对象:** Java是一种纯面向对象的语言,支持...
### Java开发笔记知识点详解 #### 一、基础知识 **标题:** Java学习笔记 **描述:** 关于Java开发的一些笔记,旨在帮助大家共同学习进步。 **关键词:** Java开发、笔记、学习 #### 二、日期处理 1. **日期格式...
7. **网络编程**:Java的Socket编程允许创建客户端和服务器应用,进行TCP/IP通信。熟悉Socket和ServerSocket类,可以开发基于网络的服务。 8. **泛型**:泛型提供了一种在编译时检查类型安全,并且所有的强制转换都...
8. **网络编程**:许多嵌入式设备需要联网功能,因此网络编程是必备技能,包括TCP/IP协议栈的理解、socket编程等。 9. **嵌入式编程语言**:C和C++是最常用的嵌入式开发语言,此外,Python、Java等高级语言也在某些...