为什么服务器套接字不能继续?

时间:2012-11-01 03:30:06

标签: java sockets stream

我的大学工作应用程序..

DOC to PDF

==

我的服务器:

每个请购单一个帖子

        server = new ServerSocket(5000);

        while (true) {
            Socket cliente = server.accept();
            Thread thread = new Thread(new Requisitor(cliente));
            thread.start();
        }

我的班级Requisitor(跑步法)

@Override
public void run() {
    // receive doc binary
    receive();
    // doc to pdf
    Conversor converson = new Conversor(new File("docs/"+cliente.getInetAddress().getHostAddress()+".doc"),new File("pdfs/"+cliente.getInetAddress().getHostAddress()+".pdf"));
    converson.converter();
    //response pdf binary to client
    response();
}

但是方法receive()不会被调用..只有当我断开客户端套接字时。

我的客户端套接字:

    Client cliente = new Client();
    cliente.connect();
    cliente.send(); // send doc binary

    boolean flag = true;

    while (flag) {
        if(!cliente.streamIsEmpty()){ // wait for conversion
            cliente.receive(); // receive pdf
            flag = false;
        }
    }


    cliente.disconect()

我的接收方法

        InputStream in = cliente.getInputStream();
        BufferedInputStream stream = new BufferedInputStream(in);
        FileOutputStream out = new FileOutputStream("docs/"+cliente.getInetAddress().getHostAddress()+".doc");

        byte[] buffer = new byte[1024];
        int length = 0;

        while((length = stream.read(buffer, 0, 1024)) != -1) {
            out.write(buffer, 0, length);
        }

        out.flush();
        stream.close();

任何想法? :(

2 个答案:

答案 0 :(得分:1)

你的问题不清楚。看起来你有两个叫做receive的方法(一个在客户端,一个在服务器中)。你说"没有调用方法receive()"但你不能说一个人没有被召唤。

但有一点肯定是错的:

boolean flag = true;
while (flag) {
    if (!cliente.streamIsEmpty()) { // wait for conversion
        cliente.receive(); // receive pdf
        flag = false;
    }

您的代码正忙着等待,这很糟糕。此外,无需像那样等待。只需调用cliente.receive() ...将阻塞,直到某些内容到达......或服务器断开连接。

答案 1 :(得分:0)

这里读取直到读取流返回-1。当套接字关闭时会发生这种情况。尝试在写入文档后关闭cliente.send()(而不是整个套接字)中的OutputStream。

    while((length = stream.read(buffer, 0, 1024)) != -1) {
        out.write(buffer, 0, length);
    }