最近做了一个批量上传图书资源的swing,上传用到了socket,前几天在用此程序作批量上传的时候,服务端serverSocket没有启动,结果客户端这边还一直在运行着,结果服务器上一本图书也没有传上去。现在想做一个能检测服务端serverSocket是否已连接的检测程序,请问各位有谁了解这方面的socket操作的吗?急盼回复,谢谢。

解决方案 »

  1.   

    socket.isClosed(); // 返回套接字是否关闭
      

  2.   

    客户端socket怎样来检测服务端serverSocket是否是开着,
    socket.isClosed(); // 返回套接字是否关闭
    上面那个方法不是
      

  3.   

    ServerSocket如果没有启动,客户端的Socket是连接不上的,如果Server端负责和客户端通讯的Socket断掉的话客户端的Socket会抛出异常
      

  4.   

    我不明白你的客户端怎么会一直等着呢?如果服务端没有启动,客户端的socket建立时就会报错除非你的服务端是在防火墙后面,而防火墙封闭了这个端口,那在socket创建的时候错误返回会慢一点,不过也不可能一直在那里等着呀
      

  5.   

    嗯,由于服务端的服务器因为某种原因关掉了,所以在那台服务器上开的ServerSocket服务也自然被荡掉了,客户端开的是swing界面,没看出来抛出的异常,上传图书的进度条一直都在继续着,上传的人还以为是一直在传着呢,现在是想能不能在上传之前先通过检测来得知服务端的serverSocket是否开着。
    来查看客户端出现的异常是判断服务端是否已连上的一种办法,我试想能不能通过程序来检测到服务端是否已连上,不知道能不能做。
    谢谢楼上对此贴的指点,继续请教中...
      

  6.   

    你的信息发送不成功时没有做异常处理,所以会出现这样的问题。当信息发送不成功时,Socket会报异常。
      

  7.   

    Socket的所有操作都应该try...catch...一下
    只要服务段出现你说的情况,那基本上来说都会抛出异常,捕获到就知道服务段出问题了
    不过如果Socket已经建立,那么服务段网线断开或者突然终止程序(非正常退出),客户端的scoket在通过OutputStream发送数据时是不会发现异常的,数据仍然被发送到了系统缓冲,直到缓冲满了,阻塞住。
    这种情况一般通过接受服务段回执来解决。比如你把文件拆分成一个一个的报文发送,每次发送完毕一个报文,就通过InputStream来接收回执(哪怕只是服务端返回接受成功的一个标志)。当然在这之前要先设置socket的超时时间,如果接收超时了,也说明服务端出问题了。不知道你说的是不是这个意思
      

  8.   

    你的程序一定是
    try
    {
     ......
    }
    catch(Exception e)
    {}//空语句 
    这样虽然出错了不抛任何异常。自己骗自己呗
    所以至少在catch语句里面使用JOptionPane类来提示链接出错。
      

  9.   

    服务端没开你的客户端也能运行,真是牛叉
    若服务端没开你的客户端的socket肯定没办法初始化,捕捉个异常处理一下啊
      

  10.   

    public void connect(){
    try {
    sc = new Socket(host,port);
    /**/
    }catch(ConnectException e){
    System.out.println("服务器没有启动!");
    }
        //提示您:服务器没有启动
    catch (UnknownHostException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
      

  11.   

    public void connect(){
    try {
    sc = new Socket(host,port);
    /**/
    }catch(ConnectException e){
    System.out.println("服务器没有启动!");
    }
    catch (UnknownHostException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }