2011-11-12 81 views
0

我编写客户端 - 服务器应用程序。客户端在Android上,普通Java上的服务器上。我希望客户端与服务器建立连接,然后向他发送一些文件,然后服务器在服务器光盘上写入此文件,然后向客户端发送另一个文件。现在客户端建立连接然后发送文件到服务器,但这里开始出现问题。当我想要服务器发送文件给客户端时,我得到“套接字关闭”异常。android和套接字

这里是我的代码:

服务器:

public class ThreadHandler implements Runnable 
{ 
public ThreadHandler(Socket i) 
{ 
    sk = i; 
} 

public void run() 
{ 
    try 
    { 
     File file = getFile(); 
     ParseData data = parseXML(file); 

     if(data.getEvent().equals("registration")) 
     { 
      sendRegistrationResponse(); 
     } 
    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

public File getFile() throws Exception 
{ 
    File file=null; 

    InputStream input = sk.getInputStream(); 

    file = new File("C://protocolFile/" + "temp.xml"); 
    FileOutputStream out = new FileOutputStream(file); 

    byte[] buffer = new byte[sk.getReceiveBufferSize()]; 

    int bytesReceived = 0; 

    while((bytesReceived = input.read(buffer))>0) { 
     out.write(buffer,0,bytesReceived); 
    } 

    input.close(); 
    input = null; 
    out.flush(); 
    out.close(); 
    out = null; 
    System.gc(); 

    return file; 
} 

public void sendRegistrationResponse() throws Exception 
{ 
    String fileName = createRegistrationResponseXML(); 
    sendToApp(fileName); 
} 

public void sendToApp(String fileName) throws Exception 
{ 
    OutputStream output = sk.getOutputStream();  

    FileInputStream fileInputStream = new FileInputStream(fileName); 
    byte[] buffer = new byte[sk.getSendBufferSize()]; 
    int bytesRead = 0; 

    while((bytesRead = fileInputStream.read(buffer))>0) 
    { 
     output.write(buffer,0,bytesRead); 
    } 

    output.close(); 
    fileInputStream.close(); 
} 

} 

客户端:

public class AndroidProtokolActivity extends Activity { 

private File directory; 

XmlSerializer serializer = Xml.newSerializer(); 
StringWriter writer=new StringWriter();; 

Socket sk; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    directory = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "protocol"); 
    directory.mkdirs(); 
} 

public void fun(View view) 
{ 
    Log.i("======", "fun=============="); 
    try 
    { 
     sk = new Socket("55.555.555.555", 5555); 

     String registrationFile = createRegistrationXML(serializer); 
     sendToServer(registrationFile,sk); 
     getRegistrationXML(); 
    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

public void sendToServer(String file, Socket sk) throws Exception 
{ 
    Log.i("======", "sendToServer=============="); 
    OutputStream output = sk.getOutputStream();  

    String pathToOurFile = directory + File.separator + file; 

    FileInputStream fileInputStream = new FileInputStream(pathToOurFile); 
    byte[] buffer = new byte[sk.getSendBufferSize()]; 
    int bytesRead = 0; 

    while((bytesRead = fileInputStream.read(buffer))>0) 
    { 
     output.write(buffer,0,bytesRead); 
    } 

    output.close(); 
    fileInputStream.close(); 
} 

public File getRegistrationXML() throws Exception 
{ 
    Log.i("======", "getRegistrationXML=============="); 
    File file=null; 

    InputStream input = sk.getInputStream(); 

    file = new File(directory, "rejestracjaOdpowiedz.xml"); 
    FileOutputStream out = new FileOutputStream(file); 

    byte[] buffer = new byte[sk.getReceiveBufferSize()]; 

    int bytesReceived = 0; 

    while((bytesReceived = input.read(buffer))>0) { 
     out.write(buffer,0,bytesReceived); 
    } 

    input.close(); 
    input = null; 
    out.flush(); 
    out.close(); 
    out = null; 
    System.gc(); 

    return file; 
} 
} 

我从这个代码削减创建XML文件的功能。我在“OutputStream output = sk.getOutputStream();”上得到“java.net.SocketException:Socket is closed”在服务器端的函数“sendToApp”和“InputStream input = sk.getInputStream();”上的“java.net.SocketException:Socket is closed”在客户端的函数“getRegistrationXML”中的“getRegistrationXML”行中。我试图找出什么是错的,但我没有任何想法。你们中的任何人都知道这个代码是什么?谢谢你的帮助。

编辑:

此代码展示如何创建XML文件:

public String createRegistrationXML(XmlSerializer serializer) throws Exception 
{ 
    Log.i("======", "createRegistrationXML=============="); 
    XmlSerializer serializer = Xml.newSerializer(); 
    writer = new StringWriter(); 
    serializer.setOutput(writer); 

    serializer.startDocument("UTF-8", true); 
     serializer.startTag("", XMLTag); 
      serializer.startTag("", eventTag); 
       serializer.text(REGISTRATIONEVENT); 
      serializer.endTag("", eventTag); 
     serializer.endTag("", XMLTag); 
    serializer.endDocument(); 

    File outputFile = new File(directory, "file.xml"); 
    FileOutputStream fos = new FileOutputStream(outputFile); 
    OutputStreamWriter osw = new OutputStreamWriter(fos); 
    osw.write(writer.toString()); 
    osw.flush(); 
    osw.close(); 

    return "file.xml"; 
} 

回答

1

尽量不要单独关闭套接字的输入和输出流。全部完成后,关闭插座

+0

予删除流()(=与BytesReceived input.read(缓冲器)> 0)的每个靠近函数,然后服务器现在停留在”,而{ \t \t \t out.write(缓冲液,0,与BytesReceived); \t \t }“on”getFile“函数,但客户端卡在函数”getRegistrationXML“中。它看起来像(bytesReceived = input.read(buffer))总是大于0.请检查我在第一篇文章中如何在编辑中创建XML文件,也许存在我的问题 – klemens

+1

这是正确的:socket读*操作会阻塞直到收到数据,它不知道什么时候收到所有的数据,你可能需要一种方法将数据的末尾发送给接收器,这样它就会停止读取并开始发送 – JimmyB

+0

我注意到当我有线路输出时。关闭();“在”sendToServer“ 在客户端服务器dont stuce。你知道它的意思吗? – klemens