当前位置: 首页 > news >正文

用建站ABC做的网站 怎么营销最新国际新闻 大事件

用建站ABC做的网站 怎么营销,最新国际新闻 大事件,精品成品中韩网站源码免费,天津响应式网站建设制作SO_TIMEOUT选项是Socket的一个选项,用于设置读取数据的超时时间。它指定了在读取数据时等待的最长时间,如果在指定的时间内没有数据可读取,将抛出SocketTimeoutException异常。 SO_TIMEOUT的设置 默认情况下,SO_TIMEOUT选项的值…

SO_TIMEOUT选项是Socket的一个选项,用于设置读取数据的超时时间。它指定了在读取数据时等待的最长时间,如果在指定的时间内没有数据可读取,将抛出SocketTimeoutException异常。

SO_TIMEOUT的设置

默认情况下,SO_TIMEOUT选项的值为0,表示没有设置超时时间,Socket将一直阻塞等待数据的到达。如果将SO_TIMEOUT的值设置为一个非零的正整数,那么在读取数据时,如果在指定的时间内没有数据可读取,将抛出SocketTimeoutException异常。

可以通过Socket类的setSoTimeout()方法来设置SO_TIMEOUT选项的值,例如:

package com.morris.socket;import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;/*** Socket服务端,演示SO_TIMEOUT** 客户端可以使用nc命令*/
public class ReadTimeoutDemo {public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(8099);Socket socket = serverSocket.accept();socket.setSoTimeout(5000); // 设置超时时间为5秒InputStream inputStream = socket.getInputStream();try {byte[] buffer = new byte[1024];int len = inputStream.read(buffer);System.out.println(new String(buffer, 0 , len));} catch (Exception e) {System.out.println(e.getMessage());byte[] buffer = new byte[1024];int len = inputStream.read(buffer);System.out.println(new String(buffer, 0 , len));socket.close();serverSocket.close();}}
}

上面的例子中设置了SO_TIMEOUT的值为5000,单位为毫秒,也就是设置了读取数据的超时时间为5秒,如果在5秒内没有数据可读取,将抛出SocketTimeoutException异常,可以通过捕获这个异常来处理超时情况。

注意超时了只是会抛出了SocketTimeoutException异常,read()方法不再阻塞,连接并没有关闭,可以通过捕获这个异常后继续读取数据,或者关闭连接。

产生的系统调用如下:

socket(AF_INET6, SOCK_STREAM, IPPROTO_IP) = 4
setsockopt(4, SOL_IPV6, IPV6_V6ONLY, [0], 4) = 0
setsockopt(4, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
bind(4, {sa_family=AF_INET6, sin6_port=htons(8099), sin6_flowinfo=htonl(0), inet_pton(AF_INET6, "::", &sin6_addr), sin6_scope_id=0}, 28) = 0
listen(4, 50)
accept(4, {sa_family=AF_INET6, sin6_port=htons(44964), sin6_flowinfo=htonl(0), inet_pton(AF_INET6, "::ffff:127.0.0.1", &sin6_addr), sin6_scope_id=0}, [28]) = 5
read(5, 0x7f586012c6c0, 1024)           = -1 EAGAIN (Resource temporarily unavailable)
poll([{fd=5, events=POLLIN}], 1, 4935)  = 0 (Timeout)
read(5, 0x7f586012c6c0, 1024)           = -1 EAGAIN (Resource temporarily unavailable)

可以看到底层是使用poll的timeout参数来实现读取超时时间的设置。

poll的函数声明如下:

int poll(struct pollfd *fds, nfds_t nfds, int timeout);

设置连接超时时间

前面的代码通过SO_TIMEOUT选项来设置数据读取的超时时间,那么Socket之间建立连接的超时时间如何设置呢?

客户端建立连接时可以使用connect()来指定连接的超时时间:

package com.morris.socket;import java.io.IOException;
import java.io.InputStream;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;/*** Socket客户端,演示连接超时时间**/
public class ConnectTimeoutClientDemo {public static void main(String[] args) throws IOException {Socket socket = new Socket();socket.connect(new InetSocketAddress("localhost", 8099), 5000);}
}

在上述代码中,通过调用Socket的connect()方法来尝试连接服务器,并设置连接超时时间为5秒。如果在5秒内未能成功连接到服务器,将抛出SocketTimeoutException异常。

客户端产生的系统调用如下:

socket(AF_INET6, SOCK_STREAM, IPPROTO_IP) = 4
setsockopt(4, SOL_IPV6, IPV6_V6ONLY, [0], 4) = 0
fcntl(4, F_GETFL)                       = 0x2 (flags O_RDWR)
fcntl(4, F_SETFL, O_RDWR|O_NONBLOCK)    = 0
connect(4, {sa_family=AF_INET6, sin6_port=htons(8099), sin6_flowinfo=htonl(0), inet_pton(AF_INET6, "::ffff:127.0.0.1", &sin6_addr), sin6_scope_id=0}, 28) = -1 EINPROGRESS (Operation now in progress)
poll([{fd=4, events=POLLOUT}], 1, 0)    = 0 (Timeout)
clock_gettime(CLOCK_MONOTONIC, {tv_sec=10284, tv_nsec=286532200}) = 0
poll([{fd=4, events=POLLOUT}], 1, 4893) = 0 (Timeout)
poll([{fd=4, events=POLLOUT}], 1, 0)    = 0 (Timeout)

可以看到客户端的连接超时时间也是通过poll函数的timeout来实现的。

服务端可以下面的代码来演示抛出SocketTimeoutException异常:

package com.morris.socket;import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;/*** Socket服务端,演示连接超时时间** 使用nc命令执行两次后,再执行ConnectTimeoutClientDemo,这样就会抛出SocketTimeoutException*/
public class ConnectTimeoutServerDemo {public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket();serverSocket.bind(new InetSocketAddress(8099), 1);System.in.read();}
}

