菜鸟提问:如何中断一个正在构造的套接字?
时间:2011-11-07
来源:互联网
作者: mr_orange_klj 发布时间: 2011-11-07
该回复于2011-11-07 11:22:35被版主删除
- 对我有用[0]
- 丢个板砖[0]
- 引用
- 举报
- 管理
- TOP
|
#2楼 得分:0回复于:2011-11-07 11:31:16
|
作者: lxybelieve 发布时间: 2011-11-07
Socket s= new Socket(ip,host);
只是构造了一个Socket对象,当然绝对不是一个空的。
s.connect();当调用这个方法的时候才真正去连接。如果没有连接成功,调用s.close()方法会出现异常。
那即便是使用connext()方法去连接,这个方法也会阻塞进程。该怎样中断这个方法呢?因为是用分线程去进行连接操作的。调用线程的interrupt()方法没有作用。该怎么做呢?
作者: fainfy 发布时间: 2011-11-07
作者: mr_orange_klj 发布时间: 2011-11-07
Socket s= new Socket(ip,host);
只是构造了一个Socket对象,当然绝对不是一个空的。
s.connect();当调用这个方法的时候才真正去连接。如果没有连接成功,调用s.close()方法会出现异常。
socket带参的是自动连接的
需要手动调用 connect的是无参的
LZ,你无法中断他,中断是线程在阻塞等待下 为了让其放弃阻塞状态 或者为了给线程一个退出的标志使用的,socket的连接如何阻塞?
作者: jc8futao 发布时间: 2011-11-07
这个是一直阻塞的
Socket 想终止线程 需要释放资源 interrupt 方法无效 ,因为是不可中断的阻塞
要么使用NIO 可以 阻塞
作者: shaosijun2004 发布时间: 2011-11-07
吃多了吧?
作者: zhao251021539 发布时间: 2011-11-07
完全搞不懂楼主,你在执行connect()方法的时候既然要中断他,你又何必要去调用connect()方法让它去连接呢?
吃多了吧?
如果链接上 就会阻塞 connect 是为了可以设置断开时间 setSoTimeOut
作者: fainfy 发布时间: 2011-11-07
引用 7 楼 fainfy 的回复:
完全搞不懂楼主,你在执行connect()方法的时候既然要中断他,你又何必要去调用connect()方法让它去连接呢?
吃多了吧?
如果链接上 就会阻塞 connect 是为了可以设置断开时间 setSoTimeOut
超时可以在socket上设置,
看了你的回复,的确IO是操作系统级的阻塞,学习了
看了7楼的回复,我也在想,LZ是什么目的?
作者: zhao251021539 发布时间: 2011-11-07
引用 7 楼 fainfy 的回复:
完全搞不懂楼主,你在执行connect()方法的时候既然要中断他,你又何必要去调用connect()方法让它去连接呢?
吃多了吧?
如果链接上 就会阻塞 connect 是为了可以设置断开时间 setSoTimeOut
不对吧,应该是在连接中会阻塞吧。连接成功之后还会阻塞吗?
注:
Socket()
通过系统默认类型的 SocketImpl 创建未连接套接字
Socket(InetAddress address, int port)
创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
Socket(InetAddress host, int port, boolean stream)
已过时。 Use DatagramSocket instead for UDP transport.
Socket(InetAddress address, int port, InetAddress localAddr, int localPort)
创建一个套接字并将其连接到指定远程地址上的指定远程端口。
Socket(Proxy proxy)
创建一个未连接的套接字并指定代理类型(如果有),该代理不管其他设置如何都应被使用。
protected Socket(SocketImpl impl)
使用用户指定的 SocketImpl 创建一个未连接 Socket。
Socket(String host, int port)
创建一个流套接字并将其连接到指定主机上的指定端口号。
Socket(String host, int port, boolean stream)
已过时。 使用 DatagramSocket 取代 UDP 传输。
Socket(String host, int port, InetAddress localAddr, int localPort)
创建一个套接字并将其连接到指定远程主机上的指定远程端口。
当中标红的则是不会自动去连接的。
未标红的,可以看一下相应的构造函数,内部有调用connect()这个方法。
换句话说:如果不调用connect()这个套接字则不会去连接。
作者: shaosijun2004 发布时间: 2011-11-07
引用 8 楼 zhao251021539 的回复:
引用 7 楼 fainfy 的回复:
完全搞不懂楼主,你在执行connect()方法的时候既然要中断他,你又何必要去调用connect()方法让它去连接呢?
吃多了吧?
如果链接上 就会阻塞 connect 是为了可以设置断开时间 setSoTimeOut
不对吧,应该是在连接中会阻塞吧。连接成功之后还会阻塞吗?
……
我的意思是,线程卡在连接服务器的过程中,我想让他中断。比如连接过程中,用户点击取消。我已经找到了解决方法,就是设一个标志。用户点击取消,就改变标志。而socket连接成功或失败后,按照标志来进行下一步操作。多谢你的回复。我没吃多。
作者: fainfy 发布时间: 2011-11-07
引用 8 楼 zhao251021539 的回复:
引用 7 楼 fainfy 的回复:
完全搞不懂楼主,你在执行connect()方法的时候既然要中断他,你又何必要去调用connect()方法让它去连接呢?
吃多了吧?
如果链接上 就会阻塞 connect 是为了可以设置断开时间 setSoTimeOut
超时可以在socket上设置,
看了你的回复,的确IO是操……
我的意思是,线程卡在连接服务器的过程中,我想让他中断。比如连接过程中,用户点击取消。我已经找到了解决方法,就是设一个标志。用户点击取消,就改变标志。而socket连接成功或失败后,按照标志来进行下一步操作。多谢你的回复。我没吃多,只是比较菜鸟而已。
作者: mr_orange_klj 发布时间: 2011-11-07
引用 2 楼 fainfy 的回复:
Socket s= new Socket(ip,host);
只是构造了一个Socket对象,当然绝对不是一个空的。
s.connect();当调用这个方法的时候才真正去连接。如果没有连接成功,调用s.close()方法会出现异常。
socket带参的是自动连接的
需要手动调用 connect的是无参的
LZ,你无法中断他,中断是线程在阻塞……
您说得对,设一个标志,我的问题就解决了。
作者: mr_orange_klj 发布时间: 2011-11-07
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28