您的位置:首页 > 编程语言 > Java开发

java socket参数详解:SoLinger

2014-05-21 19:05 274 查看
原文链接:http://blog.csdn.net/huang_xw/article/details/7338612

启用/禁用具有指定逗留时间(以秒为单位)的 SO_LINGER。最大超时值是特定于平台的。 该设置仅影响套接字关闭。默认值为-1,表示禁用。

这个Socket选项可以影响close方法的行为。在默认情况下,当调用close方法后,将立即返回;如果这时仍然有未被送出的数据包,那么这些数据包将被丢弃。如果将linger参数设为一个正整数n时(n的值最大是65,535),在调用close方法后,将最多被阻塞n秒。在这n秒内,系统将尽量将未送出的数据包发送出去;如果超过了n秒,如果还有未发送的数据包,这些数据包将全部被丢弃;而close方法会立即返回。如果将linger设为0,和关闭SO_LINGER选项的作用是一样的。

[java] view
plaincopyprint?

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();

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: