java socket参数详解:SoLinger

本文详细解释了SO_LINGER选项的工作原理,如何通过设置它来影响Socket关闭过程,以及如何利用这一特性确保数据完整传输。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

启用/禁用具有指定逗留时间(以秒为单位)的 SO_LINGER。最大超时值是特定于平台的。 该设置仅影响套接字关闭。默认值为-1,表示禁用。
这个
Socket选项可以影响close方法的行为。在默认情况下,当调用close方法后,将立即返回;如果这时仍然有未被送出的数据包,那么这些数据包将被丢弃。如果将linger参数设为一个正整数n时(n的值最大是65,535),在调用close方法后,将最多被阻塞n秒。在这n秒内,系统将尽量将未送出的数据包发送出去;如果超过了n秒,如果还有未发送的数据包,这些数据包将全部被丢弃;而close方法会立即返回。如果将linger设为0,和关闭SO_LINGER选项的作用是一样的。
package socket;

import java.io.*;
import java.net.Socket;
import java.net.UnknownHostException;
import org.apache.log4j.Logger;

public class Test_solinger {
	private static Logger logger = Logger.getLogger(Test_solinger.class);

	public static void main(String[] args) {
		BufferedReader in = null;
		PrintWriter out = null;
		try {
			String ip = "127.0.0.1";
			Socket socket = new Socket(ip, 10000);
			in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			out = new PrintWriter(socket.getOutputStream());
			logger.debug(socket.getSoLinger());
			
			/**
			 * 这里调用了socket.close()返回时,hello和world未必已经成功发送到对方了,如果我们设置了linger而不小于0,那么close会等到发送的数据已经确认了才返回。
			 * 但是如果对方宕机,超时,那么会根据linger设定的时间返回。
			 * 有了后面三句,socket关闭后, 服务端也会收到信息
			 */ 
			boolean on = true;
			int linger = 100;
			socket.setSoLinger(on, linger);

			String head = "hello ";
			String body = "world\r\n";
			out.write(head);
			out.write(body);
			socket.close();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值