C# 主动断开Winform的Socket连接

qtempp 2011-02-08 11:47:43
公司有个项目,其中有个环节是获取某网页,但该网页不允许频繁访问,假设是2分钟只能5次.
在寻找解决方法时,无意发现用Chrome浏览器在测试5次后网页已拒接访问时,关闭浏览器重新打开后,却可以继续访问(没有清Cookie也没有换IP,而且没有过掉限定的时间),而IE 8却不行.
我记得好像浏览器在关闭时会去断开与网站的连接,那我怎么在我的Winform里模拟出这个效果,当然我把我的Winfrom关闭就可以了...
就是说在不关闭本窗口和也不借用另外的窗口来发数据的情况下,让每一次用HttpWebRequest请求网页时都是第一次时的效果(第一次访问耗时都会长一些,特别是国外的网站时和第二次相比会非常明显);
...全文
1149 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dobzhansky 2011-02-08
  • 打赏
  • 举报
回复
现在的 web 服务器默认采用的是 http 1.1, 而 1.1 的 http 连接是持久的,
如果你用 socket 进行 http 通讯,
要在每次交互后, 主动关闭连接
有2个选择
1. 在 http 请求中加入 Connection: Close 的头部, 这样服务器发送完响应后将关闭连接.
2. 根据头部的 content length , 读取完指定数量的响应后, 主动关闭 socket 连接.
xxbd123 2011-02-08
  • 打赏
  • 举报
回复
某网页 的网址。。。。可否??????
Alexsunmoon 2011-02-08
  • 打赏
  • 举报
回复
受教了。非常有意思。感谢
qtempp 2011-02-08
  • 打赏
  • 举报
回复
新情况...
我刚才说的第一个方法重新启用"本地连接"那个,虽然第一次连接有点神似(耗时!!!),但目标网页还是认出"我"来了,还得把Application关掉,重开才可以继续访问,只能这样子么... 纠结

如何模拟Application关闭(或者运行)的时候对连接做的处理啊...
qtempp 2011-02-08
  • 打赏
  • 举报
回复
首先,非常谢谢楼上几位,接着我说一下我尝试过的几个东西:

是不是这样子,应用程序第一次请求网页后,就和该网站建立了一条 Socket通道(?)直至应用程序关闭?

1.通过New一个子窗体发送数据并没有重新建立Socket通道,可能是Socket通道归Application了,所以不管是重新实例化都还是用同一个通道,即Application的Socket通道(Application.Restart是可以,不过那样数据都没了)
2.用Socket发送Http包来请求,该网页直接拒接.所以只能用HttpWebRequest(虽然这个内部也是用Socket,但不清楚多做了什么),而Connection: Close 在HttpWebRequest里是用 KeepAlive = false 来实现,也没效果.

如果在不关闭应用程序A的情况下做到每次发送数据都是第一次连接的效果(我是通过时间来判断的,第一次耗时比较长),我只想到2个方法:
1.重新启用"本地连接",那样会清空Socket池,Socket通道就全报废了.这样也会造成拨号掉线,影响到其他需要网络的应用程序,所以不是很可取.
2.通过应用程序B来发送数据,发完就Kill掉,再发就再运行一个.

都不是很优雅的方法~~~ T T

有些东西我也不知道叫什么,所以很不好去描述,希望高手们能看懂,我只希望有种方法能关闭掉一个Application建立起来的Socket,优雅点的...
wuyq11 2011-02-08
  • 打赏
  • 举报
回复
很多网站禁止频繁访问,还有会禁止访问
CLOSE重新实例化
application.Restart
Dobzhansky 2011-02-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 xxbd123 的回复:]

C HTTP访问 B
然后B 解析了以后反馈回C内容以后 他们的链接不是马上就断了吗??
[/Quote] 可能断, 也可能不马上断开,
取决于:
使用的 http 协议的版本(1.0 , 1.1)
客户端请求时是否指定了显式关闭的头部.

浏览器如何利用这些特性来加快加载速度是个设计问题.

当请求一个页面时, 由于包含图片, css, js 等外部文件,
所以请求一个页面其实是好几个 http 事务的,
这些事务是用多个连接, 还是使用一个持久连接,
还是组合起来使用, 是浏览器设计的内部问题.

对于用户来说不需要知道,
甚至对于 web 开发, 也不用知道.
xxbd123 2011-02-08
  • 打赏
  • 举报
回复
关于HTTP状态
求教
QQ 996625335 方便加一下吗
xxbd123 2011-02-08
  • 打赏
  • 举报
回复
C HTTP访问 B
然后B 解析了以后反馈回C内容以后 他们的链接不是马上就断了吗??
Dobzhansky 2011-02-08
  • 打赏
  • 举报
回复
你做个试验, 只用 GET HOST, 请求一个页面,
socket.Receive 在接受完后仍旧阻塞等待,

而加入 Connection: Close 的请求头部后,

receive 完毕后, 自动返回.
Dobzhansky 2011-02-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xxbd123 的回复:]

引用 1 楼 dobzhansky 的回复:
现在的 web 服务器默认采用的是 http 1.1, 而 1.1 的 http 连接是持久的,
如果你用 socket 进行 http 通讯,
要在每次交互后, 主动关闭连接
有2个选择
1. 在 http 请求中加入 Connection: Close 的头部, 这样服务器发送完响应后将关闭连接.
2. 根据头部的 content l……
[/Quote]是默认持久的, 但是没有状态信息保存的, 这个持久不是为了解决状态信息而设置的, 只是考虑到web请求常常是连续多次而设计的.
xxbd123 2011-02-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dobzhansky 的回复:]
现在的 web 服务器默认采用的是 http 1.1, 而 1.1 的 http 连接是持久的,
如果你用 socket 进行 http 通讯,
要在每次交互后, 主动关闭连接
有2个选择
1. 在 http 请求中加入 Connection: Close 的头部, 这样服务器发送完响应后将关闭连接.
2. 根据头部的 content length , 读取完指定数量的响应后, 主动关闭……
[/Quote]

HTTP1.1是持久的吗???HTTP不都是无状态通过cookies来中转的吗???

110,549

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