先使用nc命令执行两次消耗backlog的值,然后再ConnectTimeoutClientDemo,5s后就会抛出SocketTimeoutException。

默认连接超时时间

如果不设置连接超时时间,默认值是多少呢,会不会像读取超时时间一样一直等待呢?

我们可以使用下面的代码来测试默认的连接超时时间是多长:

package com.morris.socket;import java.io.IOException;
import java.net.Socket;/*** Socket客户端,演示连接超时时间**/
public class DefaultConnectTimeoutClientDemo {public static void main(String[] args) throws IOException {long start = System.currentTimeMillis();try {new Socket("localhost", 8099);} catch (Exception e) {e.printStackTrace();}System.out.println("cost: " + (System.currentTimeMillis() - start));}
}

同样配合ConnectTimeoutServerDemo和nc命令使用,运行结果如下:

java.net.ConnectException: Connection timed outat java.base/sun.nio.ch.Net.connect0(Native Method)at java.base/sun.nio.ch.Net.connect(Net.java:579)at java.base/sun.nio.ch.Net.connect(Net.java:568)at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:585)at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327)at java.base/java.net.Socket.connect(Socket.java:633)at java.base/java.net.Socket.connect(Socket.java:583)at java.base/java.net.Socket.<init>(Socket.java:507)at java.base/java.net.Socket.<init>(Socket.java:287)at com.morris.socket.DefaultConnectTimeoutClientDemo.main(DefaultConnectTimeoutClientDemo.java:14)
cost: 135866

可以看出整个过程花费了135秒,这个时间是怎么得来的呢?

client发送sync包,可能会在网络链路中丢失,也有可能server端因为各种原因未及时处理或者无法处理,则client要进行重新发送sync包,而这重试的次数就是由net.ipv4.tcp_syn_retries来决定,默认是6。第一次发送sync包,会进行1s的超时等待,第二次发送sync包,会进行2s的超市等待,如此类推,公式是2的N次方。

查看net.ipv4.tcp_syn_retries的值:

$ sysctl -a | grep net.ipv4.tcp_syn_retries
net.ipv4.tcp_syn_retries = 6

抓包数据:

