+ -
当前位置:首页 → 问答吧 → 菜鸟提问:如何中断一个正在构造的套接字?

菜鸟提问:如何中断一个正在构造的套接字?

时间:2011-11-07

来源:互联网

请问各位朋友,我用Socket s= new Socket(ip,host)方法建立连接。我想在它连接的过程中中断它。改如何操作呢?s.close()方法不行,因为在构造方法执行完之前,s是个空的引用。

作者: mr_orange_klj   发布时间: 2011-11-07

该回复于2011-11-07 11:22:35被版主删除

  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • fainfy
  • (long time no se)
  • 等 级:
#2楼 得分:0回复于:2011-11-07 11:31:16
Socket s= new Socket(ip,host);
只是构造了一个Socket对象,当然绝对不是一个空的。
s.connect();当调用这个方法的时候才真正去连接。如果没有连接成功,调用s.close()方法会出现异常。

作者: lxybelieve   发布时间: 2011-11-07

引用 2 楼 fainfy 的回复:
Socket s= new Socket(ip,host);
只是构造了一个Socket对象,当然绝对不是一个空的。
s.connect();当调用这个方法的时候才真正去连接。如果没有连接成功,调用s.close()方法会出现异常。

那即便是使用connext()方法去连接,这个方法也会阻塞进程。该怎样中断这个方法呢?因为是用分线程去进行连接操作的。调用线程的interrupt()方法没有作用。该怎么做呢?

作者: fainfy   发布时间: 2011-11-07

LZ是说根本不想连接是吗?我觉得你可以写一个自己的socket类,并继承自socket类。然后重载连接方法。

作者: mr_orange_klj   发布时间: 2011-11-07

引用 2 楼 fainfy 的回复:
Socket s= new Socket(ip,host);
只是构造了一个Socket对象,当然绝对不是一个空的。
s.connect();当调用这个方法的时候才真正去连接。如果没有连接成功,调用s.close()方法会出现异常。

socket带参的是自动连接的
需要手动调用 connect的是无参的

LZ,你无法中断他,中断是线程在阻塞等待下 为了让其放弃阻塞状态 或者为了给线程一个退出的标志使用的,socket的连接如何阻塞?

作者: jc8futao   发布时间: 2011-11-07

Socket s= new Socket(ip,host);
  这个是一直阻塞的
Socket 想终止线程 需要释放资源 interrupt 方法无效 ,因为是不可中断的阻塞

要么使用NIO 可以 阻塞

作者: shaosijun2004   发布时间: 2011-11-07

完全搞不懂楼主,你在执行connect()方法的时候既然要中断他,你又何必要去调用connect()方法让它去连接呢?

吃多了吧?

作者: zhao251021539   发布时间: 2011-11-07

引用 7 楼 fainfy 的回复:
完全搞不懂楼主,你在执行connect()方法的时候既然要中断他,你又何必要去调用connect()方法让它去连接呢?

吃多了吧?


如果链接上 就会阻塞 connect 是为了可以设置断开时间 setSoTimeOut

作者: fainfy   发布时间: 2011-11-07

引用 8 楼 zhao251021539 的回复:
引用 7 楼 fainfy 的回复:
完全搞不懂楼主,你在执行connect()方法的时候既然要中断他,你又何必要去调用connect()方法让它去连接呢?

吃多了吧?


如果链接上 就会阻塞 connect 是为了可以设置断开时间 setSoTimeOut


超时可以在socket上设置,
看了你的回复,的确IO是操作系统级的阻塞,学习了

看了7楼的回复,我也在想,LZ是什么目的?

作者: zhao251021539   发布时间: 2011-11-07

引用 8 楼 zhao251021539 的回复:

引用 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

引用 10 楼 fainfy 的回复:
引用 8 楼 zhao251021539 的回复:

引用 7 楼 fainfy 的回复:
完全搞不懂楼主,你在执行connect()方法的时候既然要中断他,你又何必要去调用connect()方法让它去连接呢?

吃多了吧?


如果链接上 就会阻塞 connect 是为了可以设置断开时间 setSoTimeOut

不对吧,应该是在连接中会阻塞吧。连接成功之后还会阻塞吗?
……

我的意思是,线程卡在连接服务器的过程中,我想让他中断。比如连接过程中,用户点击取消。我已经找到了解决方法,就是设一个标志。用户点击取消,就改变标志。而socket连接成功或失败后,按照标志来进行下一步操作。多谢你的回复。我没吃多。

作者: fainfy   发布时间: 2011-11-07

引用 9 楼 shaosijun2004 的回复:
引用 8 楼 zhao251021539 的回复:
引用 7 楼 fainfy 的回复:
完全搞不懂楼主,你在执行connect()方法的时候既然要中断他,你又何必要去调用connect()方法让它去连接呢?

吃多了吧?


如果链接上 就会阻塞 connect 是为了可以设置断开时间 setSoTimeOut


超时可以在socket上设置,
看了你的回复,的确IO是操……

我的意思是,线程卡在连接服务器的过程中,我想让他中断。比如连接过程中,用户点击取消。我已经找到了解决方法,就是设一个标志。用户点击取消,就改变标志。而socket连接成功或失败后,按照标志来进行下一步操作。多谢你的回复。我没吃多,只是比较菜鸟而已。

作者: mr_orange_klj   发布时间: 2011-11-07

引用 5 楼 shaosijun2004 的回复:
引用 2 楼 fainfy 的回复:
Socket s= new Socket(ip,host);
只是构造了一个Socket对象,当然绝对不是一个空的。
s.connect();当调用这个方法的时候才真正去连接。如果没有连接成功,调用s.close()方法会出现异常。

socket带参的是自动连接的
需要手动调用 connect的是无参的

LZ,你无法中断他,中断是线程在阻塞……

您说得对,设一个标志,我的问题就解决了。

作者: mr_orange_klj   发布时间: 2011-11-07