首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >android和sockets

android和sockets
EN

Stack Overflow用户
提问于 2011-11-13 02:06:32
回答 1查看 1.4K关注 0票数 0

我编写客户端-服务器应用程序。客户端在android上,服务器在纯Java上。我想让客户和服务器建立连接,然后给他发一些文件,然后服务器把这个文件写到服务器磁盘上,然后再把另一个文件发送给客户。现在,客户端建立连接,然后将文件发送到服务器,但这里开始出现问题。当我想要服务器向客户端发送文件时,我得到了"socket is close“异常。

下面是我的代码:

服务器:

代码语言:javascript
复制
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();
}

}

客户端:

代码语言:javascript
复制
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文件的函数。我在服务器端的函数"sendToApp“的"OutputStream output = sk.getOutputStream();”行得到"java.net.SocketException: Socket is closed“,在客户端的函数"getRegistrationXML”的“java.net.SocketException”行的"InputStream input = sk.getInputStream();“行得到"java.net.SocketException: Socket is closed”。我试着找出哪里出了问题,但我一点也不知道。你们中有谁知道这段代码有什么问题吗?谢谢你的帮助。

编辑:

下面的代码展示了如何创建XML文件:

代码语言:javascript
复制
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";
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-13 02:26:08

尽量不要单独关闭套接字的输入流和输出流。一切完成后,只需关闭套接字即可。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8106442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档