Java Socket的api可能很多人会用,但是Java Socket的参数可能很多人都不知道用来干嘛的,甚至都不知道有这些参数。
backlog
用于ServerSocket,配置ServerSocket的最大客户端等待队列。等待队列的意思,先看下面代码
public class Main { public static void main(String[] args) throws Exception { int port = 8999; int backlog = 2; ServerSocket serverSocket = new ServerSocket(port, backlog); Socket clientSock = serverSocket.accept(); System.out.println("revcive from " + clientSock.getPort()); while (true) { byte buf[] = new byte[1024]; int len = clientSock.getInputStream().read(buf); System.out.println(new String(buf, 0, len)); } } }
这段测试代码在第一次处理一个客户端时,就不会处理第二个客户端,所以除了第一个客户端,其他客户端就是等待队列了。所以这个服务器最多可以同时连接3个客户端,其中2个等待队列。大家可以telnet localhost 8999测试下。
这个参数设置为-1表示无限制,默认是50个最大等待队列,如果设置无限制,那么你要小心了,如果你服务器无法处理那么多连接,那么当很多客户端连到你的服务器时,每一个TCP连接都会占用服务器的内存,最后会让服务器崩溃的。
另外,就算你设置了backlog为10,如果你的代码中是一直Socket clientSock = serverSocket.accept(),假设我们的机器最多可以同时处理100个请求,总共有100个线程在运行,然后你把在100个线程的线程池处理clientSock,不能处理的clientSock就排队,最后clientSock越来越多,也意味着TCP连接越来越多,也意味着我们的服务器的内存使用越来越高(客户端连接进程,肯定会发送数据过来,数据会保存到服务器端的TCP接收缓存区),最后服务器就宕机了。所以如果你不能处理那么多请求,请不要循环无限制地调用serverSocket.accept(),否则backlog也无法生效。如果真的请求过多,只会让你的服务器宕机(相信很多人都是这么写,要注意点)
TcpNoDelay
禁用纳格算法,将数据立即发送出去。纳格算法是以减少封包传送量来增进TCP/IP网络的效能,当我们调用下面代码,如:
Socket socket = new Socket(); socket.connect(new InetSocketAddress(host, 8000)); InputStream in = socket.getInputStream(); OutputStream out = socket.getOutputStream(); String head = "hello "; String body = "world\r\n"; out.write(head.getBytes()); out.write(body.getBytes());
我们发送了hello,当hello没有收到ack确认(TCP是可靠连接,发送的每一个数据都要收到对方的一个ack确认,否则就要重发)的时候,根据纳格算法,world不会立马发送,会等待,要么等到ack确认(最多等100ms对方会发过来的),要么等到TCP缓冲区内容>=MSS,很明显这里没有机会,我们写了world后再也没有写数据了,所以只能等到hello的ack我们才会发送world,除非我们禁用纳格算法,数据就会立即发送了。
纳格算法参考:http://zh.wikipedia.org/wiki/%E7%B4%8D%E6%A0%BC%E7%AE%97%E6%B3%95
另外有一篇讲解纳格算法和delay ack的文章(挺不错的):http://blog.csdn.net/frankggyy/article/details/6624401
SoLinger
当我们调用socket.close()返回时,socket已经write的数据未必已经发送到对方了,例如
Socket socket = new Socket(); socket.connect(new InetSocketAddress(host, 8000)); InputStream in = socket.getInputStream(); OutputStream out = socket.getOutputStream(); String head = "hello "; String body = "world\r\n"; out.write(head.getBytes()); out.write(body.getBytes()); socket.close();
这里调用了socket.close()返回时,hello和world未必已经成功发送到对方了,如果我们设置了linger而不小于0,如:
bool on = true; int linger = 100; .... socket.setSoLinger(boolean on, int linger) ...... socket.close();
那么close会等到发送的数据已经确认了才返回。但是如果对方宕机,超时,那么会根据linger设定的时间返回。
UrgentData和OOBInline
TCP的紧急指针,一般都不建议使用,而且不同的TCP/IP实现,也不同,一般说如果你有紧急数据宁愿再建立一个新的TCP/IP连接发送数据,让对方紧急处理。
所以这两个参数,你们可以忽略吧,想知道更多的,自己查下资料。
SoTimeout
设置socket调用InputStream读数据的超时时间,以毫秒为单位,如果超过这个时候,会抛出java.net.SocketTimeoutException。
KeepAlive
keepalive不是说TCP的常连接,当我们作为服务端,一个客户端连接上来,如果设置了keeplive为true,当对方没有发送任何数据过来,超过一个时间(看系统内核参数配置),那么我们这边会发送一个ack探测包发到对方,探测双方的TCP/IP连接是否有效(对方可能断点,断网),在Linux好像这个时间是75秒。如果不设置,那么客户端宕机时,服务器永远也不知道客户端宕机了,仍然保存这个失效的连接。
SendBufferSize和ReceiveBufferSize
TCP发送缓存区和接收缓存区,默认是8192,一般情况下足够了,而且就算你增加了发送缓存区,对方没有增加它对应的接收缓冲,那么在TCP三握手时,最后确定的最大发送窗口还是双方最小的那个缓冲区,就算你无视,发了更多的数据,那么多出来的数据也会被丢弃。除非双方都协商好。
以上的参数都是比较重要的Java Socket参数了,其他就不另外说明了。
相关推荐
以下是关于Java Socket编程和远程执行任务的详细知识讲解。 1. **Java Socket基础**: - Java Socket是Java提供的网络编程接口,它允许两个应用程序通过TCP/IP协议进行双向通信。 - Socket分为ServerSocket和...
本教程针对"IBM Java socket"进行了深入浅出的讲解,覆盖了客户端、服务器、多线程以及连接池等多个关键知识点,适合初学者及有一定基础的开发者提升技能。 首先,Java Socket是Java标准库提供的API,用于实现应用...
Java串口、数据库和Socket通信是计算机编程中的基础但至关重要的技术,特别是在构建分布式系统或进行设备交互时。本文将详细讲解这三个领域的基础知识及其在实际应用中的重要性。 首先,让我们了解一下**Java串口...
本篇文章将详细讲解基于SSL(Secure Socket Layer)的Java Socket网络通信,帮助开发者理解如何在Java中实现安全的、加密的数据传输。 SSL是一种广泛使用的网络安全协议,它为网络通信提供了数据加密、服务器身份...
原书第二版深入浅出地讲解了Java Socket编程的各个方面,为开发者提供了全面的学习资源。以下是对Java TCP/IP Socket编程的一些关键知识点的详细说明: 1. **TCP/IP协议基础**:TCP/IP协议栈由四层组成,分别是应用...
2. **Java Socket编程**:深入讲解Java中的Socket类和ServerSocket类,以及如何使用InputStream和OutputStream进行数据交换。还会涉及异常处理和连接关闭等关键点。 3. **多线程**:多线程是并发处理的基础,允许...
本项目着重讲解了如何使用Java与C语言通过Socket进行通信,实现一个基于Web的党费上交系统。在这个系统中,Java负责前端展示和部分业务逻辑,而C则作为后端服务,处理数据存储与查询,两者之间通过Socket进行数据...
- 《OReilly.Java.Threads.3rd.Edition.Sep.2004.eBook-DDU.chm》:关于Java多线程编程的书籍,虽然不直接涉及JDBC和Socket,但理解线程同步和并发对于构建高效服务器端应用至关重要。 - 《JDBC Practical Guide ...
本项目基于Java JDBC和Socket编程实现,为用户提供类似于QQ的即时通讯功能,包括发送消息、接收消息以及可能的头像显示等功能。下面将详细讲解其中涉及的关键技术点。 1. **Java基础**: - **类与对象**:QQ聊天...
Java作为一种广泛使用的编程语言,其设计理念和技术特点对于学习者来说至关重要。 #### 二、Java语言的基础知识 1. **Java语言的特点**: - 面向对象:Java是一种完全面向对象的语言,支持封装、继承、多态等特性...
Java提供了Socket编程接口,可以用来创建客户端和服务器应用程序。理解TCP和UDP协议,以及如何利用Java进行套接字通信,是进行网络应用开发的基础。 通过全面学习以上内容,你将能够掌握Java的高级编程技巧,从而在...
Java以其“一次编写,到处运行”的跨平台特性,以及在企业级应用、移动开发(尤其是Android)、云计算等领域的重要地位,成为了众多开发者首选的语言。 一、Java基础 1. **环境配置**:学习Java的第一步是安装Java...
在IT行业中,编程语言与硬件设备的交互是一个重要的领域,特别是在工业自动化中,Java语言用于与西门子PLC(可编程逻辑控制器)进行通信是一个常见的需求。本篇将详细探讨"JAVA程序与PLC通信——学习使用"这一主题,...
本文将详细介绍Java中线程的创建与管理,包括两种主要的实现方式:继承`Thread`类和实现`Runnable`接口,并对线程的基本操作方法以及同步和死锁的概念进行深入探讨。 #### 三、Java多线程实现方式 ##### 1. 继承...
25章的讲义将阐述如何使用Java进行TCP/IP通信,包括套接字(Socket)和服务器套接字(ServerSocket)的使用,以及数据的发送和接收。 异常处理和断言是保证程序健壮性的关键。15章的讲义会讲解Java的异常体系,如何...
Java课程讲义主要涵盖从Java入门到进阶的多个核心主题,旨在帮助初学者建立起坚实的编程基础,并逐步提升技能水平。以下将详细讲解这些主题: 1. **Java初览**: 这部分通常会介绍Java的历史背景,为什么选择Java...
2. **环境配置**:讲解如何安装Java Development Kit (JDK) 和设置环境变量,使计算机能够识别并运行Java程序。 3. **语法基础**:包括基本数据类型(如整型、浮点型、字符型、布尔型)、变量、常量的定义与使用,...
Java中的`URL`类可以方便地解析和操作URL,如获取参数和锚点。 3. `Socket`和`ServerSocket`:这两个类用于实现基于TCP的网络通信。`Socket`是客户端,用于建立与服务器的连接并发送数据,`ServerSocket`是服务器端...