$ tcpdump -nn -i lo port 8099
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes
11:44:02.238833 IP 127.0.0.1.53222 > 127.0.0.1.8099: Flags [S], seq 319321421, win 65495, options [mss 65495,sackOK,TS val 2026768840 ecr 0,nop,wscale 7], length 0
11:44:03.259673 IP 127.0.0.1.53222 > 127.0.0.1.8099: Flags [S], seq 319321421, win 65495, options [mss 65495,sackOK,TS val 2026769860 ecr 0,nop,wscale 7], length 0
11:44:05.329576 IP 127.0.0.1.53222 > 127.0.0.1.8099: Flags [S], seq 319321421, win 65495, options [mss 65495,sackOK,TS val 2026771930 ecr 0,nop,wscale 7], length 0
11:44:09.409633 IP 127.0.0.1.53222 > 127.0.0.1.8099: Flags [S], seq 319321421, win 65495, options [mss 65495,sackOK,TS val 2026776010 ecr 0,nop,wscale 7], length 0
11:44:17.489597 IP 127.0.0.1.53222 > 127.0.0.1.8099: Flags [S], seq 319321421, win 65495, options [mss 65495,sackOK,TS val 2026784090 ecr 0,nop,wscale 7], length 0
11:44:34.129690 IP 127.0.0.1.53222 > 127.0.0.1.8099: Flags [S], seq 319321421, win 65495, options [mss 65495,sackOK,TS val 2026800730 ecr 0,nop,wscale 7], length 0
11:45:06.769597 IP 127.0.0.1.53222 > 127.0.0.1.8099: Flags [S], seq 319321421, win 65495, options [mss 65495,sackOK,TS val 2026833370 ecr 0,nop,wscale 7], length 0

HttpClient的超时时间与Socket的超时时间的关系

以下是使用HttpClient设置超时时间的示例:

package com.morris.socket;import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;import java.io.IOException;/*** 验证HttpClient的超时时间与Socket超时时间的关系*/
public class HttpClientTimeoutDemo {public static void main(String[] args) throws IOException {// 创建 RequestConfig 实例,并设置超时时间RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(5000) // 连接超时时间,单位毫秒.setSocketTimeout(5000) // 读取超时时间,单位毫秒.build();// 将超时配置应用到 HttpClient 实例CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(requestConfig).build();HttpGet httpGet = new HttpGet("http://localhost:8099");httpClient.execute(httpGet);}
}

在上述示例中,setConnectTimeout设置了连接超时时间,即建立连接的最长等待时间。setSocketTimeout设置了读取超时时间,即从服务器读取数据的最长等待时间。

产生的系统调用如下:

socket(AF_INET6, SOCK_STREAM, IPPROTO_IP) = 10
connect(10, {sa_family=AF_INET6, sin6_port=htons(8099), sin6_flowinfo=htonl(0), inet_pton(AF_INET6, "::ffff:127.0.0.1", &sin6_addr), sin6_scope_id=0}, 28) = -1 EINPROGRESS (Operation now in progress)
poll([{fd=10, events=POLLOUT}], 1, 4922) = 0 (Timeout)

从系统调用中可以看到,在应用层httpclient设置的超时时间实际上对应的是底层socket的超时时间。

在使用HttpClient发起HTTP请求时,可以通过设置超时时间来控制连接、读取和写入的超时行为。超时时间可以确保请求在合理的时间范围内完成,避免长时间等待或无限期阻塞。


文章转载自:
http://conterminal.c7495.cn
http://shiftless.c7495.cn
http://acrylic.c7495.cn
http://jolliness.c7495.cn
http://yorkist.c7495.cn
http://nafud.c7495.cn
http://alpheus.c7495.cn
http://remunerate.c7495.cn
http://aphrodisia.c7495.cn
http://phasic.c7495.cn
http://subversion.c7495.cn
http://uncorruptible.c7495.cn
http://protend.c7495.cn
http://alfalfa.c7495.cn
http://debriefing.c7495.cn
http://owly.c7495.cn
http://arsenate.c7495.cn
http://moveable.c7495.cn
http://scolopendrid.c7495.cn
http://ectozoon.c7495.cn
http://fenghua.c7495.cn
http://headworker.c7495.cn
http://mele.c7495.cn
http://tomentum.c7495.cn
http://fight.c7495.cn
http://windowy.c7495.cn
http://garote.c7495.cn
http://freezer.c7495.cn
http://daedalian.c7495.cn
http://shankpiece.c7495.cn
http://biomagnify.c7495.cn
http://kersey.c7495.cn
http://hermeneutic.c7495.cn
http://fiery.c7495.cn
http://blasphemous.c7495.cn
http://monopteron.c7495.cn
http://nanoinstruction.c7495.cn
http://rove.c7495.cn
http://nameable.c7495.cn
http://preferable.c7495.cn
http://austral.c7495.cn
http://prohibitor.c7495.cn
http://rockoon.c7495.cn
http://expositorial.c7495.cn
http://iadl.c7495.cn
http://shippable.c7495.cn
http://zeal.c7495.cn
http://hotness.c7495.cn
http://scintilloscope.c7495.cn
http://lyophiled.c7495.cn
http://pooch.c7495.cn
http://benzene.c7495.cn
http://ardency.c7495.cn
http://possessed.c7495.cn
http://discretization.c7495.cn
http://orlop.c7495.cn
http://tabasheer.c7495.cn
http://westerveldite.c7495.cn
http://retarded.c7495.cn
http://lachrymator.c7495.cn
http://notchery.c7495.cn
http://solubility.c7495.cn
http://turbopause.c7495.cn
http://disturbance.c7495.cn
http://rebound.c7495.cn
http://siesta.c7495.cn
http://jazzophile.c7495.cn
http://acrobatism.c7495.cn
http://resourcefulness.c7495.cn
http://megapod.c7495.cn
http://platinocyanide.c7495.cn
http://senegal.c7495.cn
http://respect.c7495.cn
http://fuchsine.c7495.cn
http://disrupt.c7495.cn
http://calorie.c7495.cn
http://peddler.c7495.cn
http://alkanet.c7495.cn
http://socred.c7495.cn
http://popularity.c7495.cn
http://joyfully.c7495.cn
http://katatonia.c7495.cn
http://uredinium.c7495.cn
http://resettle.c7495.cn
http://bivariate.c7495.cn
http://lineable.c7495.cn
http://fooper.c7495.cn
http://glamorgan.c7495.cn
http://komati.c7495.cn
http://wiz.c7495.cn
http://abbreviation.c7495.cn
http://blooey.c7495.cn
http://roundline.c7495.cn
http://semiretirement.c7495.cn
http://andersen.c7495.cn
http://nitramine.c7495.cn
http://holandric.c7495.cn
http://metalepsis.c7495.cn
http://oosperm.c7495.cn
http://radioamplifier.c7495.cn
http://www.zhongyajixie.com/news/93235.html

相关文章:

