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线程循环和serversocket和socket的程序借鉴.pdf
本文系统讲解了java网络编程,serverSocket的使用方法及实例
有关java线程循环和serversocket和socket的程序.pdf
有关java线程循环和serversocket和socket的程序分享.pdf
Java 实例 - ServerSocket 和 Socket 通信实例源代码+详细指导教程.zip
Socket与ServerSocket编程实践聊天,服务器和客户端频繁通信
import java.io.*; import java.net.*; import java.util.*; import java.lang.*; public class Server extends ServerSocket { private static ArrayList User_List = new ArrayList(); private static ...
Java为TCP协议提供了两个类:Socket类和ServerSocket类。一个Socket实例代表了TCP连接的一个客户端,而一个ServerSocket实例代表了TCP连接的一个服务器端,一般在TCP Socket编程中,客户端有多个,而服务器端只有一...
a) 使用ServerSocket、Socket完成服务端和客户端的连接。 b) 服务端使用多线程的方式可以接受多个客户端。 c) 使用对象的方式,在服务端和客户端之间传送数据。
本资料提供的是用Socket编程实现聊天程序。 有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,...
Java网络编程的基础知识、套接字编程、非阻塞通信、创建HTTP服务器与客户程序、数据报通信、对象的序列化与反序列化、Java反射机制、RMI框架、JDBC API、JavaMail API、MVC设计模式、安全网络通信、CORBA和Web服务
以J2SDK-1.3为例,Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器端,Socket 是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。...
实现了nodejs与java的相互通信功能,包括nodeClient访问javaServer,以及javaClient访问nodeServer,亲测有效,如果有问题请在下方留言,一定及时解答
Android完全支持JDK本身的TCP,UDP网络通信API,也可以使用ServerSocket,Socket来建立基于TCP/IP协议的网络通信,也可以使用DatagramSocket,Datagrampacket来建 立基于UDP协议的网络通信
Socket类是负责处理客户端通信的Java类。本文主要是介绍java使用Socket类接收和发送数据,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
一个用Socket和ServerSocket请求资源的例子
Java网络编程基础 ServerSocket类使用.doc 《JAVA编程规范》.doc Java基础 三步学会Java Socket编程(一) .doc Java基础 三步学会Java Socket编程(二) .doc Java基础 三步学会Java Socket编程(三).doc
本文介绍一种用Java的Socket和ServerSocket实现服务器和客户机通讯的的方法。原理是在服务器端建立ServerSocket端口并监听,接收到客户端的连接请求时建立Socket,得到Socket的输入输出流。在客户端新建Socket并获得...
java socket nginx tcp转发 用户真实IP测试,文章请看我的博客
基于TCP协议的Socket编程 ① 创建TCP服务端步骤: a) 创建一个ServerSocket对象 b) 调用accept()方法接受客户端请求 c) 从Socket中获取I/O流 d) 对I/O流进行读写操作,完成与客户端的交互 e) 关闭I/O流和...