我通过一个方法来建立了一个socket连接,然后返回这个socket,然后把这个socket作为另一个方法的参数传递进去。在调用第二个方法的时候发现用isConnected()方法来检查socket连接的时候输出是true,但是一旦调用socket的其他方法,马上就会抛出异常:“java.net.SocketException: Socket is closed”。求解,谢谢!代码段如下:
第一个方法,创建socket并返回这个socket: private Socket connectFtp()
{
Socket ftp = null;
BufferedInputStream feeback = null;
int con = 0;
byte[] b = new byte[1000]; 
try
{
ftp = new Socket(ServerName,21,java.net.InetAddress.getLocalHost(),17951);
//输出返回信息
feeback = new BufferedInputStream(ftp.getInputStream());
con = feeback.read(b);  //con获取返回信息的长度
char[] c = new char[con];
for(int i=0;i<con;i++)   //把返回信息输出
{
c[i]=(char)b[i];
System.out.print(c[i]);
}
System.out.println("输出完成");
//输出完成后还原变量信息
con=0;
feeback.close();
return ftp;
}catch(Exception err)
{
if(ftp!=null)
{
try
{
ftp.close();
return null;
}catch (IOException e)
                {
                    e.printStackTrace();
                    return null;
                }
}
err.printStackTrace();
return null;
}
}
第二个方法,传入socket并调用socket中的方法:private void sendCommand(Socket ftp,String commandline)
{
Socket ftpServer = ftp;
DataOutputStream command = null; 
BufferedInputStream feeback =null;
int con = 0;
byte[] b = new byte[1000]; 
try{
System.out.println("IN_FTP"+ftpServer+"IS_Connected"+ftpServer.isConnected());
command = new DataOutputStream(ftpServer.getOutputStream());
command.writeBytes(commandline);
command.flush();

//输出返回信息
feeback = new BufferedInputStream(ftp.getInputStream());
con = feeback.read(b);  //con获取返回信息的长度
char[] c = new char[con];
for(int i=0;i<con;i++)   //把返回信息输出
{
c[i]=(char)b[i];
System.out.print(c[i]);
}
System.out.println("输出完成"); }catch(Exception err)
{
if(ftpServer!=null)
{
try
{
ftpServer.close();
}catch (IOException e)
                {
                    e.printStackTrace();
                }
}
if(command!=null)
{
try
{
command.close();
} catch (IOException e)
                {
                    e.printStackTrace();
                }
}
err.printStackTrace();
}
finally
{
if(ftpServer!=null)
{
try
{
ftpServer.close();
}catch (IOException e)
                {
                    e.printStackTrace();
                }
}
if(command!=null)
{
try
{
command.close();
} catch (IOException e)
                {
                    e.printStackTrace();
                }
}
}

}
调用这两个方法的片段如下:public void connect()
{
Socket ftp = connectFtp();
System.out.println("OUT_FTP"+ftp+"IS_Connected"+ftp.isConnected());
sendCommand(ftp,("USER "+UserName));
}
详细的输出信息如下:220-FTP server ready.
220 This is a private system - No anonymous login
输出完成
OUT_FTPSocket[addr=ftp.byethost22.com/209.190.85.248,port=21,localport=17951]IS_Connectedtrue
IN_FTPSocket[addr=ftp.byethost22.com/209.190.85.248,port=21,localport=17951]IS_Connectedtrue
java.net.SocketException: Socket is closed
at java.net.Socket.setKeepAlive(Socket.java:1153)
at com.MainFrame.sendCommand(MainFrame.java:604)
at com.MainFrame.connect(MainFrame.java:409)
at com.MainFrame$3.actionPerformed(MainFrame.java:137)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1849)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2169)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)
at javax.swing.AbstractButton.doClick(AbstractButton.java:302)
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:1051)
at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:1092)
at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:231)
at java.awt.Component.processMouseEvent(Component.java:5517)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3135)
at java.awt.Component.processEvent(Component.java:5282)
at java.awt.Container.processEvent(Container.java:1966)
at java.awt.Component.dispatchEventImpl(Component.java:3984)
at java.awt.Container.dispatchEventImpl(Container.java:2024)
at java.awt.Component.dispatchEvent(Component.java:3819)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3892)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)
at java.awt.Container.dispatchEventImpl(Container.java:2010)
at java.awt.Window.dispatchEventImpl(Window.java:1791)
at java.awt.Component.dispatchEvent(Component.java:3819)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)

解决方案 »

  1.   

    把Socket当做参数传递是完全可以的。楼主代码发的不全,不知道哪块出问题了。好像是MainFrame中调用Socket操作出问题了。
      

  2.   

    java里是对象的都可以当参数传
      

  3.   

    代码就是上面那些了,出错的那一句就是上面的第二段代码中的try里面的
    command = new DataOutputStream(ftpServer.getOutputStream());
    这一句,这一句报socket is closed,
    我在这一句前面加了一个输出,并且调用了ftpServer的isConnected()方法,输出是true,后一句便是上面的出错的那一句了,所以按理推socket应该可以传过来,但是调用它的方法的时候就说socket关闭了,我想问怎样才能传进一个没有关闭的socket,让我可以继续对这个socket操作。
      

  4.   

    Socket有没有close,不一定和你本地代码有关,对端socket关闭了,本地socket用 isClosed是检查不出来的
    实际上,isClosed函数不是检查socket状态的,它是检查你调用的 socket.close()是不是正常执行完毕了的。
    也就是说: isCLosed==true,只能表明你曾经成功的调用过这个socket的close方法。
    类似的,isConnected也只是表明,你曾经成功的调用过socket.connect()。
    而且,socket调用了close以后,是不能再调用 open,connect之类的,它不能做为简单的 SocketPool 这种东西来用。要用SocketPool,必须保证Pool里的socket都是保持连接的。
    从你的代码来看,好像是做FTP命令行,有可能对端FTP主动关闭了。所以,我觉得你还是在FTP协议上找找原因
      

  5.   

    本地参数传递可以传递任何java对象包括java基础类型;但对于网络传输对象必须实现序列化,负责不可传递;socket是没有事项序列化的,所以不可以进行网络传输!
      

  6.   

    LZ,你把输入流都关闭了,应该socket连接也应该关闭了
      

  7.   

    6楼对了,我删掉 feeback.close();这一句以后就可以在第二个方法里面使用socket了。4楼的解释的很详细,学习了。谢谢大家!