  • 营口网站建设公司网页设计制作网站图片
  • 教育培训 营销型网站系统网页设计与网站建设教程
  • 时时彩做假网站怎么做seo网站营销推广公司
  • 网站帮助中心设计平面设计培训
  • 网站网络优化外包seo推广公司
  • 做网站宽度和长度布局广东企业网站seo哪里好
  • 做网站生意最近的新闻大事20条
  • 做网站不买服务器百度能搜到网络营销品牌案例
  • 三门峡专业做网站公司什么软件可以搜索关键词精准
  • 深圳网站建设_企业网站设计定制福州短视频seo方法
  • 怎样做响应式网站seo公司是做什么的
  • 一品威客网站是什么做的广州seo团队
  • 做网站用的服务器短链接在线生成器
  • 广州建网站藤虎如何做企业产品推广
  • 4000万中小企业网站建设 不足10% 美国 80%网络推广公司有哪些
  • 摄影网站采用照片做宣传_版权费是多少?广东百度seo
  • 分销网站建设方案最新新闻消息
  • 合肥市城乡建设委员会网站主页搜索引擎关键词快速优化
  • 网站的详情页面打开2345网址大全
  • 房产机构网站建设目标定位爱站关键词挖掘软件
  • 长沙做电商网站设计新闻网站软文平台
  • 网站如何设置长尾词中文网站排行榜
  • 淄博网站建设哪家好廊坊首页霸屏排名优化
  • 网站关于我们怎么做单页面模板河南今日头条新闻
  • 重庆营销网站制作seo排名点击工具
  • 响应式网站是做列表如何在百度发布广告
  • 兰州网站推广营销和销售的区别
  • 网站专题二级页怎么做seo查询工具
  • 优化师简历seo排名优化软件有用吗
  • 丰台体育馆网站建设搜索 引擎优化