Java的ServerSocket和Socket是开发网络应用程序的基础。ServerSocket和Socket类是java自带的,(java.net.ServerSocket和java.net.Socket)。
我不打算再重复叙述Java文档中关于这两个类的描述,只是想把使用者两个类中的一些经验写下来。
ServerSocket 的队列长度
ServerSocket最常见的是accept方法,接受一个客户端连接请求,这样,客户端和服务器端都持有一个Socket可以互相通信。在多并发程序中,尤其是基于短连接客户端,服务器端会非常频繁的accept,那么瓶颈可能就会出现在这里。
在ServerSocket的accept时,如果还没有accept成功,过来了其他的连接请求,会放在ServerSocket的队列中,处理完当前的连接请求,就会处理队列中的,这样,对外的表现就是服务器端“挂住”了这个客户端连接,因为accept也很快,所以这个客户端连接也将很快得到处理。
这样看来,对服务器系统来讲,ServerSocket的队列长度就非常关键,而我们在编程时,可以显示的指定这个长度。
ServerSocket的构造方法:
public ServerSocket(int port, int backlog)
其中的backlog就是指的这个队列的长度。当然,最常用的构造方法:
public ServerSocket(int port)
在文档中说明如下:
输入连接指示(对连接的请求)的最大队列长度被设置为 50
。如果队列满时收到连接指示,则拒绝该连接。
也就是说,这种构造方法,实际上对backlog赋了默认值50。
一般情况下,也够用了。但是这里要提醒一句就是,轻易不要使用系统默认值,因为不同版本的java,默认值可能不同;而不同厂商的java,默认值更是有可能不同(例如Oracle和IBM),自己控制更稳妥。
Socket的TCP_NODELAY
socket在创建的时候,默认都是使用Nagle算法的,这会导致交互速度严重下降,Nagle算法是为了解决这一的问题:例如在典型情况下,传送一个只拥有1个字节有效数据的数据包,却要发费40个字节长包头(即ip头20字节+tcp头20字节)的额外开销,这造成有效载荷(payload)利用率极其低下。
Nagle算法的改进是:Nagle算法的改进在于:如果发送端欲多次发送包含少量字符的数据包,将数据都缓存起来而不立即发送,直到满足一定的条件,例如积攒到了一定数量的数据(比如缓存的字 符数据已经达到数据包报文段的最大长度)等多种情况才将其组成一个较大的数据包发送出去。
可见这种算法在对延迟要求非常高的系统中,会造成等待和延迟。所以我们视系统的类型,根据需要,在创建Socket时,加上TCP_NODELAY属性。
public void setTcpNoDelay(boolean on) throws SocketException
当然,对特定的系统,会增加网络的负担。
再有两条,一是一定要设置TCP_TIMEOUT,再有就是So_Lingle,这两条对高并发系统至关重要。TimeOut关乎稳定性和健壮性,尤其是基于长连接的系统;So_Lingle关系到“半关闭”状态的连接,因为操作系统都有“最大打开文件数”的限制,所以对系统的并发性能有很大的作用。
这两条,我将在下一篇文章里详细描述。
需要指出的是,Java的Socket都是调用的操作系统的本地实现,因此,Java Socket的参数的作用和意义,还要取决于操作系统TCP协议栈的实现。
相关推荐
综上所述,《Java TCP/IP Socket编程》(原书第2版)是一本全面且深入的指南,无论你是初学者还是有一定经验的开发者,都能从中获得宝贵的知识和实践经验,助力你在网络编程领域取得更大的成就。
Java 多线程和 Socket 编程实验报告 本实验报告主要介绍 Java 中多线程和 Socket 编程的基本概念和实现方法。通过实验,我们掌握了网络编程的基本概念,如客户机、服务器、协议、端口等,并且了解了 Java.net 包中...
首先,Socket编程涉及的主要类有`ServerSocket`和`Socket`。`ServerSocket`类用于创建服务器端的监听套接字,它会在指定的端口上等待客户端的连接请求。而`Socket`类则代表客户端到服务器的连接,每个连接都会创建一...
Java 线程循环和 ServerSocket 与 Socket 编程 Java 线程循环是指在 Java 中使用多线程技术来实现循环操作,线程循环输出:线程名 run XX 次!每次循环休眠一定的时间,该时间有属性决定。在 Java 中,可以使用 ...
在Java中,Socket编程主要涉及两个关键类:`ServerSocket`和`Socket`。`ServerSocket`类用于服务器端,它监听指定端口的连接请求。创建一个`ServerSocket`实例,例如`ServerSocket server = new ServerSocket(9998);...
Java Socket 编程总结 Java Socket 编程是Java语言中用于网络编程的主要技术之一。...Java提供了多种Socket类,例如Socket类、ServerSocket类等,这些类提供了创建Socket、监听Socket、连接Socket、读写Socket等功能。
在Java中,`java.net.Socket`和`java.net.ServerSocket`类是Socket编程的主要工具。 1. **Socket类**: - `Socket`类代表TCP连接的一端,用于建立客户端与服务器之间的连接。它的构造函数通常需要指定服务器的IP...
Java TCP/IP Socket编程是网络通信领域中的核心技术,广泛应用于服务器端和客户端之间的数据传输。本资源包含第二版书籍的相关源码,旨在帮助开发者深入理解并实践Socket编程。以下是关于Java TCP/IP Socket编程的...
Java 多线程-Socket 编程是指在 Java 语言中使用多线程技术来实现网络编程,特别是使用 Socket 编程来实现客户端和服务器端的通信。在 Java 中,多线程可以使用 Thread 类和 Runnable 接口来实现,而 Socket 编程则...
在Java面试中,对Socket编程的理解和应用能力通常是评估开发者技能的重要标准。以下是对Socket编程的详细阐述: 1. **Java Socket编程基础** - Java中的Socket是网络通信的基础,它提供了两台计算机之间低级别的...
在Java中,Socket编程主要涉及两个关键类:`java.net.Socket`和`java.net.ServerSocket`。`ServerSocket`用于创建服务器端的监听点,等待客户端的连接请求;`Socket`则表示客户端与服务器之间的一个连接实例,用于...
在Java中,Socket和ServerSocket类位于`java.net`包中。ServerSocket用于服务器端,用来监听特定端口,等待客户端的连接请求。Socket则是建立网络连接时使用的,连接成功后,服务器和客户端都会创建一个Socket实例,...
2. **Java Socket类库**:Java提供了java.net.Socket和ServerSocket类来支持TCP/IP通信。Socket代表一个连接的两端,一个在客户端,另一个在服务器端。ServerSocket用于监听客户端的连接请求。 3. **建立连接**:...
2. Socket和ServerSocket:Socket用于客户端,ServerSocket用于服务器端,两者是TCP通信的主要接口。 3. DatagramSocket和DatagramPacket:用于UDP通信,DatagramSocket是发送和接收UDP数据包的类,DatagramPacket则...
在Java中,`java.net.Socket`和`java.net.ServerSocket`类是进行Socket通信的核心。ServerSocket监听特定端口,等待客户端的连接请求;Socket则用于建立与ServerSocket的连接,并进行数据交换。 2. **文件I/O操作**...
- 在通信完成后,记得关闭Socket和相关的流,以释放系统资源。通常使用`close()`方法关闭Socket,这将导致连接中断,同时关闭与之关联的输入/输出流。 6. **异常处理**: - 在进行Socket编程时,应充分考虑网络...
5. **关闭连接**:在完成数据交换后,客户端和服务器都需要关闭Socket和相关的流,释放系统资源。通常,先关闭写入流,然后关闭读取流,最后关闭Socket。 6. **异常处理**:在网络编程中,由于网络环境的不确定性,...
Java TCP/IP Socket编程是Java网络通信的核心技术,广泛应用于服务器端和客户端之间的数据传输。这本书的第二版深入探讨了如何使用Java实现TCP/IP协议栈的socket接口,为开发者提供了全面的理论知识和实践指导。 ...